定义Payload Facebook Messenger Ruby

时间:2016-04-28 11:55:38

标签: ruby facebook facebook-messenger

我正在尝试在Ruby中为我的Facebook Messenger机器人定义一个'Payload'。我的用例是,当用户看到结构化内容(带按钮的故事)并且他们点击按钮而不是将其发送到URL时,我想点击我的webhook并返回更多结构化内容。

所以,我已经尝试了几次迭代,并且不确定我在哪里被绊倒。我首先添加了一个消息传递事件:

messaging_event["entry"].first["messaging"].each do |msg|
     puts msg
     sender = msg["sender"]["id"]
     if msg["message"] && msg["message"]["text"]
       payload = msg["message"][“payload”]

我做了一些非常类似的添加文字,这是:

post '/webhook/' do
    messaging_event = JSON.parse(request.body.read)
    puts messaging_event
    messaging_event["entry"].first["messaging"].each do |msg|
      puts msg
      sender = msg["sender"]["id"]
      if msg["message"] && msg["message"]["text"]
        text = msg["message"]["text"]
        puts "Sender ID: #{sender}, Text: #{text}"

所以,在这一点上,我不确定是否需要进一步消除有效载荷,如:

def payload(sender, payload)
     data = {
       recipient: { id: sender },
       message: payload
     }
     send_message(data)
   end

或者,如果我只需要创建一个变量并在我的Module对象中调用该变量,如:

module Messages
    SIMPLE_ONE_BUTTON_PAYLOAD = {
"attachment":{
      "type":"template",
      "payload":{
        "template_type":"button",
        "text":"Here's a simple button message",
        "buttons":[
          "type":"postback",
            "title":"Button One",
            "payload":"[variable I need to call]",
        ]
      }
    }
  }
end

所以,这里真的有两件事 - 我是否需要有效负载消息传递事件并定义有效负载以及我需要在对象内调用什么?这里的任何想法或反馈都会非常有帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您需要在代码中处理回发。当用户点击按钮时,Facebook会通过回复来调用您的webhook(除非它是一个网址)。

来自docs

  

在点按按钮时,回发是对您的webhook的后端调用。这些调用包含为按钮设置的有效负载。结构化消息上的按钮支持打开URL和回发。

回发的结构与短信不同。

短信:

{"object":"page","entry":[{"id":654321,"time":1460624758100,"messaging":[{"sender":{"id":123456},"recipient":{"id":654321},"timestamp":1460624758089,"message":{"mid":"mid.987654","seq":12632,"text":"This is the message."}}]}]}

<强>回传

{"object":"page","entry":[{"id":654321,"time":1460625294253,"messaging":[{"sender":{"id":123456},"recipient":{"id":654321},"timestamp":1460625294253,"postback":{"payload":"Payload defined in the button"}}]}]}

您正在执行if msg["message"] && msg["message"]["text"],但回复帖子没有["message"]元素。您需要为msg["postback"]创建另一个案例。

所以,改变一下:

if msg["message"] && msg["message"]["text"]
  payload = msg["message"]["payload"]

到此:

if msg["postback"] && msg["postback"]["payload"]
  payload = msg["postback"]["payload"]

您可以在官方文档(第8点处理回发)中进一步阅读有关处理回发here的内容。