【问题标题】:python-telegram-bot: How to keep the bot working after changing the code and re-running itpython-telegram-bot:如何在更改代码并重新运行后保持机器人工作
【发布时间】:2018-08-05 17:51:09
【问题描述】:

我正在尝试使用python-telegram-bot 创建一个电报机器人。对于这个机器人,我使用ConversationHandler。问题是当我更改代码并重新运行它时,机器人会等到用户输入命令(例如/start)才跳转到entry_points。有没有什么方法可以在不输入命令的情况下转到entry_points?如果没有,有没有办法向所有用户发送消息,通知他们输入命令?

【问题讨论】:

    标签: python python-telegram-bot


    【解决方案1】:

    有什么方法可以在不输入命令的情况下进入 entry_points? - 您需要一些事件让机器人识别它需要调用对话处理程序。您可以让它对带有Handler 的任何消息做出反应,例如MessageHandler,但随后您需要检查消息并决定机器人实际上是否需要继续对其做出反应或只是忽略。它的问题是机器人将为用户输入的每条消息做一些工作。如果它是你想要的,那就去做吧,否则它只是很多开销,这就是为什么使用命令很常见,这样机器人只对选定的消息做出反应。

    有没有办法向所有用户发送消息以通知他们输入命令? - 不幸的是,机器人无法启动与用户的对话,因此您需要其他方式来做到这一点。 /start 命令是 Telegram 中的全局命令,指示开始与用户交互。来自文档:用户第一次打开与您的机器人的对话时会看到一个开始按钮。如果您愿意,也许您可​​以使用 /setdescription 或 /setabouttext 命令在您的群组中设置欢迎消息,以提供更多信息。

    【讨论】:

    • 感谢您的回答。对于第一部分:这也是我想到的唯一解决方案,但我想知道 API 中是否有方法可以做到这一点。对于第二部分:“用户”是指与机器人进行公开对话的用户。所以机器人有chat_id。但是我需要“bot”和“update”对象来发送消息,而我没有将它们放在处理程序之外。
    • ConversationHandler 存储对话的状态,而不是 api,因此 api 中没有方法可以做到这一点,库中也没有方法。您不需要更新对象来发送消息,当您拥有用户列表时,您可以使用bot.send_message 发送它们。
    【解决方案2】:

    您可以将每个用户的 ConversationHandler 的状态存储在一个数据库中,当您重新启动机器人时,您可以将状态再次插入到处理程序中,但这可能并不那么容易......

    如果我理解你的话,你想在更新/重启后通知用户......但这也有点棘手,因为 bot api 限制了你在特定时间内可以发送多少条消息(没有办法只是将其发送给所有人),因此您必须将这些通知延长一段时间...

    【讨论】:

      【解决方案3】:

      telegram.ext.ConversationHandler 有一个属性persistent。您可以设置persistent=True, name='example_name'。并且您的更新程序应该设置了 persistence 字段。

      【讨论】:

        猜你喜欢
        • 2019-11-27
        • 2018-08-11
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多