尝试从谷歌存储桶加载数据会导致 apiclient.errors.HttpError: <HttpError 403... returned "Forbidden">

Posted

技术标签:

【中文标题】尝试从谷歌存储桶加载数据会导致 apiclient.errors.HttpError: <HttpError 403... returned "Forbidden">【英文标题】:Trying to load data from google storage bucket results in a apiclient.errors.HttpError: <HttpError 403... returned "Forbidden"> 【发布时间】:2017-05-27 18:57:35 【问题描述】:

所以现在我正在尝试编写一个 python 脚本来从我们的谷歌存储中加载一些文件。我使用的是 Windows,已安装 Google Cloud SDK 并使用 gsutil 设置了所有内容,因此我可以在命令行中键入以下内容成功加载文件:

gsutil cp gs://pubsite_prod_rev_****/financial-stats/subscriptions/***.csv .

这会将正确的 csv 文件加载到我的文件夹中。很酷。

现在我在 python 中尝试了相同的操作,遵循 google 的文档:https://support.google.com/googleplay/android-developer/answer/6135870?hl=en(您必须单击“使用客户端库和服务帐户下载报告”,然后单击“Python 示例”以显示 python 代码)

我使用了完全相同的代码

import json
from httplib2 import Http
from oauth2client.client import SignedJwtAssertionCredentials
from apiclient.discovery import build
from urllib import quote

client_email = 'serviceAccountEmail'
json_file = 'pathToMyServiceAccountPrivateKey'
cloud_storage_bucket = 'pubsite_prod_rev_******'
report_to_download = 'financial-stats/subscriptions/fileName.csv'

print report_to_download

private_key = json.loads(open(json_file).read())['private_key']
credentials = SignedJwtAssertionCredentials(client_email, private_key, 'https://www.googleapis.com/auth/devstorage.read_only')

storage = build('storage', 'v1', http=credentials.authorize(Http()))

print storage.objects().get(bucket=cloud_storage_bucket, object=report_to_download).execute()

加载 csv 文件。不幸的是,这会导致以下消息:

Traceback (most recent call last):
  File "C:/Office/Financial Reports/Python Reporter/Test.py", line 66, in <module>
    print storage.objects().get(bucket=cloud_storage_bucket, object=report_to_download).execute()
  File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\bq\third_party\oauth2client\util.py", line 137, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\bq\third_party\apiclient\http.py", line 724, in execute
    raise HttpError(resp, content, uri=self.uri)
apiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/storage/v1/b/pubsite_prod_rev_17179175168453545219/o/financial-stats%2Fsubscriptions%2Fsubscriptions_de.kaasahealth.namagi_cody_monthly_sub_201701_device.csv?alt=json returned "Forbidden">

很明显,它构建的 URL 有问题。但我不知道究竟是什么,因为这与谷歌在文档页面上告诉我们做的事情是一样的。

希望有人可以帮助我:/

编辑:我更改了回溯,因为它现在从错误 404 更改为错误 403..

【问题讨论】:

【参考方案1】:

查看应用信息和下载批量报告(只读)”需要管理员权限或至少帐户级权限

更新权限后,下载大约需要 24 小时。

【讨论】:

【参考方案2】:

这意味着您现在有权从

下载报告

Google Play Console -> 下载报告 -> 财务(或与财务报告相关的内容)。

在那里,您可以通过gsutil 下载您尝试下载的相同文件。 一旦您有权从 Google Play 管理中心下载报告,您就可以使用gsutil 或以编程方式下载报告

【讨论】:

【参考方案3】:

好吧,所以它不起作用的原因很简单。 您必须通过设置-> API 访问并选择您正在使用的服务帐户,在谷歌开发控制台中启用访问并添加管理员权限或更少(但我没有尝试其他可能性)。

【讨论】:

以上是关于尝试从谷歌存储桶加载数据会导致 apiclient.errors.HttpError: <HttpError 403... returned "Forbidden">的主要内容,如果未能解决你的问题,请参考以下文章

如何一次性将整个 blob(图像)文件夹从谷歌存储桶下载到 AI Platform Notebooks?

使用python从谷歌云存储桶中删除数据时出错

gsutil - 如何从谷歌私有云复制/下载所有文件?

谷歌大查询:导出表到自己的存储桶导致意外错误

是否使用数据流管道(未内置自定义)从谷歌存储到 bigquery 摄取数据(批量)?

如何在谷歌大查询中从谷歌云存储上传表格