Facebook Messenger重复发送用户输入

时间:2018-09-01 04:57:23

标签: php facebook facebook-messenger facebook-messenger-bot

我在Facebook Messenger中设置了一个使用PHP的聊天机器人。
我将通常是单个响应的内容分解为多个回复消息,因此与单个较大的聊天气泡相比,它在聊天中看起来更加自然并且更易于阅读。

这是我的做法:

for ($i=0; $i<count($response_array); $i++){
     $message_fb_format = [
         'recipient' => [
             'id' => $userID,
         ],
         'message' => [
             'text' => $response_array[$i],
        ],
    ];

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $replyMessageJSON);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Hub-Signature: xxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURLOPT_HTTP_VERSION_NONE');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);

    sleep(2);
}

我发现,当我将sleep()设置为2秒或更长时间时,Facebook Messenger会重复发送原始用户输入。然后,出现聊天窗口,好像我的聊天机器人多次对单个输入重复其响应,但是我的日志清楚地表明我的服务器多次从Facebook接收相同的消息,并且聊天机器人正确地响应了每个消息。

问题是,为什么?
为什么多条响应消息之间的2秒钟暂停会导致Facebook Messenger重新发送原始消息?

2 个答案:

答案 0 :(得分:2)

因为他们希望您及时用200 OK响应webhook请求,否则就假定某些地方出了问题,您的机器人很明显能够接收发送数据,因此它可以发送再次。

https://developers.facebook.com/docs/messenger-platform/webhook#unsubscribe

您必须首先以200 OK并首先答复来回答传入的Webhook请求,然后再独立于该初始请求将其他消息发送给收件人。 (由于采用“ 24 + 1”政策,因此只有使用标准消息传递,您才能无限制地做到这一点。)

答案 1 :(得分:1)

根据Facebook的文档,您必须在20秒内响应任何请求。

  

当您收到一个webhook事件时,您必须始终返回200 OK HTTP响应。 Messenger平台将每20秒重新发送一次webhook事件,直到收到200 OK响应。未能返回200 OK可能会导致Messenger平台取消订阅您的Webhook。

您可以在此处了解更多信息:https://developers.facebook.com/docs/messenger-platform/webhook#response

可能是当大量响应到来时,队列变大了,并不断地周期性地重复一次相同的响应。 确保您在20秒内回复。