2016-04-28 98 views
1

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

所以,我已经尝试了几次迭代,不知道我在哪里被绊倒。

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 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 

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

+0

不知道我是不是太晚了,但是我创建了一个gem来处理这些用例:https://github.com/tinkerbox/message_quickly – Jaryl

回答

1

您需要在代码中处理回传。当用户点击一个按钮时,facebook会以回发的方式呼叫您的webhook(除非是网址)。

docs

回发后端调用你的网络挂接当按钮被窃听。这些调用包含为按钮设置的有效负载。结构化消息上的按钮支持打开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"]制作另一个案例。在正式文件处理回传here

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

您可以进一步阅读(8点处理回发):

因此,改变这种:

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

了这一点。