python - 在收听来自电报组的消息时修复 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)
解决方案
推荐阅读
- python - 即使标签存在,它说什么也没找到
- python - 内含条件函数的列表推导
- javascript - 根据特定顺序对两个数组进行排序
- r - 如何从 CSV 读取超过 100 万条记录?
- docker - 为什么 docker-compose 因 ERROR 内部加载元数据而失败?
- python - 使用正则表达式保留中间字符串
- git - 使用原始时间戳应用 git stash
- bash - 如何在谷歌云中将 tmux 会话作为 startup_script 运行?
- javascript - JSON有效负载如何找到与提供的值相等的键/值
- java - Java Arrays.toString() 创建一个奇怪的字符序列