处理非官方的 Google API 是非常复杂的领域。虽然有可能让它工作,但这就是我要说的全部了。请自行决定是否继续。
首先,你需要获取一个 Google Play 授权令牌。有几种方法可以实现,但以下是 Purchased Apps 使用的方法:
public static String getAuthToken(Activity activity, String userEmail) {
AccountManager accountManager = AccountManager.get(activity);
Account userAccount = new Account(userEmail, "com.google");
Bundle options = new Bundle();
options.putBoolean("suppressProgressScreen", true);
String token;
try {
Bundle result = accountManager
.getAuthToken(userAccount, "androidmarket", options, activity, null, null)
.getResult();
token = result.getString("authtoken");
} catch (OperationCanceledException e) {
Log.d(TAG, "Login canceled by user");
return null;
} catch (IOException | AuthenticatorException e) {
Log.e(TAG, "Login failed", e);
return null;
}
return token;
}
一些需要注意的事项:
- 以上代码必须以异步方式运行。我建议使用RxJava,但AsyncTask也可以。
- 您必须为要使用的帐户提供电子邮件。我会把细节留给您,但使用AccountManager相当容易。
在获得授权令牌后,您现在可以访问任何Google Play Store端点。Purchased Apps使用的主要端点是https://android.clients.google.com/fdfe/purchaseHistory
。另一个可能会让您感兴趣的是https://android.clients.google.com/fdfe/details?doc=(package name)
(来自APKfetch code)。这里有一些更多的信息和分析。如果您向这些API发出请求,您将需要提供几个标头:
Authorization
- "GoogleLogin auth=(您的授权令牌)"
User-Agent
- "Android-Finsky/6.4.12.C-all%20%5B0%5D%202744941 (api=3,versionCode=80641200,sdk=" + VERSION.SDK_INT + ",isWideScreen=0)";
X-DFE-Device-Id
- 您设备的 Google 服务框架 ID,从 AdvertisingIdClient 获取。
X-DFE-Client-Id
- "am-android-google"
Accept-Language
- 设备的语言代码,例如 "en"
。
现在,您需要
解析响应。这就是事情变得棘手的地方。这些API返回的消息被编码为
Protobuf,因此它本质上只是二进制数据,除非您有模式(当然,只有Google才有)。理论上处理这个问题的一种方法是反编译Google Play Store应用程序,并使用类似于
JADX的工具重新使用它们生成的protobuf模型。
不幸的是,我已经尝试过这个方法,但它并没有真正起作用。 Protobuf模型类对于标准反编译器来说太复杂了。您可以使用一个名为
PBTK的工具。最好在Google Play Store 6.1.12 APK上运行此程序,因为这是他们开始使用ProGuard之前的最后一个版本。请注意,在运行此程序之前,需要修复其脚本中的两个错误:在
gui.py中将
'extracto'
更改为
'extractor'
,并删除
jar_extract.py的第500行上的断言语句。
现在,应该将所有的响应类输出为.proto文件。在src/main下创建一个名为
proto
的文件夹,并将整个生成的'com'目录拖到其中。您可以删除不属于
com/google/android/finsky/protos
的所有内容。按照在线说明设置Gradle与Protobuf Lite插件。
当您想要解析响应时,可以使用ResponseWrapper类,因为它们似乎都包含在其中。
这大概就是我能带给你的了。我可能有错误的地方;JADX是您在这里最好的朋友,因为了解应用程序正在做什么的最佳方法是查看其代码。希望这有所帮助,祝您开发愉快!
已购应用程序
提供的所有信息都可以从Play商店网页内容中检索。不幸的是,我无法购买Google Play上的应用程序。如果您与我分享一个拥有已购应用程序的帐户,我可以为您开发示例代码。 - aminography