如何使用python成功接收Google Drive v3推送通知?

如何使用python成功接收Google Drive v3推送通知?,python,google-app-engine,flask,push-notification,google-drive-api,Python,Google App Engine,Flask,Push Notification,Google Drive Api,我已经完成了Google提供的使用驱动API实现的步骤。一切都按照描述进行,除了我没有收到任何来自谷歌的通知,每当发生变化(列为下面的第4步) 以下是我遵循的步骤和每个阶段的结果摘要: 步骤1(成功):验证您是否拥有该域 我按照指示进入搜索控制台并成功验证了该站点 channel_id = str(uuid.uuid4()) body = { 'kind': 'api#channel', 'id': channel_id, 'type': 'web_hook',

我已经完成了Google提供的使用驱动API实现的步骤。一切都按照描述进行,除了我没有收到任何来自谷歌的通知,每当发生变化(列为下面的第4步)

以下是我遵循的步骤和每个阶段的结果摘要:

步骤1(成功):验证您是否拥有该域

我按照指示进入搜索控制台并成功验证了该站点

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))
步骤2(成功):注册您的域名

我访问了域验证页面,并在API控制台中添加了我的域。谷歌API控制台更新,显示我想要的域名列表

我有一个有效的SSL证书从戈达迪为我的域,并已验证了这一点

步骤3(成功):创建我的通知频道

使用pythonsdk,我创建了这个频道,并从谷歌那里得到了回复。下面的python代码显示了我是如何做到这一点的。注意:我的请求中包含的地址指示Google向我的Flask网站发送通知,我正在Google的应用程序引擎中托管该网站。我在这里以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))
以下是谷歌的回应:

{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(失败):处理来自谷歌的通知

我在appengine上运行一个Flask网站,并创建了一个App.route来接收来自谷歌的通知。我已经包括了下面的代码。我从未在这个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')

我不确定这是否是问题所在,但当我尝试谷歌驱动器推送通知时,我没有使用SDK。我只提出了一个POST请求,如文档中所示

您能试着向
发出POST请求吗?”https://www.googleapis.com/drive/v3/changes/watch“
而不是使用
service.changes().watch()

您需要一个
access\u令牌
,但我相信您不需要发送
startPageToken
,因为他们在示例中没有使用它:


我希望有帮助

你能提供日志吗?这里唯一相关的日志是我的Flask实例的AppEngine应用程序日志。我已经查看了它,没有任何与我请求接收谷歌通知的目标地址相关的条目。在2天的时间里,我从未在GAE日志文件中收到任何关于向我所需接收地址发出任何请求的证据。就在今天,我收到了日志中的第一个条目,这帮助我完成了整个过程。对于任何Flask用户,一旦我获得了日志条目,我就需要向我的路由(POST)中添加适当的方法来处理传入的消息。我不知道为什么我的日志文件中没有显示谷歌用户代理API的痕迹。我暂时不回答这个问题。我希望最终能得到更多的答案,到时候我会发帖的。你最终明白了吗?碰巧遇到同样的问题,我始终无法确定最初的问题发生的确切原因(或它开始工作的原因)。我向谷歌询问,但没有得到明确的答案。最终,由于项目的最后期限,我不得不继续前进。我所能说的是,我从第一步开始就多次完成了这个过程,以验证我的配置。如果您发现与缺少通知有关的更多详细信息,请在此处发布,以帮助其他人在将来避免相同的问题。感谢您的建议。我重新编写了我的代码,并尝试了这种方法,得到了相同的结果。尽管示例中没有记录,但来自我的POST请求的响应表明确实需要pageToken。我把它作为一个参数添加到我的帖子中,如示例所示,我确实从调用中收到了一个200 OK的预期响应值。不幸的是,在我提供的指定web_hook地址,我仍然没有收到任何内容。甚至不包括应该根据文档立即发送的同步消息。作为后续,我还测试了HTTP POST方法,为已知的错误地址提供了一个web_hook地址。当我这么做的时候,谷歌的回应是:未经授权的WebHook回调频道。所以,当我给出我已知的好地址时,谷歌似乎对我提供的地址没有任何问题。我明白了。。看来你做得不错,奇怪的是你没有收到信息。总之,我在上面的一条评论中也看到,您终于开始收到消息了:)仅供参考:不知道您是否尝试过,但当我尝试推送通知时,我使用的是来自文件的更改,而不是“所有更改”,因此我不知道端点更改是否有问题