Messenger发送API

时间:2018-06-27 09:05:45

标签: python-3.x rest flask facebook-messenger facebook-chatbot

我正在创建一个不使用诸如Dialogflow之类的聊天机器人平台的自建Python聊天机器人。问题在于,与Messenger之类的消息传递应用程序之间也无法轻松集成以进行连接。我正在尝试使用Messenger Send API创建到Messenger的Webhook。我正在查看文档,它向我展示了如何请求POST api调用。但是,当我在网上查看示例时,它们似乎都处理了称为“ entry”和“ messaging”的json值,这些值在任何地方都找不到,并且似乎看不到为什么有必要。我想知道Messenger发送API的输入主体到底是什么样子,以便我可以适当地调用它,以及主体中有哪些json对象。到目前为止,这是我无法遵循的在线示例。我正在使用Flask。并且正在使用邮递员对此进行测试

@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"
          }
        }
      ]
    }
  ]
}

但是它无法阅读并给我一个错误:

文件“ /Users/raphael******/Documents/*****_Project_Raphael/FacebookWebHookEdition.py”,第42行,在监听中     事件=有效负载['入口'] [0] ['消息传递']

TypeError:“ NoneType”对象不可下标

如果Webhook无法将主体正确注册为json对象,那我错在哪里?

1 个答案:

答案 0 :(得分:1)

这是我们的操作方式:

# 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'

编辑:

如果您使用的是邮递员,请确保还将Content-Type标头设置为application/json,否则Flask无法使用request.json对其进行解码。我想这就是您的情况中无人问津的地方。