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

时间:2017-09-05 08:17:33

标签: android google-play google-oauth google-signin

我最近遇到了这个应用Purchase Apps,在我使用我的Google帐户登录后能够以某种方式检索我在Google Play中付费的应用。

我正在尝试了解它是如何完成的,因为我想构建一个类似的应用程序,但对于下载的免费应用程序。

但是,即使经过the entire list of APIs,我也无法找到用于检索该信息的OAuth API范围。

Google Sign in asking for access to androidmarket

编辑: 我正在对这个问题提出新的赏金,正如我提出的关于here的类似问题的建议,因为在这里和那里我没有看到关于如何做到的真正答案,以及什么可以完成它。

我想将问题细化为多个部分:

  1. 可以使用哪些API获取已购买应用的信息?我在哪里可以阅读它?请展示如何操作的完整实用示例。

  2. 可以做得更多吗?也许执行搜索?也许显示已安装的免费应用程序?也许是他们安装和卸载的时间?以及这些应用的类别?

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

  4. 编辑:我正在为此付出最大的赏金,因为无论我阅读和尝试了多少,我仍然无法制作可以从用户下载的Play商店查询应用程序的POC(名称,包裹名称,安装和/或删除日期,图标URL,价格...),包括付费和免费应用程序。

    如果有人找到了工作样本,请展示它是如何完成的,并展示您是如何找到它的(文档或任何导致您进入解决方案的内容)。我无法在任何地方找到它,而且目前的解决方案对我来说太模糊了。

6 个答案:

答案 0 :(得分:43)

最新更新:

这是一个错误,Google将在下次更新时解决此问题。

  

我们已将此问题推迟到将来的版本中考虑。谢谢   你有时间让Android更好

这个答案已经变成了一个集合的想法,并经过编辑,以包含评论中讨论的信息。

androidmarket api将是开发人员编写的自定义api。它不向公众开放。

在评论中解决您的疑虑。开发人员可以利用Android Developer和Google提供的当前apis创建一个管理所有这些的项目。

至于访问Full Account Access,我不确定这些开发人员是如何实现这一目标的。

我建议使用AccountManager,它是android.accounts的一部分,可以访问凭据和方法getUserData。客户经理可以访问密码,并且能够创建和删除帐户。这可能与Content Provider

一起使用

请参阅Udinic/SyncAdapter Authentication

回复你的评论:

此博客应该可以帮助您入门。 Write your own Android Authenticator

这些应用程序实际上是如何工作的,我无法告诉你。他们也可能有不同的实现(除非他们是幕后的协作工作,他们肯定会有所不同)。

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

scope的定义,用于确定授予应用程序权限的范围。

使用requestScopes()

public static final String PROFILE

  

... /它可让您的网络应用安装无线Android应用。

example

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

如果可以获得完全访问权限,则可以找到帐户持有者使用的所有应用程序的列表,并将其与设备上的内容进行比较。

Package Manager将检索设备上当前安装的所有应用的列表 PackageInfo提供有关该应用的详细信息 INSTALL_REASON_USER还会过滤掉用户主动安装的应用程序。

您可能希望查看com.google.firebase.appindexingLog User Actions。可以跟踪不同的actions

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

有用的链接是OAuth 2.0 Playground

这个使用节点的github repo node-google-play是最新的,将调用Google Play API。正如用作“非官方”api android-market-api的档案一样,用于查询市场。

App 1

app claims使用以下权限:

  

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

     

其他

     
      
  • 从互联网接收数据
  •   
  • 查看网络连接
  •   
  • 完全网络访问
  •   
  • 在设备上使用帐户
  •   
  • 防止设备睡眠
  •   
  • 阅读Google服务配置
  •   

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

我检查了权限 - 没有设置。因此,唯一需要的是接受弹出窗口,如问题所示。

App 2

您提到的另一个应用程序也可以更好地处理正在访问的内容。

My Paid Apps

  

安全/隐私声明
  首次运行此应用时,它会要求您的Google帐户获得完全许可。不幸的是,这是   访问所需信息的唯一方法。不是个人的   信息已存储,不会共享有关您的应用的信息   此应用程序的开发人员,也不与任何第三方共享。   一切都只保存在手机上。

我在this blog post中详细介绍了这些应用程序,这是针对大学顶点项目(没有金钱收益)。我倾向于认为这是API中的漏洞,而不是谷歌设计的状态,因为没有API调用来获取除开发者自己的应用之外的应用程序的购买。我假设这是一个零日攻击,在这种情况下,没有合法的方式来访问这些信息。

答案 1 :(得分:10)

如果是其中一个应用程序(My Paid Apps),在检查网络流量后,很明显它确实使用Store帐户页面来检索付费应用程序列表。 现在,它使用的机制与Google Chrome目前使用的机制相同,而Pokemon GO据称在某个时间点使用。

简而言之,执行此操作的步骤如下:

  1. <强>登录: 所提到的程序第一步所做的是将用户登录并访问用户的访问令牌。为此,它使用android.accounts.AccountManager.getAuthToken()方法。 (查看更多:AccountManager) 但是,对于令牌范围,请求oauth2:https://www.google.com/accounts/OAuthLogin。 可能需要注意的是,根据Google的OAth2 documentation,此范围无效;但是,它似乎是Google OAuth v1的有效范围。

  2. 将新检索的访问令牌转换为ubertoken : 现在,实际上ubertoken应该做什么,是未知的,并且没有关于它的官方文档。但是,Chrome浏览器使用它来登录用户。 这是通过请求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页面。

  5. 以下是&#39; Packet Capture&#39; 捕获的应用流量:

    Captured Traffic

    由于图片中清晰可见,最终结果与我通常使用Chrome桌面在我的电脑上打开商店帐户页面时的结果相同: Chrome view source

    旁注

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

    有趣的文章

    Pokemon tokens

    Exploiting Google Chrome's OAuth2 Tokens

答案 2 :(得分:2)

如果您具有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

此数据库包含所有信息,您已下载的应用程序,已购买的应用程序,甚至已完成的应用程序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))

答案 3 :(得分:0)

使用非官方的Google API进行交易非常复杂。要使此功能生效,将是可能,但这就是我要说的。后果自负。

您要做的第一件事是获取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;
}

这里需要注意的几件事:

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

获得身份验证令牌后,您现在可以访问任何Google Play商店端点。购买的应用使用的主要类型是https://android.clients.google.com/fdfe/purchaseHistory。您可能感兴趣的另一个是https://android.clients.google.com/fdfe/details?doc=(package name)(来自APKfetch code)。 Here's a page with some more and some analysis.如果您对这些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-从AdvertisingIdClient获取的设备的Google Services Framework ID。
  • X-DFE-Client-Id-"am-android-google"
  • Accept-Language-设备的语言代码,例如"en"

现在,您需要解析响应。这是棘手的地方。这些API返回一条编码为Protobuf的消息,因此,除非您具有架构(当然只有Google拥有),否则它基本上只是二进制数据。从理论上讲,解决此问题的一种方法是对Google Play商店应用进行反编译,并使用JADX之类的工具重复使用其生成的protobuf模型。

不幸的是,我已经尝试过了,但实际上并没有用。对于标准反编译器而言,Protobuf模型类太复杂了。您可以使用名为PBTK的工具。您最好在Google Play商店6.1.12 APK上运行它,因为那是他们开始使用ProGuard之前的最新版本。请注意,该程序的脚本中有两个错误需要在运行前修复:在 gui.py 中将'extracto'更改为'extractor'并删除行中的断言语句500个 jar_extract.py

现在,这应该将所有响应类输出为.proto文件。在src / main下创建一个名为proto的文件夹,并将整个生成的'com'目录拖到该文件夹​​中。您可以删除com/google/android/finsky/protos下的所有内容。遵循在线说明,使用Protobuf Lite插件设置Gradle。

要解析响应时,可以使用ResponseWrapper类,因为它们似乎都包含在该类下。

那是我能带给你的。我很有可能会对此有所误解。 JADX是您最好的朋友,因为找出应用程序运行状况的最佳方法是查看其代码。希望这会有所帮助,并乐于发展!

答案 4 :(得分:-2)

您可以获取设备上所有已安装应用程序的程序包名称,然后无需使用用户帐户即可从google play获得设备中找到的每个已安装程序包的信息。有一些第三方或非官方的api可以通过获取应用程序包名称来将google play应用程序的详细信息获取为json。例如:https://42matters.com/ 然后使用收到的信息获取每个软件包的价格。

答案 5 :(得分:-2)

我有两个资源供您考虑,但首先,没有。 GOOGLE没有api可以让您做自己想做的事,因为这些指标没有存储在手机中,它们在google play store伺服器上,并且google没有用于play store的正式api。您可以从这两个站点中收集一些信息:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store enter link description here

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

这足以了解如何完成此任务。

首先,该帐户只能引用某个帐户已下载哪些应用程序的列表。这可以通过Play商店来完成。由于您的应用程序将安装在该用户的手机上,因此这无关紧要……您正在使用。

第二步,您将需要为GOOGLE PLAY STORE构建的第三方API,那里有一些API,请检查第一个链接。

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

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

祝你好运!