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。
- 使用带有问题键的 InlineKeyboardMarkup 作为数据。
- 我建议你保存一个问题树到数据库,保存每个用户的当前状态。
然后当用户点击一个按钮时;你得到问题键并在树中找到它并提出下一个问题或找到它来自哪里(以前的问题)。
如果您想 运行 与每个问题相关的任何方法,您只需将每个问题的方法名称存储在树中,当用户到达时使用 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: { ... }
}
而且打包也很方便。只需从堆栈中弹出一个值,您就会进入上一个菜单。
我想开发一个有多个选项的电报机器人,例如一开始我显示 3 个按钮:按钮 1、按钮 2、按钮 3
当用户点击每个按钮时,我再次显示另外三个按钮:按钮 1、按钮 2、按钮 3
在第 2 步之后,我想向用户展示他点击的第一个和第二个按钮,例如:
他先点击按钮 3,然后点击按钮 1,所以,我想显示:
31
我怎么知道他先点击了哪个按钮?有没有办法从 bot 获取聊天记录?或者我应该保存他对数据库的点击?或者你的解决方案是什么?
*我正在使用c#和telegram.bot,但只要给我一个解决方案,语言并不重要。
您应该将 chat_id 和单击的按钮保存在数据库中。机器人的聊天历史是短暂的,可能对您的目的不可靠。
首先,您可以使用内联键盘为您提供 data
的用户更新。这意味着您可以获得任何问题的 ID,当用户单击时您将获得问题 ID。
- 使用带有问题键的 InlineKeyboardMarkup 作为数据。
- 我建议你保存一个问题树到数据库,保存每个用户的当前状态。
然后当用户点击一个按钮时;你得到问题键并在树中找到它并提出下一个问题或找到它来自哪里(以前的问题)。
如果您想 运行 与每个问题相关的任何方法,您只需将每个问题的方法名称存储在树中,当用户到达时使用 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: { ... }
}
而且打包也很方便。只需从堆栈中弹出一个值,您就会进入上一个菜单。