在python中处理电报机器人的多个问题

在python中处理电报机器人的多个问题,python,bots,telegram,python-telegram-bot,Python,Bots,Telegram,Python Telegram Bot,我正在用Python使用电报机器人API编程一个电报机器人。我面临的问题是管理需要用户回答的问题。当程序等待一个用户的回答,而另一个用户请求信息或在第一个用户响应之前询问另一个问题时,就会出现问题 电报API使用代码来处理请求。当您要求更新时,您会包含一个代码。如果您发送的代码高于请求代码,则会将其标记为已处理,并通过电报将其删除,并且不再显示在更新中。此代码是连续的,因此如果将更新3标记为已处理,则更新1和2也将被擦除 问题是,为什么处理用户需要答案的多个请求的最佳植物学/优雅方式是?在我的机

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

电报API使用代码来处理请求。当您要求更新时,您会包含一个代码。如果您发送的代码高于请求代码,则会将其标记为已处理,并通过电报将其删除,并且不再显示在更新中。此代码是连续的,因此如果将更新3标记为已处理,则更新1和2也将被擦除


问题是,为什么处理用户需要答案的多个请求的最佳植物学/优雅方式是?

在我的机器人中,我使用网络挂钩。如果你可以使用网络钩子,那么这是一种更舒适的与电报机器人交互的方式

如果您无法实现webhooking(例如ssl问题),那么就有解决方法。使用以获取以前的bot应答,并基于用户应答编写逻辑

检查更新是否包含reply(reply_to_消息键),然后根据此回复进行bot应答。这些操作必须是异步的,才能获得高的bot性能


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

没有一种最适合python的方式来实现这一点。这是一个你必须通过编程来解决的问题

基本上,您必须维护与每个用户相关的一些状态变量。当新消息到达时,bot会检查用户处于何种状态,并做出相应的响应

假设您有一个函数,
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`
对于一个简单的程序,这就足够了

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

例如,下面是一个计算单个用户发送了多少消息的bot。如果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>
python messagecounter.py

如果您感兴趣,可以了解更多信息。有很多文档和不平凡的例子。

这很有趣。虽然您的方法是合适的,但我发现当多个用户必须回答一个机器人问题时,有点混乱。我认为有一些方法可以在不影响其他用户问题的情况下解决这个问题。但那只是我的希望。哇,太谢谢你了!在你的项目中有合作的机会吗?有什么事要做?bug和问题?提前谢谢你!非常感谢。帮助我的最好方法是让我知道你需要的东西没有在库中,或者没有任何bug。帮助我的另一个最好的方法是传播有关电视剧的信息。我真的相信它可以简化电报机器人的开发。第三个最好的方法是在你自己的工作中使用电视镜头。这就是出版图书馆的全部意义所在。再次感谢你。第四个帮助我的方法是,如果你不介意的话,让我的答案成为你接受的答案。非常感谢。