#google-docs-api
#google-docs-api
Вопрос:
Используя учетную запись службы, я пытаюсь создать папку в корневой папке, доступной для учетной записи, и загружать изображения в созданную папку.
async def create_folder(api, parent, name):
return await api.as_service_account(
drive.files.create(
json = {
'mimeType': 'application/vnd.google-apps.folder',
'name': name,
'parents': [parent]
},
)
)
async def upload_file(api, path, parent, name):
return await api.as_service_account(
drive.files.create(
upload_file = path,
json = {
'name': name,
'parents': [parent]
},
fields = "id, name, webViewLink, webContentLink",
)
)
async def update_doc(api, id, requests):
return await api.as_service_account(
docs.documents.batchUpdate(
documentId = id,
json = {
"requests": requests
}
)
)
def insert_image(uri, index):
return {
"insertInlineImage": {
"uri": uri,
"location": {
"index": index
},
"objectSize": {
"height": {
"magnitude": 125,
"unit": "PT"
},
}
}
}
async def main(parent_id, path, file, doc_id):
async with client.api: # my "wrapper" around Aiogoogle
folder = await create_folder(
client.api,
parent_id,
"A folder in root folder"
)
image = await upload_file(
client.api,
f"{path}/{file}",
folder["id"],
"A file in created folder",
)
await update_doc(
client.api,
doc_id,
[insert_image(image["webContentLink"], 0)]
)
И хотя файл и папка были фактически созданы (в нем даже указано, что учетная запись является их владельцем), я получаю эту ошибку:
{'code': 400,
'message': 'Invalid requests[0].insertInlineImage: Access to the provided '
'image was forbidden.',
'status': 'INVALID_ARGUMENT'}
Я попытался предоставить эти аргументы обоим вызовам drive.files.create():
includePermissionsForView = "published",
ignoreDefaultVisibility = True
, но не повезло
Ответ №1:
Я думаю, что когда изображение помещается webContentLink
в документ Google с использованием Docs API, изображение должно быть общедоступным. Итак, в вашей ситуации, как насчет следующих шаблонов?
Шаблон 1:
В этом шаблоне webContentLink
используется. Пожалуйста, публично поделитесь загруженным файлом, используя метод «Разрешения: создать» в Drive API. Ссылка
Таким образом, вы можете поместить загруженное изображение с помощью webContentLink
. Но на текущем этапе эта ссылка не может быть использована. Ссылка Я думаю, что это может быть ошибка или текущая спецификация.
Итак, в качестве обходного пути я хотел бы предложить другой шаблон.
Шаблон 2:
В этом шаблоне thumbnailLink
используется вместо webContentLink
изменения параметра запроса. В этом случае не требуется публично делиться загруженным файлом.
Пожалуйста, добавьте thumbnailLink
в поля, подобные fields = "id, name, webViewLink, webContentLink, thumbnailLink",
для drive.files.create
. При этом thumbnailLink
включается в возвращаемое значение. Значение thumbnailLink
выглядит следующим образом.
https://lh3.googleusercontent.com/###=s220
Пожалуйста, измените =s220
на =s1000
. При этом размер изображения по ширине изображения становится большим. Кроме того, вы можете изменить это свободно. И, пожалуйста, используйте этот измененный URL для insertInlineImage
.
Ссылка:
Комментарии:
1. Проблема, с которой я столкнулся, была решена сама по себе, поэтому я предполагаю, что у Google были некоторые проблемы. Я действительно ценю ваш ответ, хотя!
2. @Shmookoff Спасибо за ответ. Я рад, что ваша проблема была решена. И вам спасибо.
3. кстати, похоже, что эта проблема возникает несколько раз в день, поэтому я думаю, что буду придерживаться вашего решения. Еще раз, большое спасибо!