#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. Этого следовало ожидать.