Подтверждение подписки на обновления в реальном времени на Facebook в Python
Я пытался настроить подписку для своего приложения с помощью API обновлений в реальном времени, но были некоторые проблемы. Для начала, это ошибка, которую я продолжаю получать:
{"error":{"message":"(#2200) callback verification failed: Operation timed out after 6000 milliseconds with 0 bytes received","type":"OAuthException","code":2200}}
Я соответствующим образом следовал документации и настроил конечную точку Flask на экземпляре Amazon EC2, который обрабатывает HTTP GET и POST. Происходит следующее: я вручную нажимаю на конечную точку, чтобы вызвать код подписки.
curl -i -X GET http://public-ip-of-ec2:5000/subscribe
Приведенный выше curl вызывает скрипт, работающий в приложении фляги, по маршруту / подписки на моем экземпляре ec2. Чтобы создать POST с необходимыми параметрами строки запроса, включая наши access_token, object, fields, verify_token и callback_url, я использую запросы библиотеки Python HTTP.
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}}
потому что, когда я запускаю свое приложение фляги, я вижу запрос GET от 173.252.110.113, который является IP-адресом Facebook. Я правильно проверил, чтобы убедиться, что я возвращаю правильные данные, напечатав запрос в мой журнал для тестирования. Таким образом, код возвращает вызов, который Facebook требует для проверки подписки, и в этот момент подписка ДОЛЖНА быть успешной, но я получаю вышеупомянутую ошибку. Может быть, это просто проблема безопасности, для которой мне нужно добавить разрешение в группах безопасности ec2 или что-то в этом роде?
Заранее спасибо за помощь!
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
" https://graph.facebook.com/{0} / subscription".format(FB_CLIENT_ID)
для получения текущих подписок методом GET
Для создания новой подписки вы можете попробовать:
Формат " https://graph.facebook.com/{0} /". (FB_CLIENT_ID)
методом POST --- import: это не включает подписки в конце URL