【问题标题】:Messenger sending multiple Post requests per user inputMessenger 根据用户输入发送多个 Post 请求
【发布时间】:2018-07-04 05:14:30
【问题描述】:

我正在使用 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

【问题讨论】:

  • 一种与 Messenger 无关的可能解决方案是使用多处理来响应消息,同时立即发送 200 回复
  • 我宁愿不经历那个。这不会增加响应时间吗? Messenger Graph API 是否存在某种超时,使其重新发送请求?有没有办法增加超时时间?

标签: python-3.x rest flask http-post facebook-messenger-bot


【解决方案1】:

您可以阅读有关 webhook here 的信息。看来您无法更改超时期限。

Webhook 性能要求

您的 webhook 应满足以下最低性能标准:

  • 以 200 OK 响应所有 webhook 事件。
  • 在 20 秒或更短时间内响应所有 Webhook 事件。

如果您想实现多处理解决方案,它可能如下所示:

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

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2019-03-18
    • 2011-05-22
    • 2021-02-24
    相关资源
    最近更新 更多