禁止访问提供的图像,即使它是从同一帐户上传的
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
.
参考:
使用服务帐户,我正在尝试在该帐户可用的根文件夹中创建一个文件夹,并将图像上传到创建的文件夹。
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
.