我使用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}})
拨打电话 拨打电话给 Skype 联系人。开始通话前,需先让支援PSP™版 Skype 的音频输入设备连接PSP™主机。 从联系人名单选择拨打对象 1. 进入 Skype 的选单画面后选择(联系人)。 2. 从联系人名单中选择电话的拨打对象。 可拨打电话给登入状态为(在线)等可通话状态的联系人。 开始呼叫后,会显示对方的名字或 Skype 账号。对方回复后即可开始通话。 提示 透过 Sky
我使用以下代码询问用户的身高(英尺和英寸),如果用户的输入不是int,则返回一条错误消息: 程序返回feet的错误消息: 但第一次返回英寸的错误消息时,它会返回两次: 此错误仅在用户第一次输入整数以外的内容时发生。我怎么才能摆脱这个?
我在一个简单的ftp服务器上工作,客户端必须向服务器发送多条消息,对于每条消息,服务器向客户端发回一个应答。当客户端发送一条消息时,它可以完美地工作,并且服务器没有任何问题地响应,例如,当客户端发送“用户用户名”时,服务器向客户端发回“需要密码”。 但是当客户端发送另一条消息“PASS密码”(使用同一个套接字)时,它不起作用!只有第一个交换有效(对于用户名),当发送第一条消息时,服务器应答器没有任
问题内容: 我想我在这里描述的可能有个名字,但我不知道。所以我的第一个问题是要知道这种技术的名称。 这是一个示例:假设您正在网页上实现实时搜索。每次用户在搜索框中键入内容时,您都会触发一个新的搜索查询,并且结果会尽可能频繁地更新。这是一件愚蠢的事情,因为您发送的查询会超出实际需要。每2-3个字母发送一次请求,或者每100 ms最多发送一次请求就足够了。 因此,一种技术是安排在键入键之后立即执行的查
问题内容: 我一般只是开始使用RabbitMQ和AMQP。 我有一条消息队列 我有多个消费者,我想用 同一条消息 做不同的事情。 RabbitMQ的大多数文档似乎都集中在循环上,即单个消息由单个使用者使用,而负载则分散在每个使用者之间。我确实是这种行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这是一个消费者: 如果我启动使用者两次,则 可以看到每个使用者都以循环方式使用替代消息。 例如,
问题内容: 我正在尝试拨打的电话不是使用特定号码,而是使用在变量中被调用的号码,或者至少告诉它在您的电话中提取该号码。这个在变量中被调用的数字是我使用解析器或从网站sql检索到的数字。我做了一个按钮,试图用一个函数调用存储在变量中的电话号码,但无济于事。一切都会帮助谢谢! 问题答案: 试一试: 假设电话号码在。 的返回Optional,因此使用可以确保它是(而不是)返回的。 对于Swift 3: