2016-04-28 2 views
1

Я пытаюсь определить «полезную нагрузку» в Ruby для моего бот-сервера Facebook. Моим вариантом использования является то, когда пользователь видит структурированный контент (рассказ с кнопкой), и они нажимают кнопку, вместо того, чтобы отправлять их на URL-адрес, я хочу поразить свой веб-сайт и вернуть более структурированный контент.Определить 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 полезной нагрузки, как:

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

Не уверен, что я слишком поздно, но я создал драгоценный камень для обработки этих прецедентов: https://github.com/tinkerbox/message_quickly – Jaryl

ответ

1

Вам необходимо обработать обратные копии кода. Когда пользователь нажимает кнопку, facebook вызывает ваш webhook с обратной почтой (если это не URL-адрес).

От 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."}}]}]} 

Postback:

{"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"] 

Вы можете читать дальше обработки постбэков here в официальной документации (пункт 8 Обращение постбэков).

Смежные вопросы