提交Google Play Console编辑后,如何通过BASH脚本获取APK制品URL?
当然可以!用Bash脚本+Google Play Developer API完全能实现这个需求,我帮你拆解下具体步骤和可直接复用的脚本示例:
核心思路
Google Play Developer API提供了专门的端点来获取已上传APK的临时下载URL,我们的工作流是:
- 通过服务账号获取API访问令牌
- 调用API查询目标APK的详情(或对应发布轨道的信息)提取下载URL
- 下载APK并上传到你的私有Web服务器
前置准备
- 确保你的服务账号已获得Google Play Console的编辑权限(在Play Console → 设置 → 用户和权限中添加服务账号邮箱,授予「编辑」角色)
- 下载服务账号的JSON密钥文件到本地
- 安装必要工具:
curl(几乎所有系统默认都有)、jq(用于解析JSON响应,可通过apt install jq/brew install jq安装)
脚本实现
下面提供两种方案,你可以根据环境选择:
方案1:用gcloud简化认证(推荐,适合已配置gcloud的环境)
这个方案利用gcloud工具自动处理令牌生成,省去手动JWT签名的麻烦:
#!/bin/bash # -------------------------- 配置区 -------------------------- PACKAGE_NAME="com.your.company.app" # 你的应用包名 SERVICE_ACCOUNT_KEY="./service-account.json" # 服务账号密钥文件路径 EDIT_ID="abc123xyz" # 编辑ID(上传APK时的响应会返回,或用API查询最新编辑) VERSION_CODE="1001" # 目标APK的版本号 PRIVATE_SERVER_USER="your-server-user" # 私有服务器用户名 PRIVATE_SERVER_HOST="your-server-domain" # 私有服务器地址 PRIVATE_SERVER_PATH="/var/www/test-apks/" # 服务器上的存储路径 # ----------------------------------------------------------- # 激活服务账号并获取访问令牌 gcloud auth activate-service-account --key-file="$SERVICE_ACCOUNT_KEY" ACCESS_TOKEN=$(gcloud auth print-access-token) # 调用API获取APK的临时下载URL echo "正在获取APK下载链接..." APK_DOWNLOAD_URL=$(curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://androidpublisher.googleapis.com/androidpublisher/v3/applications/$PACKAGE_NAME/edits/$EDIT_ID/apks/$VERSION_CODE" | \ jq -r '.downloadUrl') if [ -z "$APK_DOWNLOAD_URL" ]; then echo "获取下载URL失败,请检查配置或权限" exit 1 fi echo "成功获取URL: $APK_DOWNLOAD_URL" # 下载APK到本地临时文件 echo "正在下载APK..." curl -o temp-apk-file.apk "$APK_DOWNLOAD_URL" # 上传到私有Web服务器(这里用scp,你也可以换成服务器的上传API) echo "正在上传到私有服务器..." scp temp-apk-file.apk "$PRIVATE_SERVER_USER@$PRIVATE_SERVER_HOST:$PRIVATE_SERVER_PATH" # 清理本地临时文件 rm temp-apk-file.apk echo "操作完成!APK已上传到私有服务器"
方案2:纯curl+openssl无依赖版(适合没有gcloud的环境)
如果你的环境无法安装gcloud,可以手动生成JWT令牌来认证:
#!/bin/bash # -------------------------- 配置区 -------------------------- PACKAGE_NAME="com.your.company.app" SERVICE_ACCOUNT_KEY="./service-account.json" EDIT_ID="abc123xyz" VERSION_CODE="1001" PRIVATE_SERVER_USER="your-server-user" PRIVATE_SERVER_HOST="your-server-domain" PRIVATE_SERVER_PATH="/var/www/test-apks/" # ----------------------------------------------------------- # 从密钥文件提取服务账号信息 CLIENT_EMAIL=$(jq -r '.client_email' "$SERVICE_ACCOUNT_KEY") PRIVATE_KEY=$(jq -r '.private_key' "$SERVICE_ACCOUNT_KEY") # 生成JWT头部和声明(有效期1小时) HEADER='{"alg":"RS256","typ":"JWT"}' NOW=$(date +%s) EXPIRY=$((NOW + 3600)) CLAIM=$(cat <<EOF { "iss": "$CLIENT_EMAIL", "scope": "https://www.googleapis.com/auth/androidpublisher", "aud": "https://oauth2.googleapis.com/token", "exp": $EXPIRY, "iat": $NOW } EOF ) # Base64URL编码工具函数 base64url_encode() { openssl base64 -e -A | tr '+/' '-_' | tr -d '=' } # 组装JWT签名输入 ENCODED_HEADER=$(echo -n "$HEADER" | base64url_encode) ENCODED_CLAIM=$(echo -n "$CLAIM" | base64url_encode) SIGNATURE_INPUT="$ENCODED_HEADER.$ENCODED_CLAIM" # 生成JWT签名 SIGNATURE=$(echo -n "$SIGNATURE_INPUT" | openssl dgst -sha256 -sign <(echo "$PRIVATE_KEY") | base64url_encode) JWT="$ENCODED_HEADER.$ENCODED_CLAIM.$SIGNATURE" # 获取访问令牌 ACCESS_TOKEN=$(curl -s -X POST "https://oauth2.googleapis.com/token" \ -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \ -d "assertion=$JWT" | jq -r '.access_token') # 后续步骤和方案1一致:获取URL、下载、上传 APK_DOWNLOAD_URL=$(curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://androidpublisher.googleapis.com/androidpublisher/v3/applications/$PACKAGE_NAME/edits/$EDIT_ID/apks/$VERSION_CODE" | \ jq -r '.downloadUrl') if [ -z "$APK_DOWNLOAD_URL" ]; then echo "获取下载URL失败,请检查配置或权限" exit 1 fi curl -o temp-apk-file.apk "$APK_DOWNLOAD_URL" scp temp-apk-file.apk "$PRIVATE_SERVER_USER@$PRIVATE_SERVER_HOST:$PRIVATE_SERVER_PATH" rm temp-apk-file.apk echo "操作完成!APK已上传到私有服务器"
关键注意事项
- 临时URL有效期:Google返回的APK下载URL有效期约1小时,所以要在获取后尽快完成下载和上传
- 自动获取EDIT_ID:如果你不想手动填写EDIT_ID,可以调用
Edits: list端点获取最新的编辑:LATEST_EDIT_ID=$(curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://androidpublisher.googleapis.com/androidpublisher/v3/applications/$PACKAGE_NAME/edits" | \ jq -r '.edits[0].id') - 权限验证:如果出现权限错误,务必检查服务账号在Play Console中的角色是否为「编辑」,且API已启用(在Google Cloud Console中搜索「Google Play Developer API」并启用)
内容的提问来源于stack exchange,提问作者AhiyaHiya
相关产品推荐
相关产品推荐

