我正在使用带有四个连接通道的BotFramework(nodeJS)开发一个机器人,其中一个是Telegram。似乎Bot Framework将'value'属性字段从Telegram API转换为'callback_data'字段,'InlineKeyboardButton'方法(docs)。我试图从大于64B的后置按钮发送有效负载,导致如下错误:'Bad request: BUTTON_DATA_INVALID'
请查看“按钮”数组中“值”字段下方的代码段,问题仍然存在。注意:其他通道使用以下结构正确地将此对象作为有效负载发送。
这是要发送的有效负载:
const foobar = {
"d": {
"a": {
"b": "192.168.0.12",
"c": "12345678",
"d": "123123"
},
"e": {
"f": "1",
"g": "Test User",
"h": [
{
"i": "1",
"j": "Foobar"
}
]
}
}
}
这是Bot Framework中用于通过支持它的任何渠道发送轮播的丰富消息结构,包括电报:
{
type: `message`,
attachmentLayout: `carousel`,
text: ``,
attachments: [
{
contentType: `application/vnd.microsoft.card.hero`,
content: {
text: `Test message text`,
buttons: [
{
type: `postBack`,
title: `Send Object`,
value: `${JSON.stringify(foobar)}`
}
]
}
}
]
}
一旦用户点击按钮,我就可以“听到”我的机器人控制器上的有效负载并完成我的工作。例如:Facebook Messenger,它运作良好。
是否有一些替代方法可以使用另一个Bot Framework富组件或复制回发后按钮行为的特定Telegram组件来发送有效负载数据?也就是说,文本值不会显示给用户,并且机器人控制器可以在发送后“听到”它。
答案 0 :(得分:1)
您可以将对象转换为字符串
示例:
events.on('news',function(data) {
var options = {
parse_mode :'Markdown',
reply_markup : JSON.stringify({
inline_keyboard : [
[{
text : 'Read',
callback_data : JSON.stringify({
'action' : 'read',
'url' : data.url
})
}]
]
})
};
bot.sendMessage(chat,data.text, options);
});
反之亦然:
bot.on('callback_query', function (msg) {
var data = JSON.parse(msg.data);
//make action
});