2016-07-21 14 views
1

Ich erzeuge meinen ersten Bot mit node.js und heroku arbeiten, aber einige Schwierigkeiten zu finden, um die persistenten Menüfunktionen zu verstehen.Facebook Messenger Bot Persistent Menü

Frage 1) Wie kann ich Ereignisse als Callbacks anhängen?

function persistentMenu(sender){ 
request({ 
    url: 'https://graph.facebook.com/v2.6/me/thread_settings', 
    qs: {access_token:token}, 
    method: 'POST', 
    json:{ 
     setting_type : "call_to_actions", 
     thread_state : "existing_thread", 
     call_to_actions:[ 
      { 
       type:"postback", 
       title:"FAQ", 
       payload:"DEVELOPER_DEFINED_PAYLOAD_FOR_HELP" 
      }, 
      { 
       type:"postback", 
       title:"I Prodotti in offerta", 
       payload:"DEVELOPER_DEFINED_PAYLOAD_FOR_HELP" 
      }, 
      { 
       type:"web_url", 
       title:"View Website", 
       url:"https://google.com/" 
      } 
      ] 
    } 

}, function(error, response, body) { 
    console.log(response) 
    if (error) { 
     console.log('Error sending messages: ', error) 
    } else if (response.body.error) { 
     console.log('Error: ', response.body.error) 
    } 
}) 

}

Frage 2) Die einzige Möglichkeit, die ich für leere persistenten Menü gefunden haben und eine neue zu erzeugen ist mit einer Löschanfrage über den Anschluss („wie Facebook dokumentiert“) m gibt es eine possibily um das Einfügen einer Refresh-Funktion in meine app.js-Datei zu löschen?

curl -X DELETE -H "Content-Type: application/json" -d '{"setting_type":"call_to_actions","thread_state":"existing_thread"}' "https://graph.facebook.com/v2.6/me/thread_settingsaccess_token=PAGE_ACCESS_TOKEN"  

Antwort

3

Der FB Beispiel Roboter ist nicht gut für Rückrufe strukturiert. Ich habe keine gute Möglichkeit gefunden, das Beispiel im Node Callback oder Promise Modell zu strukturieren. Ich bin sicher, dass ein Node-Experte es reorganisieren kann.

Wenn Sie ein leeres call_to_actions-Array senden, verschwindet das Menü für das persistente Menü. Das Menü scheint jedoch ein wenig "klebrig" zu sein, da es nicht sofort erscheint/verschwindet, wenn die Nachricht gesendet wird.

Ich habe Ihr Schnipsel in meinen Beispielroboter integriert. Sie können ihn unter

https://messenger.com/t/dynamicmemorysolutions

siehe

Die Quelle an ist:

https://github.com/matthewericfisher/fb-robot

das Add See/Menübefehle und Funktionen entfernen.

BEARBEITEN: Die persistente Menü-API wurde aktualisiert. Weitere Informationen finden Sie unter this Frage.

+0

Danke, dieses Repo ist hilfreich. Eine Sache, die ich nicht verstehe, ist, wenn ich 'addMenu()' senden soll, ist das streng eine UX-Frage? Oder sollte ich addMenu mit den meisten Nachrichten senden? – aisflat439

+0

Thea addMenu Nachricht muss nur einmal gesendet werden, um die Menüeinstellungen zu ändern. –

0

dies für mich gearbeitet:

function menuButton() { 
    var messageData = { 
    setting_type : "call_to_actions", 
    composerinputdisabled :"TRUE", 
    thread_state : "existing_thread", 
    call_to_actions:[ 
    { 
     type:"postback", 
     title:"¿Tiempo de espera?", 
     payload:"ACTUALIZAR" 
    }, 
    { 
     type:"postback", 
     title:"Ver Promociones", 
     payload:"DEVELOPER_DEFINED_PAYLOAD_FOR_START_ORDER" 
    } 
    ]  
    } 
    request({ 
    uri: 'https://graph.facebook.com/v2.6/me/thread_settings', 
    qs: { access_token: PAGE_ACCESS_TOKEN }, 
    method: 'POST', 
    json: messageData 
    }, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     var recipientId = body.recipient_id; 
     var messageId = body.message_id; 

     console.log("Successfully sent generic message with id %s to recipient %s", 
     messageId, recipientId); 
    } else { 
     console.error("Unable to send message."); 
     console.error(response); 
     console.error(error); 
    } 
    }); 
    } 

Und ich nenne diese Funktion am beggining

app.post('/webhook', function(req, res){ 

    var data = req.body; 

    if (data.object == 'page') { 
    menuButton(); 

    data.entry.forEach(function(entry) { 
    var pageID = entry.id; 
    var timeOfEvent = entry.time; 

      // Iterate over each messaging event 
      entry.messaging.forEach(function(event) { 
     if (event.message) { 
      receivedMessage(event); 

     }else if (event.postback) { 
      receivedPostback(event); 
     } else { 
     console.log("Webhook received unknown event: ", event); 
     } 
    }); 
     }); 

    res.sendStatus(200); 
    } 

}) 

Was ich in der Lage zu tun, nicht ist die Möglichkeit der freien Texteingabe zu entfernen. Facebook behauptete jetzt sei möglich, habe aber noch keine Anleitung oder Beispiele dazu gefunden. Irgendwelche Hinweise?

0

Wenn Sie die freie Texteingabe deaktivieren möchten, shoud Sie den folgenden Parameter auf Ihre persistent Menü Anfrage hinzufügen:

"composer_input_disabled": true 

und nicht

composerinputdisabled :"TRUE" 
0

Die FB API document besagt, dass die API-Link zu Hit für die Anwendung persistenter Menü auf die Seite spezifischen Bot ist:

https://graph.facebook.com/v2.6/me/messenger_profile?access_token=<PAGE_ACCESS_TOKEN> 

Beachten Sie die me nach der Versionsnummer, d. H. v2.6 in diesem speziellen Fall.Allerdings this did not worked for a lot of people

Es gibt eine kleine Änderung in der API-Link zu schlagen:

graph.facebook.com/v2.6/ Page ID/messenger_profile access_token = PAGE ACCESS TOKEN

Beachten Sie, dass mich wird durch die fb Page Id ersetzt.

Und die Probe Nutzlast kann immer noch die gleichen sein:

{ 
    "get_started": { 
    "payload": "Get started" 
    }, 
    "persistent_menu": [ 
    { 
     "locale": "default", 
     "composer_input_disabled": false, 
     "call_to_actions": [ 
     { 
      "title": "Subscribe", 
      "type": "postback", 
      "payload": "subscribe" 
     }, 
     { 
      "title": "Stop notifications", 
      "type": "nested", 
      "call_to_actions": [ 
      { 
       "title": "For 1 week", 
       "type": "postback", 
       "payload": "For_1_week" 
      }, 
      { 
       "title": "For 1 month", 
       "type": "postback", 
       "payload": "For_1_month" 
      }, 
      { 
       "title": "For 1 year", 
       "type": "postback", 
       "payload": "For_1_year" 
      } 
      ] 
     }, 
     { 
      "title": "More", 
      "type": "nested", 
      "call_to_actions": [ 
      { 
       "title": "Fresh jobs", 
       "type": "postback", 
       "payload": "fresh jobs" 
      }, 
      { 
       "title": "Like us", 
       "type": "web_url", 
       "url": "https://www.facebook.com/onlysoftwarejobs/" 
      }, 
      { 
       "title": "Feedback", 
       "type": "web_url", 
       "url": "https://docs.google.com/forms/d/e/1FAIpQLScjgFRbfBLznO55kFIskcH_eFc23zRSUUxzIgv_o44uj0GMpw/viewform" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Beachten Sie, dass es zwingend notwendig ist, um die persistent_menuget_started Taste zu konfigurieren, bevor die Einrichtung.

Verwandte Themen