我一直在尝试使用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路径上的flask应用程序中运行的脚本。要使用所需的查询字符串参数(包括 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)回调验证失败:操作在6000毫秒后超时,收到0字节”,“键入”:“OAuthException”,“code”:2200}}
因为当我启动我的烧瓶应用程序时,我可以看到来自 173.252.110.113 的GET请求,这是一个Facebook IP地址。我已经进行了适当的测试,以确保通过将挑战打印到我的日志进行测试来回显正确的数据。因此代码IS返回了facebook验证订阅所需的挑战,此时订阅应该成功,但上述错误是我得到的。它可能只是一个安全问题我需要在ec2安全组中添加权限吗?
提前感谢您的帮助!
答案 0 :(得分: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
答案 1 :(得分:0)
“https://graph.facebook.com/ {0} /订阅” .format(FB_CLIENT_ID)
用于通过GET方法获取当前订阅
要进行新订阅,您可以尝试:
“https://graph.facebook.com/ {0} /”。格式(FB_CLIENT_ID)
通过POST方法---导入:在最后的网址中不包含订阅