Telethon Python异步IO类型错误:';协同程序';对象不可调用

Telethon Python异步IO类型错误:';协同程序';对象不可调用,python,telethon,Python,Telethon,您需要获得有关频道、聊天室和群组的信息。 由于每个帐户都有接收信息的限制,因此我将使用几个帐户。 我正在尝试获取信息,但出现错误: Traceback (most recent call last): File "D:/Git/telegram/telegram_new.py", line 50, in parse_entity channel=entity TypeError: 'coroutine' object is not callable During handling

您需要获得有关频道、聊天室和群组的信息。 由于每个帐户都有接收信息的限制,因此我将使用几个帐户。 我正在尝试获取信息,但出现错误:

 Traceback (most recent call last):
  File "D:/Git/telegram/telegram_new.py", line 50, in parse_entity
    channel=entity
TypeError: 'coroutine' object is not callable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/Git/telegram/telegram_new.py", line 56, in parse_entity
    id=entity
TypeError: 'coroutine' object is not callable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/Git/telegram/telegram_new.py", line 60, in parse_entity
    chat_id=entity
TypeError: 'coroutine' object is not callable
帮助修复错误

代码:

在我的区域论坛上,没有人可以帮助我,所以我在这里写作,因为英语社区更多,有人可以帮助我

更新

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/Git/telegram/telegram_new.py", line 54, in parse_entity
    result = client(functions.users.GetFullUserRequest(id=entity))
TypeError: 'coroutine' object is not callable
更新2

future: <Task finished coro=<parse_entity() done, defined at D:/Git/telegram/telegram_new.py:45> exception=RuntimeError('coroutine is being awaited already')>
未来:
更新3

Traceback (most recent call last):
  File "D:/Git/telegram/telegram_new.py", line 95, in <module>
    loop.run_until_complete(start_main(numbers))
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 568, in run_until_complete
    return future.result()
  File "D:/Git/telegram/telegram_new.py", line 86, in start_main
    await crawl(initial_future)
  File "D:/Git/telegram/telegram_new.py", line 75, in crawl
    for client in asyncio.as_completed([await create_client(number) for number in numbers]):
  File "C:\ProgramData\Anaconda3\lib\asyncio\tasks.py", line 505, in as_completed
    todo = {ensure_future(f, loop=loop) for f in set(fs)}
  File "C:\ProgramData\Anaconda3\lib\asyncio\tasks.py", line 505, in <setcomp>
    todo = {ensure_future(f, loop=loop) for f in set(fs)}
  File "C:\ProgramData\Anaconda3\lib\asyncio\tasks.py", line 588, in ensure_future
    raise TypeError('An asyncio.Future, a coroutine or an awaitable is '
TypeError: An asyncio.Future, a coroutine or an awaitable is required
2018-12-27 18:14:49,534 ERROR:Task was destroyed but it is pending!
task: <Task pending coro=<UpdateMethods._update_loop() running at C:\ProgramData\Anaconda3\lib\site-packages\telethon\client\updates.py:215> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001A379824108>()]>>
2018-12-27 18:14:49,534 ERROR:Task was destroyed but it is pending!
task: <Task pending coro=<MTProtoSender._send_loop() running at C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\mtprotosender.py:375> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001A379824138>()]>>
2018-12-27 18:14:49,534 ERROR:Task was destroyed but it is pending!
task: <Task pending coro=<MTProtoSender._recv_loop() running at C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\mtprotosender.py:413> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001A3798242B8>()]>>
Exception ignored in: <coroutine object MTProtoSender._recv_loop at 0x000001A37980A948>
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\mtprotosender.py", line 413, in _recv_loop
  File "C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py", line 123, in recv
  File "C:\ProgramData\Anaconda3\lib\asyncio\queues.py", line 161, in get
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 672, in call_soon
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 461, in _check_closed
RuntimeError: Event loop is closed
2018-12-27 18:14:49,534 ERROR:Task was destroyed but it is pending!
task: <Task pending coro=<Connection._send_loop() running at C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py:135> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001A379824228>()]>>
2018-12-27 18:14:49,534 ERROR:Task was destroyed but it is pending!
task: <Task pending coro=<Connection._recv_loop() running at C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py:150> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001A379824288>()]>>
2018-12-27 18:14:49,535 ERROR:Unexpected exception in the send loop
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\asyncio\queues.py", line 159, in get
    await getter
GeneratorExit

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py", line 135, in _send_loop
    self._send(await self._send_queue.get())
  File "C:\ProgramData\Anaconda3\lib\asyncio\queues.py", line 161, in get
    getter.cancel()  # Just in case getter is not done yet.
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 672, in call_soon
    self._check_closed()
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 461, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Exception ignored in: <coroutine object Connection._send_loop at 0x000001A37980AA48>
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py", line 142, in _send_loop
  File "C:\ProgramData\Anaconda3\lib\site-packages\telethon\network\connection\connection.py", line 94, in disconnect
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 672, in call_soon
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 461, in _check_closed
RuntimeError: Event loop is closed
回溯(最近一次呼叫最后一次):
文件“D:/Git/telegram/telegram_new.py”,第95行,in
循环。运行直到完成(启动主(数字))
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第568行,在运行中直到完成
返回future.result()
文件“D:/Git/telegram/telegram\u new.py”,第86行,在start\u main中
等待爬网(最初的未来)
文件“D:/Git/telegram/telegram_new.py”,第75行,爬行
对于异步IO中的客户端。完成时([等待创建\u客户端(数字)以获取数字中的数字]):
文件“C:\ProgramData\Anaconda3\lib\asyncio\tasks.py”,第505行,在完成时
todo={确保集合(fs)中f的未来(f,loop=loop)}
文件“C:\ProgramData\Anaconda3\lib\asyncio\tasks.py”,第505行,在
todo={确保集合(fs)中f的未来(f,loop=loop)}
文件“C:\ProgramData\Anaconda3\lib\asyncio\tasks.py”,第588行,将来
raise TypeError('异步IO.Future、协同程序或可等待的is'
TypeError:需要asyncio.Future、协程或可等待的
2018-12-27 18:14:49534错误:任务已销毁,但挂起!
任务:
2018-12-27 18:14:49534错误:任务已销毁,但挂起!
任务:
2018-12-27 18:14:49534错误:任务已销毁,但挂起!
任务:
在中忽略异常:
回溯(最近一次呼叫最后一次):
文件“C:\ProgramData\Anaconda3\lib\site packages\telethon\network\mtprotosender.py”,第413行,在\u recv\u循环中
recv中的文件“C:\ProgramData\Anaconda3\lib\site packages\telethon\network\connection\connection.py”,第123行
get中第161行的文件“C:\ProgramData\Anaconda3\lib\asyncio\queues.py”
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第672行,即将调用
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第461行,在\u check\u closed中
RuntimeError:事件循环已关闭
2018-12-27 18:14:49534错误:任务已销毁,但挂起!
任务:
2018-12-27 18:14:49534错误:任务已销毁,但挂起!
任务:
2018-12-27 18:14:49535错误:发送循环中出现意外异常
回溯(最近一次呼叫最后一次):
get中第159行的文件“C:\ProgramData\Anaconda3\lib\asyncio\queues.py”
等待获得者
发电退出
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“C:\ProgramData\Anaconda3\lib\site packages\telethon\network\connection\connection.py”,第135行,在发送循环中
self.\u发送(等待self.\u发送\u队列.get())
get中第161行的文件“C:\ProgramData\Anaconda3\lib\asyncio\queues.py”
getter.cancel()#以防getter尚未完成。
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第672行,即将调用
自我检查关闭()
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第461行,在\u check\u closed中
raise RUNTIMERROR('事件循环已关闭')
RuntimeError:事件循环已关闭
在中忽略异常:
回溯(最近一次呼叫最后一次):
文件“C:\ProgramData\Anaconda3\lib\site packages\telethon\network\connection\connection.py”,第142行,在发送循环中
文件“C:\ProgramData\Anaconda3\lib\site packages\telethon\network\connection\connection.py”,第94行,断开连接
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第672行,即将调用
文件“C:\ProgramData\Anaconda3\lib\asyncio\base\u events.py”,第461行,在\u check\u closed中
RuntimeError:事件循环已关闭

因为
电报客户端.start
是一个异步函数,您必须等待它:

async def create_client(number):
    return await TelegramClient(number, api_id, api_hash).start()
我对您的代码做了两个显著的更改:

  • 包装
    create\u client(number)
    调用
    asyncio.as\u completed
    。原因是
    create\u client(number)
    返回一个协同程序对象,但是
    asyncio。as\u completed
    需要一个未来列表。以下是
    as\u completed
    docstring:
  • 完成时(fs,*,循环=无,超时=无) 返回一个迭代器,其值为协程

    When waiting for the yielded coroutines you'll get the results (or
    exceptions!) of the original Futures (or coroutines), in the order
    in which and as soon as they complete.
    
    This differs from PEP 3148; the proper way to use this is:
    
        for f in as_completed(fs):
            result = await f  # The 'await' may raise.
            # Use result.
    
  • loop.close()
    更改为
    loop.stop()
    。否则,将关闭循环,并且当仍有正在运行的任务时,将出现异常
  • 以下是我如何编辑您的代码以使其正常工作:

    import logging
    from telethon import TelegramClient,sync, utils, errors
    from telethon.tl.types import PeerUser, PeerChat
    from telethon import functions, types
    import pandas as pd
    import time
    import re
    import asyncio
    from contextlib import suppress
    import traceback
    
    log = logging.getLogger(__name__)
    format = '%(asctime)s %(levelname)s:%(message)s'
    logging.basicConfig(format=format, level=logging.INFO)
    
    api_id = ""
    api_hash = ""
    
    filename_excel = "project_for_export_no_formulas_31_10_18.xlsx"
    filename_numbers = "number.txt"
    
    queue_entity = asyncio.Queue()
    numbers = []
    count_thread = 8
    
    def load_numbers(filename):
        with open(filename, "r") as file:
            content = file.read().split("\n")
            for conten in content:
                numbers.append(conten)
    
    def load_excel(output_filename):
        data = pd.read_excel(output_filename, 'Projects', dtype=str)
        for item in data["Telegram link"]:
            if item != "nan":
                queue_entity.put_nowait(item)
    
    
    async def create_client(number):
        return await TelegramClient(number, api_id, api_hash).start()
    
    async def parse_entity(entity, client):
        result = None
        try:
            result = client(functions.channels.GetFullChannelRequest(
                    channel=entity
                ))
            print("Успешно")
        except TypeError:
            try:
                result = client(functions.users.GetFullUserRequest(
                    id=entity
                ))
            except TypeError:
                result = client(functions.messages.GetFullChatRequest(
                    chat_id=entity
                ))
        except errors.UsernameInvalidError:
            print("Не найден пользователь, канал или чат")
        except errors.InviteHashExpiredError:
            print("Чата больше нет")
        except errors.InviteHashInvalidError:
            print("Ссылка приглашения не валидна")
        except ValueError:
            print("Невозможно получить entity. Для начала нужно вступить в группу или чат")
        except errors.FloodWaitError:
            print("Ожидание суток")
        return result
    
    
    async def crawl(future):
        futures = []
        numbers = await future
        for f in asyncio.as_completed([asyncio.ensure_future(create_client(number)) for number in numbers]):
            client = await f
            while queue_entity.qsize() > 0:
                futures.append(asyncio.ensure_future(parse_entity(queue_entity.get_nowait(), client)))
        if futures:
            await asyncio.wait(futures)
    
    async def start_main(root):
        loop = asyncio.get_event_loop()
        initial_future = loop.create_future()
        initial_future.set_result(root)
        await crawl(initial_future)
    
    if __name__ == '__main__':
        start = time.time()
        load_numbers(filename_numbers) #Загрузка телефонов
        #load_excel(filename_excel)     #Загрузка Excel
        loop = asyncio.get_event_loop()
        # loop.set_debug(True)
        try:
            loop.run_until_complete(start_main(numbers))
        except KeyboardInterrupt:
            for task in asyncio.Task.all_tasks():
                task.cancel()
                with suppress(asyncio.CancelledError):
                    loop.run_until_complete(task)
        finally:
            loop.stop()
        log.info("Time work: %s", time.time() - start)
    

    我希望它能有所帮助。

    我以前尝试过,但此错误无法修复您的代码。您的第二次修订并没有解决此问题。在更新的底部添加了一个当前错误question@danilshik您是否准确地应用了我的更改?我将
    client
    参数重命名为
    client\u coroutine
    并添加了
    client=wait client\u corout将ine
    添加到您的func。这些更改可以正常工作。是的,我更改了此部分,但没有出现错误disappear@MehduSadeghi当添加wait来创建_客户机(number)时,它会给出一个错误,我在更新2中指出了这一点
    import logging
    from telethon import TelegramClient,sync, utils, errors
    from telethon.tl.types import PeerUser, PeerChat
    from telethon import functions, types
    import pandas as pd
    import time
    import re
    import asyncio
    from contextlib import suppress
    import traceback
    
    log = logging.getLogger(__name__)
    format = '%(asctime)s %(levelname)s:%(message)s'
    logging.basicConfig(format=format, level=logging.INFO)
    
    api_id = ""
    api_hash = ""
    
    filename_excel = "project_for_export_no_formulas_31_10_18.xlsx"
    filename_numbers = "number.txt"
    
    queue_entity = asyncio.Queue()
    numbers = []
    count_thread = 8
    
    def load_numbers(filename):
        with open(filename, "r") as file:
            content = file.read().split("\n")
            for conten in content:
                numbers.append(conten)
    
    def load_excel(output_filename):
        data = pd.read_excel(output_filename, 'Projects', dtype=str)
        for item in data["Telegram link"]:
            if item != "nan":
                queue_entity.put_nowait(item)
    
    
    async def create_client(number):
        return await TelegramClient(number, api_id, api_hash).start()
    
    async def parse_entity(entity, client):
        result = None
        try:
            result = client(functions.channels.GetFullChannelRequest(
                    channel=entity
                ))
            print("Успешно")
        except TypeError:
            try:
                result = client(functions.users.GetFullUserRequest(
                    id=entity
                ))
            except TypeError:
                result = client(functions.messages.GetFullChatRequest(
                    chat_id=entity
                ))
        except errors.UsernameInvalidError:
            print("Не найден пользователь, канал или чат")
        except errors.InviteHashExpiredError:
            print("Чата больше нет")
        except errors.InviteHashInvalidError:
            print("Ссылка приглашения не валидна")
        except ValueError:
            print("Невозможно получить entity. Для начала нужно вступить в группу или чат")
        except errors.FloodWaitError:
            print("Ожидание суток")
        return result
    
    
    async def crawl(future):
        futures = []
        numbers = await future
        for f in asyncio.as_completed([asyncio.ensure_future(create_client(number)) for number in numbers]):
            client = await f
            while queue_entity.qsize() > 0:
                futures.append(asyncio.ensure_future(parse_entity(queue_entity.get_nowait(), client)))
        if futures:
            await asyncio.wait(futures)
    
    async def start_main(root):
        loop = asyncio.get_event_loop()
        initial_future = loop.create_future()
        initial_future.set_result(root)
        await crawl(initial_future)
    
    if __name__ == '__main__':
        start = time.time()
        load_numbers(filename_numbers) #Загрузка телефонов
        #load_excel(filename_excel)     #Загрузка Excel
        loop = asyncio.get_event_loop()
        # loop.set_debug(True)
        try:
            loop.run_until_complete(start_main(numbers))
        except KeyboardInterrupt:
            for task in asyncio.Task.all_tasks():
                task.cancel()
                with suppress(asyncio.CancelledError):
                    loop.run_until_complete(task)
        finally:
            loop.stop()
        log.info("Time work: %s", time.time() - start)