Mac/Win电脑端一键下载蒲公英IPA安装包:绕过手机扫码的终极命令行教程
每次在蒲公英平台下载IPA文件都要掏出手机扫码,是不是觉得效率太低?作为开发者,我们完全可以通过命令行实现自动化下载。本文将手把手教你如何用终端直接获取蒲公英的IPA文件,无需手机介入,整个过程只需几行命令。
1. 理解蒲公英IPA下载机制
蒲公英平台的设计初衷是方便移动端用户安装测试包,因此默认流程需要手机扫码。但通过分析其网络请求,我们发现关键点在于:
- 平台会检测请求来源,只对iOS设备返回完整的plist文件
- plist文件中包含真实的IPA下载地址
- 普通浏览器请求会被重定向或返回不完整数据
核心原理:通过修改HTTP请求头中的User-Agent,伪装成iOS设备获取完整数据。以下是典型的信息流:
用户请求 → 服务器检测UA → 返回对应内容 │ ├─ 普通浏览器UA → 返回扫码页面 └─ iOS设备UA → 返回plist文件2. 基础单次下载流程
2.1 获取plist文件
首先需要提取蒲公英分享页面的plist地址。在分享页面右键"检查元素",找到类似这样的安装链接:
<a href="itms-services://?action=download-manifest&url=https://www.pgyer.com/app/plist/xxx">安装</a>其中的https://www.pgyer.com/app/plist/xxx就是我们需要的关键地址。使用curl命令获取完整plist:
curl --user-agent "iPhone" "https://www.pgyer.com/app/plist/xxx" -o manifest.plist提示:如果遇到403错误,可能需要更精确的iOS UA,下文会提供完整方案
2.2 解析plist获取IPA地址
下载的plist是XML格式,用文本编辑器打开后搜索software-package,会看到类似结构:
<key>software-package</key> <string>https://oss.pgyer.com/xxx.ipa</string>这就是真实的IPA下载地址。可以用grep快速提取:
grep -A1 "software-package" manifest.plist | tail -n1 | sed 's/<[^>]*>//g'2.3 下载IPA文件
获得直链后,用任意下载工具获取文件:
wget -O app.ipa "提取到的IPA地址"3. 高级自动化脚本
每次都手动执行这些步骤太麻烦,我们可以编写一个完整的Shell脚本:
#!/bin/bash # 参数检查 if [ -z "$1" ]; then echo "Usage: $0 <pgyer_plist_url>" exit 1 fi # 设置iOS用户代理 IOS_UA="com.apple.appstored/1.0 iOS/15.5 model/iPhone13,3" # 临时文件 TMP_PLIST=$(mktemp) TMP_IPA=$(mktemp).ipa # 获取plist echo "Fetching plist from $1..." curl -s -A "$IOS_UA" "$1" -o "$TMP_PLIST" || { echo "Failed to download plist" exit 2 } # 提取IPA URL IPA_URL=$(grep -A1 "software-package" "$TMP_PLIST" | tail -n1 | sed 's/<[^>]*>//g' | tr -d '[:space:]') [ -z "$IPA_URL" ] && { echo "No IPA URL found in plist" exit 3 } # 下载IPA echo "Downloading IPA from $IPA_URL..." curl -A "$IOS_UA" -L "$IPA_URL" -o "$TMP_IPA" || { echo "Failed to download IPA" exit 4 } # 清理并输出结果 mv "$TMP_IPA" "./$(basename "$TMP_IPA")" rm "$TMP_PLIST" echo "Success! IPA saved to $(basename "$TMP_IPA")"使用方法:
chmod +x pgyer-downloader.sh ./pgyer-downloader.sh "https://www.pgyer.com/app/plist/xxx"4. 常见问题解决方案
4.1 403 Forbidden错误
这通常是因为User-Agent不够精确。以下是几个经过验证的有效UA:
# iPhone 13 Pro "Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" # iPad Pro "Mozilla/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1"4.2 链接过期问题
蒲公英的下载链接通常包含时效参数(如auth_key)。如果遇到过期情况:
- 重新获取分享链接生成新的plist地址
- 在脚本中添加自动刷新逻辑:
# 在下载IPA前检查URL是否包含auth_key if [[ "$IPA_URL" == *"auth_key="* ]]; then echo "Warning: URL contains temporary auth key" fi4.3 批量下载方案
如果需要下载多个IPA,可以准备URL列表文件:
# urls.txt内容示例 https://www.pgyer.com/app/plist/xxx1 https://www.pgyer.com/app/plist/xxx2 # 批量处理 while read url; do ./pgyer-downloader.sh "$url" done < urls.txt5. 进阶技巧与工具集成
5.1 使用jq解析plist
如果系统安装了jq工具,可以更优雅地处理plist:
# 先将plist转为json plutil -convert json -o - manifest.plist | jq '.items[0].assets[] | select(.kind=="software-package") | .url'5.2 结合Alfred实现快捷操作
Mac用户可以通过Alfred Workflow创建一键下载:
- 新建Blank Workflow
- 添加Keyword输入框,设置触发词如"pgyer"
- 添加Run Script动作:
query="{query}" /path/to/pgyer-downloader.sh "$query"5.3 Windows端的实现方案
Windows用户可以通过Git Bash或WSL运行相同脚本,也可以使用PowerShell版本:
param( [string]$url ) $ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X)" $tempFile = [System.IO.Path]::GetTempFileName() try { Invoke-WebRequest -Uri $url -UserAgent $ua -OutFile $tempFile $ipaUrl = Select-String -Path $tempFile -Pattern "software-package.*?https?://[^\""]+" | ForEach-Object { $_.Matches.Value.Split()[-1] } if ($ipaUrl) { $ipaFile = Join-Path $pwd "app.ipa" Invoke-WebRequest -Uri $ipaUrl -UserAgent $ua -OutFile $ipaFile Write-Host "Downloaded to $ipaFile" } else { Write-Error "No IPA URL found" } } finally { Remove-Item $tempFile -ErrorAction SilentlyContinue }