如何从 Google Play 获得用户下载的应用程序列表(付费/免费) ?

我最近偶然发现了这个应用程序 Purchase Apps,它能够以某种方式检索应用程序,我已经在谷歌播放后,我在使用我的谷歌帐户登录。

我试图找出它是如何做的,因为我想建立一个类似的应用程序,但为免费应用程序下载。

但是,我找不到使用哪个 OAuth API 作用域来检索该信息,即使在浏览了 整个 API 清单之后也是如此。

Google Sign in asking for access to androidmarket


编辑: 我在这个问题上投入了新的精力,正如我问过的关于 这里的一个类似问题所暗示的那样,因为到处我都没有看到一个关于如何做到这一点以及如何利用它的真正答案。

我想把这些问题分成几个部分:

  1. 什么样的 API 可以用来获得购买的应用程序的信息?我在哪里可以读到?请展示一个完整的工作示例。

  2. 它还能做更多吗?也许可以进行搜索?也许展示一下已经安装的免费应用程序?也许是安装和卸载的时间?这些应用程序的分类呢?

  3. 使用这个 API 有什么特殊要求吗?


编辑: 我在这方面下了最大的赌注,因为不管我读了多少,尝试了多少,我还是没能做出一个 POC,它可以查询用户从 Play Store 下载的应用程序(名称,软件包名称,安装和/或删除的日期,图标 URL,价格...) ,包括付费和免费的应用程序。

如果有人找到了一个工作示例,请展示它是如何完成的,并展示您是如何找到它的(文档或任何引导您找到解决方案的东西)。我在任何地方都找不到它,而且目前的解决方案对我来说太模糊了,无法从头开始。

6431 次浏览

问题解决了,漏洞已经关闭。

We will be closing this bug due to being logged in a Preview version of Android. If the issue is still relevant and reproducible in the latest public release (Android Q), please capture a bugreport and log the bug in https://source.android.com/setup/contribute/report-bugs. If a reply is not received within the next 14 days, this issue will be closed. Thank you for your understanding.


最新更新:

这是一个错误,谷歌将在下一次更新中解决它。

We've deferred this issue for consideration in a future release. Thank 你的时间,使 Android 更好


This answer has turned into a conglomeration of ideas and been edited to include information from discussion in the comments.

androidmarket API,将是一个定制的 API编写的开发人员。它不提供给公众。

在评论中解决你的问题。开发者可以利用现有的通过 Android Developer 和 Google 提供的 API 来创建一个项目来管理所有这些。

至于访问 Full Account Access,我不确定这些开发人员是如何做到的。

我建议使用 会计经理,它是 android.account 的一部分,可以访问凭据和方法 GetUserData。帐户管理器可以访问密码,并且能够创建和删除帐户。这个,可能和 内容提供者一起使用

参见 Udinic/SyncAdapter 身份验证

回复你的评论:

这个博客应该帮助你开始。


我无法告诉你这些应用程序到底是如何工作的。它们也可能有不同的实现(除非它们是幕后的协作工作,否则它们肯定是不同的)。

一个猜测。首先使用 GoogleSignInAccountCom.google.android.gms.auth.api.signin

There a definition for 范围, to determine the extent of the permissions the app is granted.

使用 RequestScope ()

公共静态最终字符串 PROFILE

.../ It lets your web app access over-the-air Android app installs.

For 例子:

GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail().
.requestScopes(new Scope("https://www.googleapis.com/auth/contacts.readonly"))
.build();

If full access can be gained a list of all apps used by the account holder can be found and compared to what's on the device.

Package Manager 将检索当前安装在设备上的所有应用程序的列表。
PackageInfo 提供了有关该应用程序的详细信息。
INSTALL_REASON_USER will also filter out apps that have been actively installed by the user.

你可能想看看 Com.google.firebase.appindexing日志用户操作。不同的 行动可以被跟踪。

用户帐户历史记录位于 https://myactivity.google.com/myactivity

一个有用的链接是 OAuth 2.0游乐场


这个 github repo node-google-play(使用节点)是最新的,将调用 GooglePlayAPI。作为一个“非官方”API 的存档,机器人市场 API,用于查询市场。


应用程序1

应用程序声称使用以下权限:

版本2.1.8可以访问:
$ 应用内购买

其他

  • 从互联网接收数据
  • view network connections
  • 全网络接入全网络接入
  • 使用设备上的帐户
  • prevent device from sleeping
  • 阅读 Google 服务配置

值得注意的是,该应用程序不设置任何权限时,有一个基本的,安装。我无法使用这些功能,因为我没有付费应用程序。所以对于最初的搜索-没有权限需要,这将表明应用程序没有访问我的帐户。

I checked the permissions - there were none set. So the only thing required was to accept the pop up, as displayed in your question.


应用程序2

你提到的另一个应用程序做了同样的事情,对于被访问的内容更加直接。

我的付费应用

安全/隐私通知
你第一次运行这个应用程序时,它会要求你的谷歌帐户的完全许可 获取所需信息的唯一途径 信息被存储,没有关于你的应用程序的信息被共享 这个应用程序的开发者,也没有与任何第三方共享。 所有东西都只存在你的手机里。

< img src = “ https://i.stack.imgur.com/dCXjc.png”width = “200”height = “400”> < img src = “ https://i.stack.imgur.com/UKi2e.png”width = “200”height = “400”>


I've gone into detail over these apps in 这篇博文, which was for a university capstone project (no monetary gain). I'm inclined to think this is an exploit in the API and not status by design by Google, as there are no API calls to fetch purchases of apps other than the developer's own app. I hypothesize it's a zero day exploit, in which case there's no legitimate way to access this information.

对于其中一个应用程序(我的付费应用程序) ,在检查了网络流量之后,很明显,它确实使用商店的帐户页面来检索付费应用程序的列表。 现在,它所使用的机制与 Google Chrome 目前使用的机制是相同的,据推测,Pokemon GO 在某个时间点上使用过。

简而言之,这样做的步骤如下:

  1. 登入 : What the mentioned program do for the first step is to log the user in and get access to the user's access token. To do so, it uses the android.accounts.AccountManager.getAuthToken() method. (See more: 会计经理) 但是,对于令牌作用域,请求 oauth2:https://www.google.com/accounts/OAuthLogin。 需要注意的是,基于 Google 的 OAth2文档,这个作用域是无效的; 但是,它似乎是 Google OAuth v1的有效作用域。

  2. 将新检索到的访问令牌转换为 ubertoken : 现在,实际上 ubertoken应该做什么,是未知的,也没有关于它的官方文件。然而,它被视为在野外使用的铬浏览器登录用户。 这是通过请求 https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1页面完成的

  3. ubertoken转换为网站会话 : 稍后,使用新创建的 ubertoken可以使用 https://accounts.google.com/MergeSession API 端点获得网站会话。在此步骤之后,应用程序基本上能够加载所有您可以在登录时使用浏览器打开的个人页面; 除了一些特殊页面,包括付款设置。

  4. 检索付费应用程序列表: 请求并解析 https://play.google.com/store/account页面

以下是“ 数据包捕获”捕获的应用程序流量:

Captured Traffic

因为它清晰可见的图片,最终的结果是相同的,当我通常打开商店的帐户页面在我的个人电脑上的 Chrome 桌面: Chrome view source

边注 :

这些端点似乎都没有文档记录,因为它们主要由 Google 自己的程序使用,应该被视为内部端点。因此,我强烈建议不要在您希望长时间运行的任何程序或代码中或在生产环境中使用它们。 此外,这里也有坏消息给你,它似乎谷歌播放的帐户页面只列出付费应用程序或特殊的免费应用程序(尤其是 OEM 应用程序)。我将尝试找出一些时间,并深入挖掘其他应用程序。

有趣的文章 :

口袋妖怪代币

利用 Google Chrome 的 OAuth2令牌

you can get the package name of all installed apps on device and then get the information of every installed package that you find in the device from google play without any need to get to user account. there is some third party or unofficial apis to get google play apps details as json by getting the app package name. for example: https://42matters.com/ 然后使用接收到的信息为每个包找到免费的。

我有两个资源可供你考虑,但首先,一句话,不行。没有来自谷歌的 API 让你做你想做的,因为这些指标不存储在手机中,他们是在谷歌播放商店服务器,谷歌没有正式的 API 为播放商店。然而,你可以从这两个网站收集一些信息:

在这里输入链接 https://www.quora.com/is-there-an-api-for-the-google-play-store

https://android.stackexchange.com/questions/162146/how-to-see-all-the-apps-i-have-downloaded-from-google-play-store

这足以让我们看看如何实现这一目标。

首先,只有帐户可以参考帐户下载的应用程序列表。这可以通过玩具店完成。既然你的应用程序将安装在该用户手机,这不重要... 你在。

第二,你需要一个第三方 API 建立的谷歌播放商店,有一些在那里,检查第一个链接。

使用您选择的 api,您将向 Play 商店发送一个 get 请求,在大多数情况下,作为回报,您应该收到一个要反序列化的 json 对象。

反序列化对象,就会得到列表。获得哪个列表将取决于所使用的端点,但这应该由/在 API 本身中解释。

祝你好运!

如果您有 root 访问权限,则可以访问 /data/data/com.android.vending/databases/library.db

OnePlus3T:/data/data/com.android.vending/databases
-rw-rw---- 1 u0_a2 u0_a2 229376 2018-12-26 18:01 library.db

This database has all information, which app you have downloaded, which apps you have purchased, and even in which app you have done IAP.

检查所有权表,它有所有的信息。

ownership (account STRING, library_id STRING, backend INTEGER, doc_id STRING, doc_type INTEGER, offer_type INTEGER, document_hash INTEGER, subs_valid_until_time INTEGER, app_certificate_hash STRING, app_refund_pre_delivery_endtime_ms INTEGER, app_refund_post_delivery_window_ms INTEGER, subs_auto_renewing INTEGER, subs_initiation_time INTEGER, subs_trial_until_time INTEGER, inapp_purchase_data STRING, inapp_signature STRING, preordered INTEGER, owned_via_license INTEGER, shared_by_me INTEGER, sharer_gaia_id TEXT, shareability INTEGER, purchase_time INTEGER, PRIMARY KEY (account, library_id, backend, doc_id, doc_type, offer_type))

处理非官方的 GoogleAPI 是一个非常复杂的领域。只有 有可能才能让它起作用,我只能说这么多。请自行承担风险。

你需要做的第一件事是 获得一个 Google Play 认证令牌。这可以通过几种方式实现,但是在购买应用程序中是这样做的:

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;
}

这里有几点需要注意:

  • 上面的代码 must be run asynchronously。我建议使用 RxJava,但是 AsyncTask 可以工作。
  • 您必须为要使用的帐户提供电子邮件。我将把细节留给你,但这是相当容易使用 AccountManager

有了认证令牌之后,现在就可以使用 访问任何 Google Play Store 端点了。购买应用程序使用的主要是 https://android.clients.google.com/fdfe/purchaseHistory。另一个你可能感兴趣的是 https://android.clients.google.com/fdfe/details?doc=(package name)(来自 APKfetch code)。这里有一个页面,里面有更多的分析。如果你对这些 API 发出请求,你需要提供几个头:

  • Authorization-"GoogleLogin auth=(your auth token)"
  • 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,从 广告 IdClient获得。
  • X-DFE-Client-Id-"am-android-google"
  • 设备的语言代码(如 "en")。

现在,你需要 分析响应。这就是事情变得棘手的地方。这些 API 返回一条编码为 普罗布夫的消息,因此除非您有模式(当然,只有 Google 有模式) ,否则它基本上只是二进制数据。从理论上讲,解决这个问题的一种方法是反编译 Google Play Store 应用程序,并使用像 JADX这样的工具重用它们生成的原型程序模型。

不幸的是,我已经试过了,但是没有效果。Protobuf 模型类对于标准反编译器来说太复杂了。您可以使用一个名为 PBTK的工具。您最好在 Google Play Store 6.1.12 APK 上运行这个版本,因为这是他们开始使用 ProGuard 之前的最后一个版本。请注意,这个程序的脚本中有两个错误需要在运行之前修复: 在 Gui.py中将 'extracto'改为 'extractor',并删除 Jar _ tract. py第500行的断言语句。

现在,它应该将所有响应类输出为。原型文件。在 src/main 下创建一个名为 proto的文件夹,并将生成的整个“ com”目录拖动到该文件夹中。你可以删除所有不在 com/google/android/finsky/protos下的内容。按照在线说明使用 Protobuf Lite 插件设置 Gradle。

当您想要解析一个响应时,您可以使用 ResponseWrapper 类,因为它们似乎都包含在。

我只能带你到这里了。很有可能我错了; JADX 是你在这里最好的朋友,因为找出一个应用程序正在做什么的最好方法是通过查看它的代码。希望这有所帮助,开心发展!