如何用Python从Google Play开发者控制台程序化下载CSV文件?
用Python脚本下载Google Play统计CSV时遭遇权限拒绝,手动下载正常,如何解决?
问题描述
我从Google Play Developer Console的「Download Reports > Statistics」获取应用的下载、安装、卸载统计CSV文件。通过控制台给出的Cloud Storage存储桶URI,用关联的开发者账号手动打开URL能正常下载,但用Python脚本自动下载时遇到权限不足错误。
我的脚本代码:
import webbrowser def download_file(): # Download URL for the CSV file download_url = "https://storage.googleapis.com/pubsite_prod_7157330435810114607/stats/installs/installs_com.geology_quiz_and_guide.mineralogy_202301_app_version.csv" # Opens the browser at Google's login URL webbrowser.open('https://accounts.google.com/') # Wait to allow time to log in manually input("Press Enter after you have logged into Google...") # Once logged in, attempt to download the file webbrowser.open(download_url) print("Downloading file...") download_file()
执行后收到的错误:
<Error> <Code>AccessDenied</Code> <Message>Access denied.</Message> <Details>Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist).</Details> </Error>
我已经登录了关联的开发者账号,为什么脚本还是无法下载?有没有其他方法可以自动下载这些CSV文件?
原因分析
- 你用
webbrowser.open打开登录页和下载页时,两个请求可能不在同一个浏览器会话里:比如脚本默认调用的是未登录的浏览器实例,或者浏览器的会话隔离机制导致登录状态没共享。 - Google Cloud Storage的这些统计文件需要携带OAuth2验证凭证(如登录Cookie、身份令牌)才能访问,直接打开URL的方式如果没有有效凭证,会被判定为匿名访问,触发权限拒绝。
解决方法
方法1:使用Google Cloud Storage Python客户端库(推荐)
直接用官方库处理身份验证,无需依赖浏览器,稳定可靠:
- 安装依赖:
pip install google-cloud-storage google-auth
- 配置服务账号权限:
- 登录Google Cloud Console,找到与Play开发者控制台关联的项目
- 进入「IAM与管理员 > 服务账号」,创建服务账号并下载JSON格式的密钥文件
- 给该服务账号添加
Storage Object Viewer权限,确保能访问目标存储桶内的对象
- 编写下载脚本:
from google.cloud import storage import os # 设置服务账号密钥文件路径 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your/service-account-key.json" def download_play_stats_csv(bucket_name, blob_path, local_save_path): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_path) blob.download_to_filename(local_save_path) print(f"文件已保存到 {local_save_path}") # 从你的下载URL中提取桶名和对象路径 bucket_name = "pubsite_prod_7157330435810114607" blob_path = "stats/installs/installs_com.geology_quiz_and_guide.mineralogy_202301_app_version.csv" local_save_path = "./install_stats.csv" download_play_stats_csv(bucket_name, blob_path, local_save_path)
方法2:复用浏览器会话(适合快速测试)
确保脚本调用的是你平时登录Google账号的浏览器实例,共享登录状态:
import webbrowser # 指定你常用的浏览器路径(示例为Windows下的Chrome) chrome_path = "C:/Program Files/Google/Chrome/Application/chrome.exe %s" # Mac路径示例:"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome %s" def download_file(): download_url = "https://storage.googleapis.com/pubsite_prod_7157330435810114607/stats/installs/installs_com.geology_quiz_and_guide.mineralogy_202301_app_version.csv" # 用指定浏览器打开登录页 webbrowser.get(chrome_path).open('https://accounts.google.com/') input("登录后按回车继续...") # 用同一个浏览器实例打开下载URL webbrowser.get(chrome_path).open(download_url) print("开始下载文件...") download_file()
方法3:使用Play Developer Reporting API(适合批量处理)
如果需要批量获取统计数据或直接对接matplotlib绘图,可以跳过CSV下载,直接调用官方API获取结构化数据:
- 配置API权限和身份验证(参考官方文档)
- 直接通过API请求获取安装、下载等统计数据,无需处理CSV文件,更高效。
内容的提问来源于stack exchange,提问作者user22836254
相关产品推荐
相关产品推荐

