Доступ к предоставленному изображению был запрещен, даже если оно было загружено с той же учетной записи

#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. кстати, похоже, что эта проблема возникает несколько раз в день, поэтому я думаю, что буду придерживаться вашего решения. Еще раз, большое спасибо!