编程下载Play商店统计数据时Google Cloud Storage访问403权限报错求助
问题根因
你遇到的403权限报错由两个原因共同导致:一是未完成Google Play Console的服务账号权限配置,二是调用GCS API的代码逻辑存在问题。
第一步:完成Google Play Console权限配置(View app information设为Global)
操作步骤如下:
- 使用拥有Google Play开发者账户所有者权限的账号登录Google Play Console
- 左侧菜单栏找到「用户和权限」选项点击进入
- 在用户列表中找到你使用的服务账号邮箱(即报错信息里的xxxx@xxxx.iam.gserviceaccount.com),点击右侧的「管理权限」
- 切换到「账户权限」标签页,向下滑动找到「查看应用信息」权限
- 该权限右侧的访问范围下拉框选择「全局(Global)」,同时勾选权限前的复选框
- 下拉到页面底部点击「保存」,权限配置生效最多需要等待15分钟,不要立刻测试
第二步:修正代码错误
你的代码存在两个可优化的问题:
- 无需手动解析服务账号密钥文件,直接使用官方库封装的凭证加载逻辑更稳妥
storage.objects().get()不支持通配符*匹配对象名,如果你要匹配前缀相同的多个报告文件,需要先调用list接口查询匹配的对象,再逐个获取
修正后的代码示例如下:
import os import json from google.oauth2 import service_account from googleapiclient.discovery import build # 替换为你实际的配置参数 cloud_storage_bucket = 'pubsite_prod_rev_xxxx' report_prefix = 'installs_com.xxx.xxxx_201701_overview' # 去掉通配符,仅保留前缀 SCOPES = ['https://www.googleapis.com/auth/devstorage.read_only'] # 自动加载环境变量指定的服务账号凭证 credentials = service_account.Credentials.from_service_account_file( os.getenv('GOOGLE_APPLICATION_CREDENTIALS'), scopes=SCOPES ) storage = build('storage', 'v1', credentials=credentials) # 先查询匹配前缀的所有报告对象 response = storage.objects().list( bucket=cloud_storage_bucket, prefix=report_prefix ).execute() if 'items' in response: for item in response['items']: # 逐个获取对象内容 file_content = storage.objects().get( bucket=cloud_storage_bucket, object=item['name'] ).execute() print(f"获取文件{item['name']}成功:", file_content) else: print("没有找到匹配前缀的报告文件")
额外校验项
如果配置完权限还是报错,可以做如下检查:
- 确认服务账号是被添加到了Google Play Console的用户列表中,而不是仅添加到了GCP项目的IAM配置里
- 确认你要下载的报告所属的应用,没有单独给该服务账号设置限制权限
- 确认对应时间段的安装报告确实存在,你可以先在Google Play Console的统计页面手动查看是否有2017年1月的安装报告
内容的提问来源于stack exchange,提问作者Pyari
相关产品推荐
相关产品推荐

