gpt4 book ai didi

python - Facebook webhook 多次调用同一条消息?

转载 作者:太空狗 更新时间:2023-10-29 22:20:59 25 4
gpt4 key购买 nike

我使用 Python 和无服务器在 AWS 上制作并回显了机器人。

我不断收到相同的请求。我阅读了常见问题解答,它说您必须提供状态代码 200,否则它将继续重试 webhook。

我不确定我该怎么做。

我注意到调用的序列号始终相同,因此我假设我发送的回复未被确认。我的代码在这里

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,但我不确定我是否仍然遇到同样的问题。

最佳答案

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

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,并根据此 documentation消息响应不应包含它。

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

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

只需确保您的代码工作正常,并且应返回 200。

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

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

关于python - Facebook webhook 多次调用同一条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44848406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com