Как успешно получать Google Drive v3 Push-уведомления с помощью Python? - PullRequest
0 голосов
/ 02 октября 2018

Я выполнил шаги, предоставленные Google для реализации push-уведомлений с помощью Drive API.Все идет так, как описано, за исключением того, что я не получаю никаких уведомлений от Google при каждом изменении (перечислены как Шаг 4 ниже).

Ниже приведено краткое описание шагов, которые я выполнил, и результатов на каждом этапе:

Шаг 1 (успех) : убедитесь, что вы являетесь владельцем домена

Я пошел в Консоль поиска по указанию и успешно подтвердил сайт.

Шаг 2 (Успешно) : Зарегистрируйте ваш домен

Я посетил страницу проверки домена и добавилмой домен в консоли API.Консоль Google API обновлена ​​и теперь отображает список с моим нужным доменом.

У меня есть действительный сертификат SSL от GoDaddy для моего домена, и я также проверил его.

Шаг 3 (Успешно)) : Создан мой канал уведомлений

Используя Python SDK, я создал канал и получил ответ от Google.Код Python ниже показывает, как я это сделал.Примечание. Адрес, указанный в моем запросе, предписывает Google отправлять уведомления на мой веб-сайт Flask, который я размещаю в Google App Engine.Я показываю домен как my_domain.com здесь для конфиденциальности, поскольку я нахожусь в процессе открытия сайта.

channel_id = str(uuid.uuid4())

body = {
    'kind': 'api#channel',
    'id': channel_id,
    'type': 'web_hook',
    'address': "https://my_domain.com/notifications"
}


try:
    start_page_token = service.changes().getStartPageToken().execute().get('startPageToken');
    print(service.changes().watch(pageToken=start_page_token, body=body).execute())
except Exception as e: 
    print('Exception: {}'.format(e))

А вот ответ от Google:

{u'resourceId': u'vTMwJWl7a23Af1LK1TpJZ38eO_0', u'kind': u'api#channel', u'expiration': u'1538433975000', u'id': u'dce14225-95c8-42a7-9945-4fed1604c848', u'resourceUri': u'https://www.googleapis.com/drive/v3/changes?alt=json&includeCorpusRemovals=false&includeRemoved=true&includeTeamDriveItems=false&pageSize=100&pageToken=4919&restrictToMyDrive=false&spaces=drive&supportsTeamDrives=false&alt=json'}

Шаг 4 (Сбой) : обработать уведомление от Google

Я использую веб-сайт Flask в App Engine и создал app.route для получения уведомлений от Google.Я включил код ниже.Я никогда ничего не получаю по этому URL.

@app.route('/notifications')
def notifications():
    print('in notifications()')

    try:
        chan_id = request.args.get('X-Goog-Channel-ID', 'empty')
        msg_num = request.args.get('X-Goog-Message-Number', 'empty')
        rid = request.args.get('X-Goog-Resource-ID', 'empty')
        state = request.args.get('X-Goog-Resource-State', 'empty')  
        resource_uri = request.args.get('X-Goog-Resource-URI', 'empty') 
        goog_changed = request.args.get('X-Goog-Changed', 'empty')
        goog_chan_exp = request.args.get('X-Goog-Channel-Expiration', 'empty')
        goog_chan_token = request.args.get('X-Goog-Channel-Token', 'empty')

        print('chan_id: {}'.format(chan_id))
        print('msg_num: {}'.format(msg_num))
        print('rid: {}'.format(rid))
        print('state: {}'.format(state))
        print('resource_uri: {}'.format(resource_uri))
        print('goog_changed: {}'.format(goog_changed))
        print('goog_chan_exp: {}'.format(goog_chan_exp))
        print('goog_chan_token: {}'.format(goog_chan_token))


    except Exception as e:
        print('notifications() exception: {}'.format(e))

    print('leaving notifications()')

    return jsonify(result='done')

1 Ответ

0 голосов
/ 03 октября 2018

Я не уверен, что это проблема, но когда я попробовал push-уведомления Google Диска, я не использовал SDK.Я только сделал POST-запрос, как показано в документации.

Не могли бы вы сделать POST-запрос на "https://www.googleapis.com/drive/v3/changes/watch" вместо использования service.changes().watch()?

Вам понадобится access_token для запроса, но я считаю, что вам не нужно отправлять startPageToken, поскольку они не используют его в своем примере: example

Надеюсь, это поможет!

...