我使用python-telegram-bot开发电报机器人。
尽管使用了MessageQueue(正如docs中所述),但我一直在获得
telegram.error.RetryAfter: Flood control exceeded. Retry in N seconds
当我从客户端(真的非常快地按下回复键盘按钮)向我的漫游器泛洪时,它就会回答我。
MessageQueue实际上有效,我可以看到一次发送大量消息(带有for循环)期间的延迟。我为消息队列尝试了不同的值,但这些值都无济于事。
无论它实际发送的消息数量如何,该机器人似乎都被电报禁止。
启动:
class MQBot(telegram.bot.Bot):
def __init__(self, *args, is_queued_def=True, mqueue=None, **kwargs):
super(MQBot, self).__init__(*args, **kwargs)
self._is_messages_queued_default = is_queued_def
self._msg_queue = mqueue or mq.MessageQueue()
def __del__(self):
try:
self._msg_queue.stop()
except:
pass
super(MQBot, self).__del__()
@mq.queuedmessage
def send_message(self, *args, **kwargs):
return super(MQBot, self).send_message(*args, **kwargs)
主要:
token = config.get_token()
q = mq.MessageQueue(all_burst_limit=3, all_time_limit_ms=3000)
request = Request(con_pool_size=8)
bot = MQBot(token=token, request=request, mqueue=q)
updater = telegram.ext.updater.Updater(bot=bot)
dispatcher = updater.dispatcher
main_handler = handlers.get_main_menu_handler()
start_handler = handlers.get_start_command_handler()
change_wallet_handler = handlers.get_change_wallet_handler()
callback_query_handler = handlers.get_callback_query_handler()
conv_handler = ConversationHandler(
entry_points=[
start_handler,
main_handler
],
states={
handlers.MAIN: [
main_handler
],
handlers.WALLET_CHANGE: [change_wallet_handler],
},
fallbacks=[]
)
dispatcher.add_handler(conv_handler)
dispatcher.add_handler(callback_query_handler)
dispatcher.add_error_handler(handlers.error_callback)
updater.start_polling()
updater.idle()
处理程序示例:
def deposit(bot, user):
bot.send_message(
chat_id=user.chat_id,
text=lang.deposit(user.deposit, user.balance)
)
return MAIN
方法线程(同步或异步)不会更改任何内容。在发生这种情况时,如何防止用户泛滥或避免禁止我的机器人?
答案 0 :(得分:0)
问题出在bot的回复邮件大小:它大于512个字节。 Telegram API将此类消息视为大消息。因此,缩短bot的回复消息即可解决该问题。
您可以在article中了解更多信息。