首页 > 解决方案 > 在收听来自电报组的消息时修复 Telethon 上的 FloodWaitError

问题描述

我的任务是使用 Telethon 接收和处理来自 50 个 Telegram Group 列表的消息。我尝试了两个不同的用户会话,但几分钟后客户端停止接收消息,因为来自 Telethon的FloodWaitError 。该异常是由内部调用的 ResolveUsernameRequest 引起的,显然每次收到消息并且会话文件中不存在用户时。

我有另一个会话只听 10 个组,并且不会发生此错误。

有什么避免 FloodWaitError 的想法吗?

收听消息的代码

def create_client(api_id, api_hash, process_message=None, session='/app/messages_downloader/CUPUsd_live'):
    """
    Create telegram client and binds new_message event handler
    for Telegram_groups
    :param api_id:
    :param api_hash:
    :param process_message:
    :return:
    """

    client = TelegramClient(session, api_id, api_hash)

    if process_message is not None:
        @client.on(events.NewMessage(chats=TELEGRAM_GROUPS))
        async def my_event_handler(event):
            print(event.raw_text)
            
            chat_username = event.peer_id
            
            # Extract numbers from the raw message and save in database.
            process_message(event, chat_username)
            

    print('Starting telegram client...')
    client.start()
    return client

主班

if __name__ == '__main__':
    # start db
    db = DBClient()

    # # 1. start server
    # # 1.1 create Telegram client
    # # 1.2 listen for new messages and process them
    def process_message(telegram_message, chat_username):
        """
        Preprocess message
        Extract exchange rate
        Save message, date, exchange rates in db
        Update statistics
        :return:
        """
        raw_text = telegram_message.raw_text
        date = telegram_message.date
        group = chat_username

        if raw_text is not None:
            clean_text = preprocessing_text(remove_emojis(raw_text))
            exchange_rates = extract_exchange_rate(clean_text)

            def filter_func(e):
                coin = e['coin']
                value = e['value']
                if coin in RANGES_VALUES:
                    i1, i2 = RANGES_VALUES[coin]
                    return i1 <= value <= i2
                else:
                    return True

            exchange_rates = list(filter(filter_func, exchange_rates))

            if len(exchange_rates) > 0:
                db.insert_message(raw_text, clean_text, date, group, exchange_rates)
            else:
                print(f'Not inserted message {raw_text}')


    tg = create_client(API_ID, API_HASH, process_message)
    tg.run_until_disconnected()

控制台输出

    freeling_1      | [ERROR/2021-07-01 00:54:02,079] asyncio: Task exception was never retrieved
    freeling_1      | future: <Task finished name='Task-11' coro=<UpdateMethods._dispatch_update() done, defined at /usr/local/lib/python3.8/dist-packages/telethon/client/updates.py:386> exception=FloodWaitError('A wait of 82774 seconds is required (caused by ResolveUsernameRequest)')>
    freeling_1      | Traceback (most recent call last):
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/client/updates.py", line 445, in _dispatch_update
    freeling_1      |     await builder.resolve(self)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/events/common.py", line 99, in resolve
    freeling_1      |     await self._resolve(client)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/events/newmessage.py", line 93, in _resolve
    freeling_1      |     await super()._resolve(client)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/events/common.py", line 103, in _resolve
    freeling_1      |     self.chats = await _into_id_set(client, self.chats)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/events/common.py", line 33, in _into_id_set
    freeling_1      |     chat = await client.get_input_entity(chat)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/client/users.py", line 432, in get_input_entity
    freeling_1      |     await self._get_entity_from_string(peer))
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/client/users.py", line 548, in _get_entity_from_string
    freeling_1      |     result = await self(
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/client/users.py", line 30, in __call__
    freeling_1      |     return await self._call(self._sender, request, ordered=ordered)
    freeling_1      |   File "/usr/local/lib/python3.8/dist-packages/telethon/client/users.py", line 79, in _call
    freeling_1      |     result = await future
    freeling_1      | telethon.errors.rpcerrorlist.FloodWaitError: A wait of 82774 seconds is required (caused by ResolveUsernameRequest)

标签: pythontelegramtelethon

解决方案


推荐阅读