Facebook webhook对同一条消息进行多次调用? [英] Facebook webhook making multiple calls for the same message?

查看:688
本文介绍了Facebook webhook对同一条消息进行多次调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Python和无服务器在AWS上制作和回显bot。

I made and echo bot on AWS with Python and serverless.

我一次又一次地收到相同的请求。
我读了faq,它说你必须提供一个状态代码200,否则它会继续重试webhook。

I keep getting the same request again and again. I read the faq where it says u have to deliver a status code 200 else it will keep retrying the webhook.

我不知道怎么办这个。

我注意到呼叫的序列号总是一样的,所以我假设我发送的回复没有被确认。
我的代码在这里

I have noticed that the sequence number is always the same for the calls so I assume the reply I sent was not acknowledged. my code is here

import os
import json
import requests
import random
from datetime import datetime
######################
# helper functions
######################
##recursively look/return for an item in dict given key
def find_item(obj, key):
    item = None
    if key in obj: return obj[key]
    for k, v in obj.items():
        if isinstance(v,dict):
            item = find_item(v, key)
            if item is not None:
                return item

##recursivley check for items in a dict given key
def keys_exist(obj, keys):
    for key in keys:
        if find_item(obj, key) is None:
            return(False)
    return(True)

##send txt via messenger to id
def send_message(send_id, msg_txt):
    print("Send message called")
    print (datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
    params  = {"statusCode": 200,"access_token": os.environment['accesstoken']}
    headers = {"statusCode": "200","Content-Type": "application/json"}
    data = json.dumps({"statusCode": "200","recipient": {"id": send_id},
                       "message": {"text": msg_txt}})

    r = requests.post("https://graph.facebook.com/v2.9/me/messages", params=params, headers=headers, data=data)
    print (r.text)

    if r.status_code != 200:
        print(r.status_code)
        print(r.text)



#-----------------------------------------------------------

def hello(event, context):
    #debug
    event=json.loads(json.dumps(event))
    print("event:" )
    print(event)
    # print("context")
    # print(context)


    #handle webhook challenge
    try:

        if keys_exist(event, ["queryStringParameters","hub.verify_token","hub.challenge"]):
            print("subscribe to webhook invoked")
            v_token   = str(find_item(event, 'hub.verify_token'))
            challenge = find_item(event, 'hub.challenge')
            if ("strongtoken" == v_token):
                response = {
                    "statusCode": 200,
                    "body": str(challenge)
                }
                print(challenge)
                return response

        #handle messaging events
        if keys_exist(event, ['body']):
            event_entry=json.loads(event['body'])
            if ((len(event_entry['entry'])>0) & (keys_exist(event_entry['entry'][0],['messaging'])) ):
                messaging_event = event_entry['entry'][0]['messaging'][0]
                if (keys_exist(messaging_event,['message'])):
                    msg_txt   = messaging_event['message']['text']
                    sender_id = messaging_event['sender']['id']
                    print(sender_id)
                    first_word = msg_txt.split(" ")[0]
                    send_message(sender_id, msg_txt)
                else:
                    print("Did not send message")
                    pass
            else:
                print("Did not send message")
                pass

        else:
            pass
    except:
        pass

我已经在很多地方给出了状态代码200而我不是当然,我仍然遇到同样的问题。

I have given the status code 200 in soo many places and I'm not sure y I still keep getting the same problem.

解决方案

如果您收到多条消息,您的服务器没有将200状态代码返回给Facebook服务器的webhook请求。这意味着您的部件发生错误,否则应返回200。它在我看来问题在以下几行:

If you are getting multiple messages your server did not return 200 status code to webhook request from Facebook server. This means an error occurred on your part otherwise 200 should be returned. It looks to me that problems are in following lines:

params  = {"statusCode": 200,"access_token": os.environment['accesstoken']}
headers = {"statusCode": "200","Content-Type": "application/json"}
data = json.dumps({"statusCode": "200","recipient": {"id": send_id},
                   "message": {"text": msg_txt}})

首先,您将在消息的数据主体中传递statusCode,并根据此文档消息响应不应包含它。

Firstly you are passing statusCode in a data body of message and according to this documentation message response should not contain it.

另一个问题可能是在params中发送状态代码。我会从send_message方法中完全删除状态代码。我怀疑它需要它。你基本上试图在错误的一端返回状态200。您试图在输出而不是输入(从Facebook的角度)返回它。

Another problem could be sending status code inside params. I would remove status code completely from send_message method. I doubt its needed there. You are basically trying to return status 200 on wrong end. You are trying to return it on output instead of input (from Facebooks point of view).

所以很有可能你正确地从Facebook收到消息,但你仍然返回错误的状态代码,因为你从内部消息事件中调用send_message方法而send_message方法应该返回状态400错误请求因为您发送错误请求。因此,您的服务器也会返回错误的响应代码。

So its quite possible you are correctly getting message from Facebook but you are still returning wrong status code because you are calling send_message method from inside messaging event and send_message method should return status "400 bad request" because you are sending faulty request. Thus your server also returns wrong response code.

只需确保您的代码正常运行,并且应该返回200.

Just make sure your code works correctly and 200 should be returned.

编辑:
所以我会尝试使用以下代码:

So i would try with following code:

params  = {"access_token": os.environment['accesstoken']}
headers = {"Content-Type": "application/json"}
data = json.dumps({"recipient": {"id": send_id},
                   "message": {"text": msg_txt}})

这篇关于Facebook webhook对同一条消息进行多次调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆