我在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重新发送原始消息?
答案 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秒内回复。