Python скрипт для загрузки всех медиафайлов из канала Telegram с помощью Telethon - PullRequest
0 голосов
/ 03 августа 2020

Я пытался использовать Telethon, но оказалось, что он очень медленный. У меня следующие ошибки. Может ли кто-нибудь помочь мне?

Вот мой код:

from telethon.sync import TelegramClient
from FastTelethon import download_file
import os
import asyncio


async def getAllMediaFromchannel():
    os.chdir("/home/gtxtreme/Documents/McHumour")
    api_hash = "<hidden>"
    api_id = <hidden>

    client = TelegramClient('MCHumour', api_id, api_hash)
    client.start()
    ch_entity = await client.get_entity("telegram.me/joinchat/AAAAAEXnb4jK7xyU1SfAsw")

    messages = client.iter_messages(ch_entity, limit=50)

    def progress_cb(current, total):
        print('Uploaded', current, 'out of', total,
              'bytes: {:.5%}'.format(current / total))

    async for msg in messages:
        result = await download_file(client, msg.document, "/home/gtxtreme/Documents/McHumour",
                                     progress_callback=progress_cb)
        print("*************************\nFile named {0} saved to {1} successfully\n********************".format(
            msg.message, result))


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(getAllMediaFromchannel())

Вот моя ошибка

[gtxtreme@archlinux ~]$ python PycharmProjects/python_gtxtreme/tgBotrev1.py 

PycharmProjects/python_gtxtreme/tgBotrev1.py:13: RuntimeWarning: coroutine 'AuthMethods._start' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
Traceback (most recent call last):
  File "PycharmProjects/python_gtxtreme/tgBotrev1.py", line 31, in <module>
    loop.run_until_complete(getAllMediaFromchannel())
  File "/usr/lib/python3.8/asyncio/base_events.py", line 612, in run_until_complete
    return future.result()
  File "PycharmProjects/python_gtxtreme/tgBotrev1.py", line 14, in getAllMediaFromchannel
    ch_entity = await client.get_entity("telegram.me/joinchat/AAAAAEXnb4jK7xyU1SfAsw")
  File "/usr/lib/python3.8/site-packages/telethon/client/users.py", line 310, in get_entity
    result.append(await self._get_entity_from_string(x))
  File "/usr/lib/python3.8/site-packages/telethon/client/users.py", line 512, in _get_entity_from_string
    invite = await self(
  File "/usr/lib/python3.8/site-packages/telethon/client/users.py", line 30, in __call__
    return await self._call(self._sender, request, ordered=ordered)
  File "/usr/lib/python3.8/site-packages/telethon/client/users.py", line 56, in _call
    future = sender.send(request, ordered=ordered)
  File "/usr/lib/python3.8/site-packages/telethon/network/mtprotosender.py", line 170, in send
    raise ConnectionError('Cannot send requests while disconnected')
ConnectionError: Cannot send requests while disconnected

[gtxtreme@archlinux ~]$

Также было бы предпочтительнее любой другой подходящий способ сделать это

1 Ответ

0 голосов
/ 04 августа 2020

client.start - это асинхронный c метод, поэтому вы должны ждать его.

ему нужно только await, если он находится внутри функции. если вы вызываете его вне функции, телемарафон неявно добавляет ожидание для удобства

...