信使发送 API
Messenger Send API
我正在创建一个不使用 Dialogflow 等聊天机器人平台的自建 Python 聊天机器人。问题在于,与 Messenger 等消息应用程序的集成并不容易,也无法将其连接起来。我正在尝试使用 Messenger Send API 创建到 Messenger 的 Webhook。我正在查看文档,它向我展示了如何请求 POST api 调用。但是,当我在网上查看示例时,它们似乎都处理名为 "entry" 和 "messaging" 的 json 值,我在任何地方都找不到这些值,而且似乎不明白为什么有必要这样做。我想知道 Messenger Send API 的输入正文究竟是什么样子,以便我可以适当地调用它,以及它的正文中有哪些 json 对象。这是我到目前为止从在线示例中得到的。我正在使用烧瓶。并且正在使用 Postman 来测试这个
@app.route("/webhook", methods=['GET','POST'])
def listen():
if request.method == 'GET':
return verify_webhook(request)
if request.method == 'POST':
payload = request.json
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"
下面是我认为的请求正文:
{
"object":"page",
"entry":[
{
"id":"1234",
"time":1458692752478,
"messaging":[
{
"message":{
"text":"book me a cab"
},
"sender":{
"id":"1234"
}
}
]
}
]
}
但是它无法读取它并给我一个错误:
File/Users/raphael******/Documents/*****_Project_Raphael/FacebookWebHookEdition.py”,第 42 行,在 listen 中
事件 = 有效载荷['entry'][0]['messaging']
TypeError: 'NoneType' 对象不可订阅
webhook 没有将正文正确注册为 json 对象,我哪里出错了?
我们是这样做的:
# GET: validate facebook token
if request.method == 'GET':
valid = messenger.verify_request(request)
if not valid:
abort(400, 'Invalid Facebook Verify Token')
return valid
# POST: process message
output = request.get_json()
if 'entry' not in output:
return 'OK'
for entry in output['entry']:
if 'messaging' not in entry:
continue
for item in entry['messaging']:
# delivery notification (skip)
if 'delivery' in item:
continue
# get user
user = item['sender'] if 'sender' in item else None
if not user:
continue
else:
user_id = user['id']
# handle event
messenger.handle(user_id, item)
# message processed
return 'OK'
编辑:
如果你使用的是postman,请确保同时将Content-Type
header设置为application/json
,否则Flask无法用request.json
解码。我想这就是 None 你的情况的来源。
我正在创建一个不使用 Dialogflow 等聊天机器人平台的自建 Python 聊天机器人。问题在于,与 Messenger 等消息应用程序的集成并不容易,也无法将其连接起来。我正在尝试使用 Messenger Send API 创建到 Messenger 的 Webhook。我正在查看文档,它向我展示了如何请求 POST api 调用。但是,当我在网上查看示例时,它们似乎都处理名为 "entry" 和 "messaging" 的 json 值,我在任何地方都找不到这些值,而且似乎不明白为什么有必要这样做。我想知道 Messenger Send API 的输入正文究竟是什么样子,以便我可以适当地调用它,以及它的正文中有哪些 json 对象。这是我到目前为止从在线示例中得到的。我正在使用烧瓶。并且正在使用 Postman 来测试这个
@app.route("/webhook", methods=['GET','POST'])
def listen():
if request.method == 'GET':
return verify_webhook(request)
if request.method == 'POST':
payload = request.json
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"
下面是我认为的请求正文:
{
"object":"page",
"entry":[
{
"id":"1234",
"time":1458692752478,
"messaging":[
{
"message":{
"text":"book me a cab"
},
"sender":{
"id":"1234"
}
}
]
}
]
}
但是它无法读取它并给我一个错误:
File/Users/raphael******/Documents/*****_Project_Raphael/FacebookWebHookEdition.py”,第 42 行,在 listen 中 事件 = 有效载荷['entry'][0]['messaging']
TypeError: 'NoneType' 对象不可订阅
webhook 没有将正文正确注册为 json 对象,我哪里出错了?
我们是这样做的:
# GET: validate facebook token
if request.method == 'GET':
valid = messenger.verify_request(request)
if not valid:
abort(400, 'Invalid Facebook Verify Token')
return valid
# POST: process message
output = request.get_json()
if 'entry' not in output:
return 'OK'
for entry in output['entry']:
if 'messaging' not in entry:
continue
for item in entry['messaging']:
# delivery notification (skip)
if 'delivery' in item:
continue
# get user
user = item['sender'] if 'sender' in item else None
if not user:
continue
else:
user_id = user['id']
# handle event
messenger.handle(user_id, item)
# message processed
return 'OK'
编辑:
如果你使用的是postman,请确保同时将Content-Type
header设置为application/json
,否则Flask无法用request.json
解码。我想这就是 None 你的情况的来源。