Files
Telegram-To-Discord-Bot/main.py
2022-09-04 19:28:08 +01:00

173 lines
6.8 KiB
Python

from telethon import TelegramClient, events
import aiohttp
import nextcord
import textwrap
import os
import requests
import json
import json5
import random
import validators
from dotenv import load_dotenv
load_dotenv()
path = os.path.join(os.path.dirname(__file__), 'config.json5')
with open(path) as fp:
config = json5.load(fp)
#print(json5.dumps(config))
appid = os.environ.get("APPID")
apihash = os.environ.get("APIHASH")
apiname = os.environ.get("APINAME")
dlloc = os.environ.get("DLLOC")
text_to_prepend=os.environ.get("TEXT_TO_PREPEND")
channels_avatars={}
#if input_channels_entities is not None:
# input_channels_entities = list(map(int, input_channels_entities.split(',')))
input_channels_entities=[]
for channel in config:
input_channels_entities.append(int(channel["TGchannelID"]))
async def imgurimg(mediafile): # Uploads image to imgur
url = "https://api.imgur.com/3/upload"
payload = {
'type': 'file'}
files = [
('image', open(mediafile, 'rb'))
]
headers = {
'Authorization': str(random.randint(1,10000000000))
}
response = requests.request("POST", url, headers=headers, data = payload, files = files)
return(json.loads(response.text))
async def imgur(mediafile): # Uploads video to imgur
url = "https://api.imgur.com/3/upload"
payload = {'album': 'ALBUMID',
'type': 'file',
'disable_audio': '0'}
files = [
('video', open(mediafile,'rb'))
]
headers = {
'Authorization': str(random.randint(1,10000000000))
}
response = requests.request("POST", url, headers=headers, data = payload, files = files)
return(json.loads(response.text))
def start():
client = TelegramClient(apiname,
appid,
apihash)
client.start()
print('Started')
print('Listenning to the following Telegram Channels: '+str(input_channels_entities))
@client.on(events.NewMessage(chats=input_channels_entities))
async def handler(event):
channelID=str(event.chat.id)
for channel in config:
if str(channel["TGchannelID"]) == channelID:
senderAvatarUrl=channel["senderAvatarUrl"]
senderName=channel["senderName"]
DiscordWebhooks=channel["discordWebhooks"]
if DiscordWebhooks is None:
print('channel (id:'+channelID+') not configured correctly, please check the config.json5 file')
return
if not senderName or senderName is None or senderName=='':
senderName=event.chat.title
if(senderAvatarUrl is not None and validators.url(senderAvatarUrl)):
channels_avatars[channelID]=senderAvatarUrl
channelAvatarUrl=senderAvatarUrl
else:
#Checking if the channel avatar is already in the avatar list
if(channelID in channels_avatars):
channelAvatarUrl=channels_avatars[channelID]
else: # if not we download it and upload it to imgur (since discord accept only avartar urls)
channel = await client.get_entity(event.chat.id)
channelAvatar = await client.download_profile_photo(channel,dlloc, download_big=False)
channelAvatarUrl=await imgurimg(channelAvatar)
os.remove(channelAvatar)
channelAvatarUrl = channelAvatarUrl['data']['link']
channels_avatars[channelID]=channelAvatarUrl # we store it on the channels avatars array so we can use it another time without reuploading to imgur
msg = event.message.message
#Looking for href urls in the text message and appending them to the message
try:
for entity in event.message.entities:
if ('MessageEntityTextUrl' in type(entity).__name__):
msg +=f"\n\n{entity.url}"
except:
print("no url captured, forwording message")
if event.message.media is not None:
if('MessageMediaWebPage' in type(event.message.media).__name__):# directly send message if the media attached is a webpage embed
for webhookUrl in DiscordWebhooks:
await send_to_webhook(msg,senderName,channelAvatarUrl,webhookUrl)
else:
dur = event.message.file.duration # Get duration
if dur is None:
dur=1 # Set duration to 1 if media has no duration ex. photo
# If duration is greater than 60 seconds or file size is greater than 200MB
if dur>60 or event.message.file.size > 209715201: # Duration greater than 60s send link to media
print('Media too long!')
msg +=f"\n\nLink to Video: https://t.me/c/{event.chat.id}/{event.message.id}"
for webhookUrl in DiscordWebhooks:
await send_to_webhook(msg,senderName,channelAvatarUrl,webhookUrl)
return
else: # Duration less than 60s send media
path = await event.message.download_media(dlloc)
for webhookUrl in DiscordWebhooks:
await pic(path,msg,senderName,channelAvatarUrl,webhookUrl)
os.remove(path)
else: # No media text message
for webhookUrl in DiscordWebhooks:
await send_to_webhook(msg,senderName,channelAvatarUrl,webhookUrl)
client.run_until_disconnected()
async def pic(filem,message,username,channelAvatarUrl,webhookUrl): # Send media to webhook
if(text_to_prepend is not None):
message=text_to_prepend+message
async with aiohttp.ClientSession() as session:
print('Sending w media')
webhook = nextcord.Webhook.from_url(webhookUrl, session=session)
try: # Try sending to discord
f = nextcord.File(filem)
await webhook.send(file=f,username=username,avatar_url=channelAvatarUrl)
except: # If it fails upload to imgur
print('File too big, uploading to imgur')
try:
image = await imgur(filem) # Upload to imgur
#print(image)
image = image['data']['link']
print(f'Imgur: {image}')
await webhook.send(content=image,username=username,avatar_url=channelAvatarUrl) # Send imgur link to discord
except Exception as ee:
print(f'Error {ee.args}')
for line in textwrap.wrap(message, 2000, replace_whitespace=False): # Send message to discord
await webhook.send(content=line,username=username,avatar_url=channelAvatarUrl)
async def send_to_webhook(message,username,channelAvatarUrl,webhookUrl): # Send message to webhook
if(text_to_prepend is not None):
message=text_to_prepend+message
async with aiohttp.ClientSession() as session:
print('Sending w/o media')
webhook = nextcord.Webhook.from_url(webhookUrl, session=session)
for line in textwrap.wrap(message, 2000, replace_whitespace=False): # Send message to discord
await webhook.send(content=line,username=username,avatar_url=channelAvatarUrl)
if __name__ == "__main__":
start()