URI ресурса просмотра Google Диска возвращает 403

#python #google-drive-api

#python #google-drive-api

Вопрос:

Я немного застрял. Я подключен к клиенту Google Диска через учетную запись службы и могу просматривать и загружать ресурсы.

Мой код:

 from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
import httplib2
import os
import io
import uuid

def watch_file(service, file_id, channel_id, channel_type, channel_address):
    """Watch for all changes to a user's Drive.

    Args:
    service: Drive API service instance.
    file_id: ID of the file to watch.
    channel_id: Unique string that identifies this channel.
    channel_type: Type of delivery mechanism used for this channel.
    channel_address: Address where notifications are delivered.

    Returns:
    The created channel if successful, None otherwise.
    """
    body = {
    'id': channel_id,
    'type': channel_type,
    'address': channel_address
    }
    try:
        return service.files().watch(fileId=file_id, body=body).execute()
    except ValueError as error:
        print ('An error occurred: %s' % error)
    return None


scopes = ['https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('test-service-account-project-294621-23bc75e9e4fb.json', scopes)

http_auth = credentials.authorize(Http())
drive = build('drive', 'v3', http=http_auth)

channel_id = str(uuid.uuid4())
channel_type = 'web_hook'
channel_address = '/my/remote/server/address'

watch_file(drive, '{resource-id}', channel_id, channel_type, channel_address)

  

Когда я пытаюсь перейти к watch определенному ресурсу, запрос проходит, и я получаю следующий ответ:

 {
   "kind":"api#channel",
   "id":"b7fef95a-194a-4ba9-befb-8ac19bcdb8e3",
   "resourceId":"PxMhSDUDVo1YKsVHkC0JGUKqpz8",
   "resourceUri":"https://www.googleapis.com/drive/v3/files/{resource-id}?acknowledgeAbuse=falseamp;alt=jsonamp;supportsAllDrives=falseamp;supportsTeamDrives=falseamp;alt=json",
   "expiration":"1604634553000"
}
  

Насколько я понимаю, приведенный выше фрагмент ответа выглядит правильно, но когда я ищу resourceId uri в своем браузере, я получаю ответ ниже:

 {
   "error":{
      "errors":[
         {
            "domain":"usageLimits",
            "reason":"dailyLimitExceededUnreg",
            "message":"Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
            "extendedHelp":"https://code.google.com/apis/console"
         }
      ],
      "code":403,
      "message":"Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
   }
}
  

Обратите внимание, у меня работает сервер watch , настроенный на конечную точку развернутого сервера. Я вижу, что поступают запросы, но тело просмотра пустое, а resourceUri содержит 403.
Это пахнет странно и сбивает с толку, потому что мой клиент настроен правильно, т.Е. Я делаю запросы через API, но получаю Daily Limit проблемы. Как будто watch для публикации требуется какая-то другая аутентификация (я пытался добавить ключ API, но безуспешно).

Спасибо

Редактировать: меня это интересует resourceUri , потому что я полагаю, что есть больше информации для распаковки. С учетом сказанного, после прочтения дополнительной информации об ожидаемом выходе уведомления, я думаю, что ответ на уведомление, который я вижу, правильный, т.е. заголовки нет тела, но я не думаю, что я должен увидеть 403 в resourceUri.

Ответ на уведомление от сервера

 
2020-11-06T14:11:56.760215 00:00 app[web.1]: HEADERS: Connection: close
2020-11-06T14:11:56.760216 00:00 app[web.1]: X-Goog-Channel-Expiration: Fri, 06 Nov 2020 15:04:03 GMT
2020-11-06T14:11:56.760219 00:00 app[web.1]: User-Agent: APIs-Google; ( https://developers.google.com/webmasters/APIs-Google.html)
2020-11-06T14:11:56.760220 00:00 app[web.1]: Content-Length: 0
2020-11-06T14:11:56.760220 00:00 app[web.1]: Host: {host}
2020-11-06T14:11:56.760221 00:00 app[web.1]: Accept-Encoding: gzip,deflate,br
2020-11-06T14:11:56.760221 00:00 app[web.1]: Accept: */*
2020-11-06T14:11:56.760222 00:00 app[web.1]: X-Forwarded-Proto: https
2020-11-06T14:11:56.760222 00:00 app[web.1]: Total-Route-Time: 0
2020-11-06T14:11:56.760223 00:00 app[web.1]: X-Goog-Resource-Id: {resource-id}
2020-11-06T14:11:56.760223 00:00 app[web.1]: X-Forwarded-Port: 443
2020-11-06T14:11:56.760223 00:00 app[web.1]: X-Forwarded-For: 66.249.88.175
2020-11-06T14:11:56.760225 00:00 app[web.1]: X-Goog-Resource-Uri: {resource-uri}
2020-11-06T14:11:56.760225 00:00 app[web.1]: X-Goog-Message-Number: 473340
2020-11-06T14:11:56.760226 00:00 app[web.1]: Connect-Time: 0
2020-11-06T14:11:56.760226 00:00 app[web.1]: X-Goog-Resource-State: update
2020-11-06T14:11:56.760226 00:00 app[web.1]: X-Request-Id: {request-id}
2020-11-06T14:11:56.760227 00:00 app[web.1]: Via: 1.1 vegur
2020-11-06T14:11:56.760227 00:00 app[web.1]: X-Goog-Channel-Id: {channel-id}
2020-11-06T14:11:56.760227 00:00 app[web.1]: X-Goog-Changed: children
2020-11-06T14:11:56.760228 00:00 app[web.1]: X-Request-Start: 1604671916756
2020-11-06T14:11:56.760228 00:00 app[web.1]: 
2020-11-06T14:11:56.760229 00:00 app[web.1]: 
2020-11-06T14:11:56.760229 00:00 app[web.1]: BODY: None
  

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и включите свой код

2. Можете ли вы предоставить код, связанный с watch запросом? Кроме того, можете ли вы предоставить код, связанный с получаемым вами уведомлением? И что вы имеете в виду when I search the resourceId uri ? Зачем вам нужен search этот uri?

3. @Iamblichus Я отредактировал свой ответ выше. Мне не нужно искать uri ресурса, но, учитывая, что я это сделал, и я вижу 403, для меня это странно пахнет. Другими словами, это должен быть идентификатор, зависящий от версии просматриваемого ресурса, а не 403.

4. Определите search the resourceId uri . Вы имеете в виду, что пытаетесь получить доступ к этому uri? Как вы это делаете?

5. Вы должны пройти проверку подлинности, чтобы получить этот ресурс, он не является общедоступным. Когда вы просто пытаетесь получить доступ к uri с помощью своего браузера, вы не предоставляете никакого маркера аутентификации. Из-за этого вы получаете ошибку 403. Этого следовало ожидать.