带有复选框插件的Messenger僵尸程序如何跟踪用户参考和用户ID的对话

时间:2017-03-24 16:06:08

标签: facebook-messenger-bot

我们想在请求表单的末尾添加facebook messenger复选框插件,以便用户可以通过信使选择加入通知。

当用户选择加入时,我们的webhook会收到我们在表单中设置的user_ref的回调。

我们向此user_ref

发送选择加入确认

但我们收到的其他消息,如交付,阅读收据或来自用户的实际消息,确实包含用户引用,但用户ID。

这是facebook的官方文档:

  

收到回调事件后,您可以调用Send API以使用收件人中的user_ref标识符开始向用户发送消息,如下所示。请注意,此字段与呈现插件之前和确认选择加入之前使用的唯一user_ref参数相同。

     

如果对Send API的调用成功,则响应将包含recipient_id参数,该参数是您现在可以在将来的API调用中使用的稳定用户ID。

因此,无法在初始消息和新消息之间进行跟踪。有人找到了解决方案吗?

非常感谢你。

2 个答案:

答案 0 :(得分:0)

例如,当用户选择使用可选的ref参数时,您可以发送其他信息。您可以发送我网站上登录用户的用户名:

function confirmOptIn() {
      FB.AppEvents.logEvent('MessengerCheckboxUserConfirmation', null, {
        'app_id':'APP_ID',
        'page_id':'PAGE_ID',
        'ref': 'myuser@mywebsite.com',
        'user_ref':'UNIQUE_REF_PARAM'
      });

您将在webhook活动中收到optin内的用户名:

{
  "recipient":{
    "id":"PAGE_ID"
  },
  "timestamp":1234567890,
  "optin":{
    "ref":"myuser@mywebsite.com",
    "user_ref":"UNIQUE_REF_PARAM"
  }
}   

然后,您可以调用Send API以使用user_ref开始向用户发送消息。

  

如果对Send API的调用成功,则响应将包含recipient_id参数,该参数是您现在可以在将来的API调用中使用的稳定用户ID。

...所以您将收到Messenger ID,您可以将其映射到您已经拥有的网站的用户名。在这里,我从官方开发者网站修改了一些示例,用user_ref调用send API,并将响应中获得的用户ID映射到我的网站用户名:

function callSendAPICheckbox(messageData, userApplicationId) {
((userApplicationId) => {
    request({
            uri: 'https://graph.facebook.com/v2.6/me/messages',
            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;

                if (messageId) {
                    console.log("Map messenger user ID %s with the username of my website %s", recipientId, userApplicationId);
                } else {
                    console.log("Successfully called Send API for recipient %s",
                        recipientId);
                }
            } else {
                console.error("Failed calling Send API for userId " +
                    recipientId, response.statusCode, response.statusMessage, body.error);
            }
        });

})(userApplicationId)
}

答案 1 :(得分:0)

为什么不使用sendTextMessage的元数据字段。您发送给用户的每条消息,您也发送元数据,当您收到正在传递的消息的响应时,您会在其中找到元数据字段。

以下是我的工作:

当用户选择复选框插件并触发事件时,我会在我的服务器上接收呼叫,检查它是否包含user_ref。如果是,则使用user_ref向用户发送带有自定义元数据的文本消息。当用户收到消息时,webhook会向我发送文档中提到的json数据。为了确定我收到此响应的user_ref,我在使用string + user_ref向用户发送消息之前设置了自定义元数据,该元数据是某些user_ref的组合。使用此自定义元数据,我使用sender.id标识我之前发送消息的用户的user_refsender.id是我的pageidrecipient.id您尝试获取和使用的用户ID,我们通常会向用户发送消息,也称为psid

如果只是我经常提到的逻辑部分,则在上面。 对于详细解决方案以及代码,我已经发布了here