0

我一直在尝试使用实时更新 API为我的应用程序设置订阅,但出现了一些问题。对于初学者,这是我不断收到的错误:

{"error":{"message":"(#2200) callback verification failed: Operation timed out after 6000 milliseconds with 0 bytes received","type":"OAuthException","code":2200}}

我已经适当地遵循了文档,并在处理 HTTP GET 和 POST 的 Amazon EC2 实例上配置了一个 Flask 端点。发生的情况是我自己手动点击并终止以调用订阅代码。

curl -i -X GET http://public-ip-of-ec2:5000/subscribe

上面的 curl 在我的 ec2 实例上的 /subscribe 路径上调用在烧瓶应用程序中运行的脚本。为了使用所需的查询字符串参数(包括我们的access_token、对象、字段、verify_token 和 callback_url)进行 POST,我使用了 python HTTP 库requests

VERIFY_TOKEN = 'my_verify_token'

@app.route('/subscribe')
def subscribe():
    global VERIFY_TOKEN
    FB_CLIENT_ID = 'my_app_id'
    # access_token is sent as a query string parameter
    APP_ACCESS_TOKEN = 'my_app_access_token'

    # object, fields, callback_url, and verify_token are sent as urllib.urlencode([('param','val')])
    CALLBACK_URL = 'http://my-public-ec2-ip:5000/'

    payload_url = "https://graph.facebook.com/{0}/subscriptions".format(FB_CLIENT_ID)
    payload = {"access_token": APP_ACCESS_TOKEN, "object": "user", "fields": "feed", "verify_token": VERIFY_TOKEN, "callback_url": CALLBACK_URL}   
    r = requests.post(payload_url, data=payload)
    return r.text


@app.route('/', methods=['GET','POST'])
def handle_requests():
    global VERIFY_TOKEN
    if request.method == 'GET':
        mode = request.args.get('hub.mode')
        challenge = request.args.get('hub.challenge')
        verification = request.args.get('hub.verify_token')

        # if we have our verification token back echo the challenge back to facebook
        if verification == VERIFY_TOKEN:
            return challenge

    elif request.method == 'POST':
        # do some stuff with the updates

我很困惑为什么我会收到 {"error":{"message":"(#2200) 回调验证失败:操作在 6000 毫秒后超时,收到 0 个字节","type":"OAuthException", “代码”:2200}}

因为当我启动我的烧瓶应用程序时,我可以看到来自173.252.110.113的 GET 请求,这是一个 Facebook IP 地址。我已经进行了适当的测试,以确保通过将挑战打印到我的日志进行测试来回显正确的数据。所以代码返回了facebook需要验证订阅的挑战,此时订阅应该成功,但上述错误是我得到的。这可能只是一个安全问题,我需要在 ec2 安全组或其他东西中添加权限吗?

在此先感谢您的帮助!

4

2 回答 2

2

回答:

Facebook 在没有预警的情况下向相关端点发送多个请求,而 Flask 开发服务器无法处理这些请求,因此会超时。我用几个工人启动了一个 gunicorn 服务器来测试这个理论,它被证明是正确的,因为我现在有一个成功的订阅验证。对于其他遇到烧瓶问题的人:

$ sudo pip install gunicorn
$ which gunicorn
/usr/local/bin/gunicorn


# fire up your endpoint with a few gunicorn workers to handle the load
# facebook tests our endpoint with (we will use 4 workers on port 5000)
# my_app is your_app_name.py without the .py part     

$ /usr/local/bin/gunicorn -w 4 -b my-local-ipv4-ip:5000 my_app:app
于 2013-07-08T20:55:14.823 回答
0

" https://graph.facebook.com/ {0}/subscriptions".format(FB_CLIENT_ID)

用于通过 GET 方法获取当前订阅


要进行新订阅,您可以尝试:

" https://graph.facebook.com/ {0}/".format(FB_CLIENT_ID)

通过 POST 方法 --- 导入:在结束 url 中不包含订阅

于 2013-10-21T10:27:15.137 回答