0

Realtime Updates 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、object、fields、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) callback validation failed: Operation timed out after 6000 milliseconds with 0 bytes received","type":"OAuthException","type":"OAuthException","type":"OAuthException", "コード":2200}}

フラスコ アプリケーションを起動すると、Facebook の IP アドレスである173.252.110.113からの GET 要求が表示されるためです。テストのためにチャレンジをログに出力することで、正しいデータをエコーバックしていることを確認するために適切にテストしました。したがって、コードは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 )

by POST メソッド --- import :最後の URLにサブスクリプションを含めない

于 2013-10-21T10:27:15.137 に答える