【问题标题】:Handle multiple questions for Telegram bot in python在 python 中处理 Telegram 机器人的多个问题
【发布时间】:2015-11-16 14:14:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: python bots telegram python-telegram-bot


    【解决方案1】:

    在我的机器人中,我使用网络挂钩。如果可以使用网络挂钩 - 使用它,与电报机器人交互会更舒适。

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

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

    如果你是 python 程序员,我推荐 Tornado 用于这些目的。

    【讨论】:

    • 这很有趣。尽管您的方法很合适,但是当例如多个用户必须回答机器人问题时,我发现有点混乱。我认为有一些解决方法可以在不解决其他用户问题的情况下解决这个问题。但这只是我的希望。
    【解决方案2】:

    没有一种最 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`
    

    这适用于一个简单的程序。

    对于更复杂的情况,我建议使用 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 了解更多,如果您有兴趣。有很多文档和重要的例子。

    【讨论】:

    • 哇,非常感谢!有机会在您的项目中进行合作吗?要做的事情?错误和问题?提前谢谢!
    • 谢谢。帮助我的最好方法是让我知道您需要的库中没有的内容或任何错误。另一个帮助我的最佳方式是传播有关 telepot 的信息。我真的相信它可以简化 Telegram 机器人的开发。第三个最好的方法是在你自己的工作中使用 Telepot。这就是出版图书馆的全部意义所在。再次感谢您。
    • 第四个帮助我的方法是让我的答案成为你接受的答案,如果你不介意的话。谢谢。
    猜你喜欢
    • 2020-04-08
    • 2022-12-15
    • 2016-07-29
    • 2020-05-30
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多