在python中处理Telegram bot的多个问题

Dar*_*gor 5 python bots telegram python-telegram-bot

我正在使用Telegram bot API在Python中编写电报机器人.我面临着管理需要用户回答的问题的问题.当程序第一个用户响应之前等待一个用户的答案和另一个用户请求信息或询问另一个问题时,会出现问题.

Telegram API使用代码来处理请求.当您要求更新时,请包含代码.如果您发送的代码高于请求代码,则将其标记为已处理并且电报将其删除并且不再出现在更新中.此代码是顺序的,因此如果将update 3标记为已处理,则更新1和2也将被删除.

问题是为什么最好的phytonic /优雅方式来处理需要用户答案的​​多个请求?

Nic*_*Lee 8

这样做没有最多的pythonic方式.这是一个你需要编程才能解决的问题.

基本上,您必须维护有关每个用户的一些状态变量.当新消息到达时,机器人会检查用户所处的状态,并做出相应的响应.

假设你有一个函数,handle(msg)为每个到达的消息调用:

user_states = {}

def handle(msg):
    chat_id = msg['chat']['id']

    if chat_id not in user_states:
        user_states[chat_id] = some initial state ...

    state = user_states[chat_id]

    # respond according to `state`
Run Code Online (Sandbox Code Playgroud)

这将适用于一个简单的程序.

对于更复杂的情况,我建议使用telepot,一个我为Telegram Bot API创建的Python框架.它具有专门解决此类问题的功能.

例如,下面是一个机器人,它计算单个用户发送了多少消息.如果10秒后没有收到任何消息,则重新开始(超时).计算是在每次聊天时完成的- 这是重点.

import sys
import telepot
from telepot.delegate import per_chat_id, create_open

class MessageCounter(telepot.helper.ChatHandler):
    def __init__(self, seed_tuple, timeout):
        super(MessageCounter, self).__init__(seed_tuple, timeout)
        self._count = 0

    def on_message(self, msg):
        self._count += 1
        self.sender.sendMessage(self._count)

TOKEN = sys.argv[1]  # get token from command-line

bot = telepot.DelegatorBot(TOKEN, [
    (per_chat_id(), create_open(MessageCounter, timeout=10)),
])
bot.notifyOnMessage(run_forever=True)
Run Code Online (Sandbox Code Playgroud)

运行程序:

python messagecounter.py <token>
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,请转到项目页面了解更多信息.有很多文档和非平凡的例子.


小智 1

在我的机器人中,我使用网络钩子。如果您可以使用网络挂钩 - 那就去做吧,这是与电报机器人交互的更舒适的方式。

如果您无法进行 Webhook(例如 ssl 问题),可以使用解决方法。使用ForceReply以获得先前的机器人答案并根据用户回复编写逻辑。

检查更新是否包含回复(reply_to_message key),然后根据此回复让机器人回复。这些操作必须是异步的,才能获得较高的机器人性能。

如果您是 python 程序员,我推荐 Tornado 来实现这些目的。