Расмотрим сегодня несколько примеров для работы с 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()
дальше код как обычно
Полезная информация:
ссылка на ресурс где описаны комманды