如何通过Bot Framework使用Telegram通道在回发按钮中发送Object?

时间:2017-10-17 18:52:52

标签: node.js botframework telegram

我正在使用带有四个连接通道的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组件来发送有效负载数据?也就是说,文本值不会显示给用户,并且机器人控制器可以在发送后“听到”它。

1 个答案:

答案 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
});