python - FB Messenger 收不到消息

标签 python facebook facebook-graph-api flask python-requests

我正在尝试使用新发布的 Messenger 平台 API 设置 Messenger 聊天机器人。我设置了一个托管在 Heroku 上的 Python Flask 服务器,并一直在调整这些指令以尝试让我的页面接收我的服务器发送给它的消息:https://developers.facebook.com/docs/messenger-platform/quickstart

到目前为止,我已经验证了一个回调 url,并且当我在 FB 上发布到我的页面时能够接收消息(即,当我向链接到我在 FB 上的应用程序的页面发送消息时,我的 heroku 日志显示 POST 请求正在接收)。但是,当我尝试将消息从我的服务器发送到我的应用程序时,我收到以下 JSON 错误响应:

400: {"error":{"message":"(#100) param recipient must be non-empty.","type":"OAuthException","code":100,"fbtrace_id":"B3cni+LAmYU"}}

我正在使用请求库向页面发送请求。下面是我用来处理 POST 请求的代码:

import json
import os
import requests

from flask import Flask, request

app = Flask(__name__)

FB_MESSAGES_ENDPOINT = "https://graph.facebook.com/v2.6/me/messages"
FB_TOKEN = "EAADKWAcVj...AZDZD"

@app.route('/', methods=["POST"])
def chatbot_response():
    req_data = request.data

    data = json.loads(req_data)
    print "Data: ", data
    sender_id = data["entry"][0]["messaging"][0]["sender"]["id"]
    print "Sender id: ", sender_id
    send_back_to_fb = {
    "entry": [{"messaging": [{"recipient": {"id": str(sender_id)}}]}],
        "recipient": {
             "id": str(sender_id)},
        "message": "this is a test response message",
        "recipient": str(sender_id), "access_token": FB_TOKEN
    }

    params_input = {"access_token": FB_TOKEN, "recipient": sender_id}
    fb_response = requests.post(FB_MESSAGES_ENDPOINT,
                                params={"access_token": FB_TOKEN, "recipient":  {"id": str(sender_id)}, "json": "recipient": {"id": str(sender_id)}},
                                data=json.dumps(send_back_to_fb)) 



    print "Json of response: ", fb_response.json()

    # handle the response to the subrequest you made
    if not fb_response.ok:
        # log some useful info for yourself, for debugging
        print 'jeepers. %s: %s' % (fb_response.status_code, fb_response.text)


    return "OK", 200


if __name__ == '__main__':
    app.run(host="0.0.0.0")

我已经尝试将“收件人”元素的无数不同类型的键/值编码到 json 中,但 FB 图形服务似乎无法理解它们中的任何一种。我如何对我的请求进行编码,以便 FB 知道“收件人”参数是什么?

谢谢!


编辑:

原来我必须在 POST 请求的 header 中手动设置编码类型。添加以下行,这样我就可以向 FB 发送可解释的文本响应:

headers = {'content-type':  'application/json'}

最佳答案

你可以试试这些,两者都应该有效

headers = {'Content-type': 'application/json'}
response = requests.post(url, data=json.dumps(send_back_to_fb), headers=headers)

response = requests.post(url, json=send_back_to_fb)

关于python - FB Messenger 收不到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147755/

相关文章:

facebook 图形 API - 评论限制为 999

facebook - 有没有办法将“赞”按钮与 Facebook 照片或 Facebook.com 上的其他帖子相关联?

php - 如何使用 php graph Api 保存 facebook 个人资料图片

python - 我认为它应该包含每个 "append"的不同列表,但事实并非如此

python - 将列表项映射到带参数的函数

python - 检测 IronPython 的最佳方法

python - Flask 重定向返回 200 而不是 302

html - 嵌入式 Facebook 视频的纯 CSS 解决方案

android - 关闭 facebook 登录对话框 android

ios - Facebook iOS SDK 的 openActiveSession 后访问 token 过期