如何在python-telegram-api

时间:2018-11-07 17:45:55

标签: python python-telegram-bot

我想在机器人中使用ConversationHandler。至少,它需要三个参数:

class telegram.ext.ConversationHandler(entry_points, states, fallbacks)

AFAIK,入口点是会话处理程序的触发器,然后每个状态都可以执行自己的处理程序,based on fallbacks definition,如果状态中的所有处理程序都返回false,则触发回退。

好吧,因此处理程序返回一些东西。但是处理程序是对象,是类的实例。

基于this example,以new_alarm_handler为例。

所以我很怀疑

  1. 处理程序返回值是怎么回事? (它们似乎返回其回调函数结果)。

  2. 对话的当前状态在哪里?它似乎不可访问,但它是最后执行的处理程序的最后结果。是吗如果没有,那么我该怎么做才能更改对话中的当前状态?

  3. 因此,当达到某种状态时,将执行其处理程序列表(以arg形式传递的字典states中的值)。但是作为一个列表,它可能不止一个,因此返回状态可能不止一个。如何管理?

1 个答案:

答案 0 :(得分:0)

ConversationHandler将会话的当前state存储在称为conversations的字典中,并且键是名为conversation_key的实体。它是一个元组,由Chat的ID,User的ID和Message的ID组成(其中有些可能会丢失,这由per_chatper_userper_message bool属性定义)。 / p>

conversations方法中访问state以获得check_update(进一步说明):
https://github.com/python-telegram-bot/python-telegram-bot/blob/2cde878d1e5e0bb552aaf41d5ab5df695ec4addb/telegram/ext/conversationhandler.py#L248
对话状态不能手动访问。

当用户向机器人发送消息时,Updater从Telegram接收Update个对象并将其传递到其DispatcherDispatcher有一个已注册的Handler对象的列表,它们的check_update方法的添加顺序被调用。如果不应该处理更新,则check_update返回FalseNone,或者返回某个对象,然后将该对象传递给handle_update方法。

ConversationHandler继承自Handler本身,并且在其Handler字典中还有其他states个对象作为值。它还覆盖了check_updatehandle_update。它的check_update获取其当前对话state(请参见上面的链接),并为该check_update调用所有处理程序的state方法。如果它们全部返回False,则对fallbacks列表中的处理程序将执行相同的操作。如果他们所有的支票也返回False,则它什么都不做。

如果其中一个处理程序应处理该事件,则其check_update返回的对象将传递给ConversationHadler的{​​{1}}方法。它调用触发的handle_update的{​​{1}}方法,该方法又调用在其创建时定义的回调函数。其结果被设置为Handler字典中此对话的新handle_update

根据ConversationHandler文档字符串:

state