Telegram Bot Api:多级测验

Telegram Bot Api : multi level Quiz

我想开发一个有多个选项的电报机器人,例如一开始我显示 3 个按钮:按钮 1、按钮 2、按钮 3

当用户点击每个按钮时,我再次显示另外三个按钮:按钮 1、按钮 2、按钮 3

在第 2 步之后,我想向用户展示他点击的第一个和第二个按钮,例如:

他先点击按钮 3,然后点击按钮 1,所以,我想显示:

31

我怎么知道他先点击了哪个按钮?有没有办法从 bot 获取聊天记录?或者我应该保存他对数据库的点击?或者你的解决方案是什么?

*我正在使用c#和telegram.bot,但只要给我一个解决方案,语言并不重要。

您应该将 chat_id 和单击的按钮保存在数据库中。机器人的聊天历史是短暂的,可能对您的目的不可靠。

首先,您可以使用内联键盘为您提供 data 的用户更新。这意味着您可以获得任何问题的 ID,当用户单击时您将获得问题 ID。

  1. 使用带有问题键的 InlineKeyboardMarkup 作为数据。
  2. 我建议你保存一个问题树到数据库,保存每个用户的当前状态。

然后当用户点击一个按钮时;你得到问题键并在树中找到它并提出下一个问题或找到它来自哪里(以前的问题)。

如果您想 运行 与每个问题相关的任何方法,您只需将每个问题的方法名称存储在树中,当用户到达时使用 Reflection 触发该方法。

您可以使用内联按钮。 JavaScript 的解决方案:

var options = {
  reply_markup: JSON.stringify({
    inline_keyboard: [
      [
        {text: 'button 1', callback_data: '1'},
        {text: 'button 2', callback_data: '2'},
        {text: 'button 3', callback_data: '3'},
      ],
    ]
  })
};

bot.sendMessage(chatId, 'Pick action:', options);

看,你可以传递任何回调数据。所以我会在这个 callback_data 属性 中保存当前路径。格式不重要,可以是数组,字符串,随便什么。但它将代表堆栈。

例如,路径a2.a1.a3表示您点击了2号按钮,然后点击了1号按钮,然后点击了3号按钮。数据结构可以类似于这样:

{
  q: 'Which path you wanna go?',
  a1: { ... },
  a2: {
    value: 'right',
    q: 'You're going right. You see the wall, what will you do?',
    a1: {
       a1: { ... },
       a2: { ... }
       a3: {
         value: 'go back',
         q: 'You\'re going back and you see the tiger, what will you do?',
         a1: { ... },
         a2: { ... }
       }
    },
    a2: { ... },
    a3: { ... }
  },
  a3: { ... }
}

而且打包也很方便。只需从堆栈中弹出一个值,您就会进入上一个菜单。