我使用Python和无服务器在AWS上制作了echo工具。
我不断收到相同的请求。我读了一个常见问题,上面说您必须提供状态码200,否则它将继续重试网络挂接。
我不确定该怎么做。
我注意到呼叫的序列号始终相同,因此我假设我发送的回复未被确认。我的代码在这里
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,但我不确定y仍然会遇到同样的问题。
如果收到多条消息,则服务器 未 从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,根据此文档,消息响应中不应包含该代码。
另一个问题可能是在params中发送状态代码。我将从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}})