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

时间:2015-08-22 20:41:01

标签: python bots telegram python-telegram-bot

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

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

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

1 个答案:

答案 0 :(得分:8)

这样做并不是最诡辩的方式。这是编程要解决的问题。

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

假设您有一个函数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`

这适用于简单的程序。

对于更复杂的情况,我建议使用 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)

通过以下方式运行程序:

python messagecounter.py <token>

Go to the project page如果您有兴趣了解更多信息。有很多文档和非平凡的例子。