禁止访问提供的图像,即使它是从同一帐户上传的

Access to the provided image was forbidden even though it was uploaded from the same account

使用服务帐户,我正在尝试在该帐户可用的根文件夹中创建一个文件夹,并将图像上传到创建的文件夹。

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

,但运气不好

我认为当使用 webContentLink 将图像放入 Google Document using Docs API 时,图像需要公开共享。那么在您的情况下,以下模式如何?

模式 1:

在这个模式中,使用了webContentLink。请在云端硬盘 API 中使用“权限:创建”的方法公开共享上传的文件。 Ref

这样就可以把上传的图片用webContentLink了。但是在现阶段,有这种link不能用的情况。 Ref 我认为这可能是错误或当前规范。

因此,作为解决方法,我想提出另一种模式。

模式二:

在这个模式中,通过修改查询参数,使用thumbnailLink代替webContentLink。在这种情况下,不需要公开共享上传的文件。

请将 thumbnailLink 添加到字段中,例如 fields = "id, name, webViewLink, webContentLink, thumbnailLink", 用于 drive.files.create。这样,thumbnailLink 就包含在返回值中。 thumbnailLink的取值如下

https://lh3.googleusercontent.com/###=s220

请将=s220修改为=s1000。由此,图像宽度的图像尺寸变大。此外,您可以自由更改它。并且请使用这个修改后的 URL 到 insertInlineImage.

参考: