Расмотрим сегодня несколько примеров для работы с telethon.
Основные правила которые желательно выполнить перед его использованием:
- используйте не основной аккаунт, во избежания бана
- ознакомитесь с лимитами телеграма
Небольшая предыстория, использовал telethon для пересылки всех сообщений с группы, из-за незнания лимитов телеграмма быстро получил ограничение, через время получил бан.
Потом стал умнее и начал делать паузы в выполнениях скрипта, особенно когда пересылка уже больше 2000 сообщений (тут делаем паузу в часах). После этого проблема исчезла.
Первый этап — регистрация и получение api.
https://my.telegram.org/auth – вводим номер, получаем код и переходим на адрес https://my.telegram.org/apps . Здесь вводим произвольные данные и попадаем на страницу с заветными api_id, api_hash, которые нам понадобятся в дальнейшем.
Теперь будем работать с библиотекой telethon. Установка.
pip install telethon
Telethon отправка сообщения себе в избранное.
from telethon import TelegramClient api_id = 444444 api_hash = "6sd5df456ds4f65f46d54sd" name = 'test1' client = TelegramClient(name,api_id, api_hash) client.start() async def main(): await client.send_message('me', 'Hello world') with client: client.loop.run_until_complete(main())
При подключении запросит телефон, код, после выполнит код программы. Сеанс будет сохранен в файл test1 и при его перезапуске авторизация больше не потребуется.
Отправка сообщения в группу с помощью telethon, аналогично коду выше, только изменить строку.
await client.send_message('https://t.me/testsendtele', 'Hello world')
Отправка файла используя telethon на свой канал
await client.send_file('https://t.me/testsendtele', 'telethon.pdf')
Можно прикрепить к отправляемому файлу картинку(я выбираю размер 100*100)
await client.send_file('https://t.me/testsendtele', '3.txt', thumb='100.jpg')
Отправка больших файлов с progressbar для отслеживания прогресса задачи в telethon
from telethon import TelegramClient, events, sync import sys import time import asyncio import aiohttp api_id = 54263524 api_hash = "v6fs546s4f6ds4f54v5v5v5v5v5" name = 'test1' client = TelegramClient(name,api_id, api_hash) client.start() def callback(current, total): print('Uploaded', current, 'out of', total, 'bytes: {:.2%}'.format(current / total)) client.send_file('https://t.me/testsendtele', 'testbig_file.bin', progress_callback=callback)
Теперь отправим видео файл при помощи telethon.
Здесь немного сложнее: видео может быть отправлено в виде обычного файла, но поддержка онлайн-потоковой трансляции не будет доступна. Чтобы отправить видео, необходимо указать несколько параметров, продолжительность, разрешение, а также то, что оно может быть воспроизведено в потоке.
В этом нам поможет утилита hachoir. Установим её.
pip install hachoir
Данная программа определит все нужные нам параметры видео и сообщит их telethon для отправки. Также добавим прогрессбар для наглядности.
from telethon import TelegramClient, events, sync from telethon.tl.types import DocumentAttributeVideo from hachoir.metadata import extractMetadata from hachoir.parser import createParser api_id = 35353535 api_hash = "fskjh4hk4ho54541fd5446dsf51g65d" client = TelegramClient('test1', api_id, api_hash) client.start() filename = 'video.mp4' metadata = extractMetadata(createParser(filename)) d = metadata.get('duration').seconds w = metadata.get('width') h = metadata.get('height') def callback(current, total): print('Uploaded', current, 'out of', total, 'bytes: {:.2%}'.format(current / total)) client.send_file('https://t.me/testsendtele', filename, attributes=(DocumentAttributeVideo(d, w, h, supports_streaming=True),), progress_callback=callback)
Давайте скачаем все медиа файлы в частном канале (нужно узнать его id), предварительно установив tqdm и cryptg
pip install cryptg pip install tqdm
from telethon import TelegramClient, events, sync from tqdm import tqdm import sys import time import asyncio import aiohttp api_id = 4546885 api_hash = "jsdfjslfj355664l5j5lk4j4l54j" name = 'test1' client = TelegramClient(name,api_id, api_hash) client.start() def callback(current, total): print('Uploaded', current, 'out of', total, 'bytes: {:.2%}'.format(current / total)) channel_username = -1001553634523 msgs = client.get_messages(channel_username, limit=100) print(msgs) for msgs in tqdm(msgs): msgs.download_media(progress_callback=callback)
В завершении пересылаем сообщения из одного канала на другой в telethon. В коде указанны таймеры задержек, советую делать перерыв в 1-2 часа после пересылки 2000 сообщений. Код forward message telethon:
from telethon.sync import TelegramClient from telethon.tl.types import MessageService import time otkuda = -4555555 kuda = -999999999 api_id = 255252525 api_hash = "53e6fsd45f64dsf6dsf4" name = 'test1' count = 0 with TelegramClient(name, api_id, api_hash) as client: amount_forwarded = 0 for message in client.iter_messages(otkuda, reverse=True): if isinstance(message, MessageService): continue try: count += 1 print(count) client.send_message(kuda, message) amount_forwarded += 1 time.sleep(1) if amount_forwarded >= 20: time.sleep(1) amount_forwarded = 0 ttime = time.strftime("%d.%m.%Y %H:%M:%S") print('Текущее время дата ' + ttime) time.sleep(62) except Exception as e: print(e)
Для продолжения на месте с которого остановились, нужно добавить id сообщения на котором закончили. Просто замените кусок кода
with TelegramClient(name, api_id, api_hash) as client: amount_forwarded = 0 cur_id = 438 for message in client.iter_messages(otkuda, offset_id = cur_id, reverse=True): if isinstance(message, MessageService): continue
Пересылка новых постов с разных каналов при помощь telethon
from telethon import types from telethon import TelegramClient, events api_id = 23232323 api_hash = "s54df6ds4f6d4fdsf45f6ds46f4" name = 'test1' client = TelegramClient(name, api_id, api_hash) # логинимся client.start() # список каналов, откуда будем брать посты @client.on( events.NewMessage(chats=["seds33ddd4d", 'https://t.me/skdjfhkljads454hfkjd', 'https://t.me/skdjfhkl55555jadshfkjd'])) async def normal_handler(event): if isinstance(event.chat, types.Channel): username = event.chat.username # получаем юзернейм канала, откуда забрали пост rdy = "@" + str(username) await client.send_message("https://t.me/joinchat/tgXBdQSrmOk3YmYy", rdy) # будет отправлять инфу, о том, с какого канала получен пост await client.send_message("https://t.me/joinchat/TSPUmYTRspI4NjZi", event.message) # отправка поста в канал client.run_until_disconnected()
Мне приходилось выполнять код в colab от гугл и были проблемы с базой данных, конкретно с созданием новой сессии. Вопрос я решал следующим образом.
import os SESSION_NAME = 'test1' if f"{SESSION_NAME}.session" in os.listdir(): os.remove(f"{SESSION_NAME}.session") api_id = 232323 api_hash = '6+sd+6f5sdd33d3d3d3d' client = TelegramClient('test1', api_id, api_hash) client.start() дальше код как обычно
Полезная информация:
ссылка на ресурс где описаны комманды