DzenIT

HOME ZEN IT SOFT APK LIVE GAME OTHER W CONTACT SEARCH

Telethon заметки

Расмотрим сегодня несколько примеров для работы с telethon.

Основные правила которые желательно выполнить перед его использованием:

- используйте не основной аккаунт, во избежания бана

- ознакомитесь с лимитами телеграма

Небольшая предыстория, использовал telethon для пересылки всех сообщений с группы, из-за незнания лимитов телеграмма быстро получил ограничение, через время получил бан.

Потом стал умнее и начал делать паузы в выполнениях скрипта, особенно когда пересылка уже больше 2000 сообщений (тут делаем паузу в часах). После этого проблема исчезла.

Первый этап — регистрация и получение api.

https://my.telegram.org/auth – вводим номер, получаем код и переходим на адрес https://my.telegram.org/apps . Здесь вводим произвольные данные и попадаем на страницу с заветными api_id, api_hash, которые нам понадобятся в дальнейшем.


telegram telethon  api_id api_hash


telegram telethon  api_id api_hash


telegram telethon  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)

progressbar telethon

Теперь отправим видео файл при помощи 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()
дальше код как обычно
Посмотреть код
code

Полезная информация:

документация в pdf telethon

ссылка на ресурс где описаны комманды

лимиты телеграмм в xlsx