У меня установлен 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 повторяет отправку исходного сообщения?
Потому что они ожидают, что вы ответите на запрос webhook с 200 OK
своевременно, и в противном случае предположим, что что-то пошло не так, что ваш бот был известен тем, что получил отправленные данные, и поэтому он получает отправку снова.
https://developers.facebook.com/docs/messenger-platform/webhook#unsubscribe
Сначала вам нужно будет ответить на входящий запрос webhook с помощью 200 OK и первого ответа, а затем отправить дополнительные сообщения получателю независимо от этого первоначального запроса. (Только со стандартными сообщениями вы не сможете делать это неограниченным образом из-за политики «24 + 1».)
Согласно документации Facebook, Вы должны ответить на любой запрос в течение 20 секунд.
Когда вы получаете событие webhook, вы всегда должны возвращать HTTP-ответ 200 OK. Платформа Messenger будет отправлять событие webhook каждые 20 секунд, пока не будет получен ответ 200 OK. Невозможность вернуть 200 OK может привести к тому, что Messenger Platform отменит подписку на ваш веб-крючок.
Вы можете прочитать больше об этом здесь: https://developers.facebook.com/docs/messenger-platform/webhook#response
Может быть, когда приходит много ответов, очередь становится большой, и она периодически повторяет один и тот же ответ снова и снова.
Убедитесь, что вы ответили в течение 20 секунд.