Подтверждение подписки на обновления в реальном времени на 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

Другие вопросы по тегам