Facebook Messenger повторяет отправку пользовательского ввода - PullRequest
0 голосов
/ 01 сентября 2018

У меня установлен 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 голосов
/ 01 октября 2018

Согласно документации 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 секунд.

0 голосов
/ 03 сентября 2018

Поскольку они ожидают, что вы ответите на запрос веб-крюка с помощью 200 OK своевременно, и в противном случае предположите, что что-то должно быть не так, что ваш бот был известен тем, что получил данные для отправки, и поэтому он получает отправку снова.

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

Вы должны будете сначала ответить на входящий запрос webhook с помощью 200 OK и первого ответа, а затем отправить дополнительные сообщения получателю независимо от этого первоначального запроса. (Только со стандартными сообщениями вы не сможете делать это неограниченным образом из-за политики «24 + 1».)

...