Мессенджер отправляет несколько запросов Post на ввод пользователя - PullRequest
0 голосов
/ 04 июля 2018

Я использую Facebook Messenger и его API для отправки. Я также использую ngrok в качестве сервера для обработки трафика. Мой чатбот работал отлично несколько дней назад, но теперь, после небольшой отладки, кажется, что Messenger, при каждом входе пользователя, очень быстро отправляет многократный пост-запрос один за другим. У меня была мысль, могут ли это быть проблемы с задержкой, поскольку мой чат-бот, который отвечает, требует времени для обработки. Мой чат-бот занимает много времени из-за всех запросов, но через некоторое время ему удается ответить на все запросы с ответом 200. Если да, то как мне сделать так, чтобы Messenger не отправлял несколько запросов Post и не заполнял мой ngrok webhook? Если это что-то еще, как мне решить проблему?

Это код, который слушает запросы:

@app.route("/webhook", methods=['GET','POST'])
def listen():
    """This is the main function flask uses to
    listen at the `/webhook` endpoint"""
    if request.method == 'GET':
        return verify_webhook(request)


    if request.method == 'POST':
        payload = request.get_json()
        print(payload)
        event = payload['entry'][0]['messaging']
        for x in event:
            if is_user_message(x):
                text = x['message']['text']
                sender_id = x['sender']['id']
                respond(sender_id, text)

        return "ok", 200

1 Ответ

0 голосов
/ 10 июля 2018

Вы можете прочитать о webhooks здесь . Не похоже, что вы можете изменить период ожидания.

Требования к производительности Webhook

Ваш веб-крючок должен соответствовать следующим минимальным стандартам производительности:

  • Отвечать на все события webhook с помощью 200 OK.
  • Отвечать на все события webhook за 20 секунд или меньше.

Если вы хотите реализовать многопроцессорное решение, оно может выглядеть так:

from threading import Thread as Sub

@app.route("/webhook", methods=['GET','POST'])
def listen():
    """This is the main function flask uses to
    listen at the `/webhook` endpoint"""
    if request.method == 'GET':
        return verify_webhook(request)


    if request.method == 'POST':
        payload = request.get_json()
        print(payload)
        event = payload['entry'][0]['messaging']
        for x in event:
            if is_user_message(x):
                text = x['message']['text']
                sender_id = x['sender']['id']
                sub = Sub(target=respond, args=[sender_id, text])
                sub.start()

        return "ok", 200

Если из-за этого возникают проблемы с общей областью действия или с самой колбой, рассмотрите вариант использования multiprocessing Для этого просто переключитесь на

from multiprocessing import Process as Sub
...