Google Playからユーザーがダウンロードしたアプリ(有料/無料)のリストを取得するにはどうすればよいですか?


121

私は最近このアプリを購入しました。アプリを購入します。これは、Googleアカウントを使用してサインインした後、Google Playで支払ったアプリを何らかの方法で取得できます。

同様のアプリを作成したいのですが、ダウンロードされた無料のアプリについては、どのように行われているのかを調べています。

ただし、APIのリスト全体を調べた後でも、その情報を取得するために使用されたOAuth APIスコープを見つけることができません。

androidmarketへのアクセスを要求するGoogleログイン


編集:私がここで尋ねた同様の質問によって示唆されているように、私はこの質問に新しい報奨金を入れていますそれと。

質問を複数の部分に絞り込みたい:

  1. 購入したアプリの情報を取得するために使用できるAPIは何ですか?それについてどこで読むことができますか?それを行う方法の完全で実用的な例を示してください。

  2. もっとできる?多分検索を実行しますか?インストールされた無料のアプリを表示しますか?多分それらがインストールされ、アンインストールされた時間ですか?そして、それらのアプリのカテゴリは?

  3. このAPIを使用するための特別な要件はありますか?


編集:私はこれに最大の恵みをかけています、私がどれだけ読んで試したかに関係なく、私はまだユーザーがダウンロードしたPlayストアからアプリをクエリできるPOCを作成することに失敗しました(名前、パッケージ)名前、インストールおよび/または削除された日付、アイコンURL、価格...)、有料アプリと無料アプリの両方を含みます。

誰かが実用的なサンプルを見つけた場合は、それがどのように行われたかを示し、それについてどのように見つけたかを示します(ドキュメントまたはソリューションに導いた何か)。私はそれをどこにも見つけることができません、そしてここでの現在の解決策は私が始めるには曖昧すぎます。



サンプルのアプリランチャーを見てみましょう。スマートフォンにダウンロードされているアプリを認識しています。
danny117

@android開発者:Purchase Appsapkファイルを逆コンパイルで分析しました。購入したアプリのリストを取得するためにAPIを使用したことはありません。そのアプローチは、プレイストアのWebページのhtmlコンテンツを解析する方法と同じです。これがこのコードの一部です:hastebin.com/uceyavurij.js
アミノグラフィー

@aminographyでは、ユーザーにどのように提供するのでしょうか。結局のところ、ユーザーのGoogleアカウントのデータを取得する必要があります... Playストアアプリにアクセスするだけでは十分ではありません...付与された権限で何をしますか?
Android開発者

@androiddeveloper:によって提供されるすべての情報はPurchased Apps、playstore Webコンテンツから取得できます。残念ながら、Google Playからアプリを購入することができません。アプリを購入したアカウントを共有していただければ、サンプルコードを開発いたします。
アミノグラフィー

回答:


51

問題は解決されました。エクスプロイトはクローズされました。

Androidのプレビューバージョンにログインしているため、このバグをクローズします。問題が最新の公開リリース(Android Q)で依然として関連性があり再現可能な場合は、バグレポートをキャプチャして、https: //source.android.com/setup/contribute/report-bugsにバグを記録してください。14日以内に返信がない場合、この問題は解決されます。ご理解のほどよろしくお願いいたします。


最新の更新:

これはバグであり、Googleは次のアップデートで対処する予定です。

この問題は、将来のリリースでの検討のために延期しました。Androidを改善する時間をいただきありがとうございます


この回答はアイデアの集まりになり、コメントにディスカッションの情報が含まれるように編集されました。

androidmarketAPIは、カスタマイズされただろうAPI開発者によって書かれました。一般には公開されていません。

コメントであなたの懸念に対処するため。開発者は、Android開発者とGoogleを通じて利用可能な現在のAPIを利用して、これらすべてを管理するプロジェクトを作成しました。

アクセスについては Full Account Access、これらの開発者がどのようにしてこれを達成したのか正確にはわかりません。

android.accountsの一部であるAccountManagerを使用して、資格情報とgetUserDataメソッドにアクセスできるようにすることをお勧めします。アカウントマネージャーはパスワードにアクセスでき、アカウントを作成および削除できます。これは、コンテンツプロバイダーで使用される可能性があります

Udinic / SyncAdapter Authenticationを参照してください。

コメントに返信するには:

このブログは、始めるのに役立つはずです。 独自のAndroid認証システムを作成します


これらのアプリが実際にどのように機能するか、私には言えません。また、実装が異なる場合もあります(舞台裏での共同作業でない限り、間違いなく異なります)。

1つの推測。まず、com.google.android.gms.auth.api.signinでGoogleSignInAccountを 使用します。

アプリに付与される権限の範囲を決定するためのスコープの定義があります。

requestScopes()を使用する と、

public static final String PROFILE

... / Webアプリから無線のAndroidアプリインストールにアクセスできます。

以下の場合の例

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

フルアクセスを取得できる場合は、アカウント所有者が使用するすべてのアプリのリストを見つけて、デバイス上のものと比較できます。

パッケージマネージャーは、デバイスに現在インストールされているすべてのアプリのリストを取得します。
PackageInfoはアプリに関する詳細を提供します。
INSTALL_REASON_USERは、ユーザーがアクティブにインストールしたアプリも除外します。

com.google.firebase.appindexingおよびLog User Actionsを確認することをお勧めします。さまざまなアクションを追跡できます。

ユーザーアカウントの履歴はhttps://myactivity.google.com/myactivityにあります

役立つリンクはOAuth 2.0 Playgroundです。


nodeを使用するこのgithub repo node-google-playは最新であり、Google Play APIを呼び出します。「非公式な」API android-market-apiとして使用されたアーカイブをマーケットプレイスにクエリしたように。


アプリ1

アプリは主張し、次のアクセス許可を使用します:

バージョン2.1.8は以下にアクセスできます:
$アプリ内購入

その他の

  • インターネットからデータを受信する
  • ネットワーク接続を表示する
  • 完全なネットワークアクセス
  • デバイスでアカウントを使用する
  • デバイスがスリープしないようにする
  • Googleサービスの設定を読む

注目に値するのは、基本的なインストールがあったときに、アプリが権限を設定しないことです。有料アプリがないため、どの機能も使用できませんでした。つまり、最初の検索では、必要な権限はありませんでした。これは、アプリが私のアカウントにアクセスできないことを示しています。

権限を確認したところ、何も設定されていませんでした。したがって、必要なのは、質問に表示されているポップアップを受け入れることだけでした。


アプリ2

同じことをするあなたが参照する他のアプリは、アクセスされているものについてより前向きです。

有料アプリ

セキュリティ/プライバシーに関する通知
このアプリを初めて実行すると、Googleアカウントへの完全な許可が求められます。残念ながら、これが必要な情報にアクセスする唯一の方法です。個人情報が保存されたり、アプリに関する情報がこのアプリの開発者と共有されたり、第三者と共有されたりすることはありません。すべてが携帯電話にのみ保存されます。


このブログ投稿では、これらのアプリについて詳しく説明しました。これは、大学の頂点プロジェクト(金銭的利益なし)のためのものでした。開発者自身のアプリ以外のアプリの購入を取得するAPI呼び出しがないため、これはAPIの悪用であり、Googleの設計によるステータスではないと思います。私はそれがゼロデイの悪用であると仮定します。その場合、この情報にアクセスする正当な方法はありません。


10

これらのアプリケーションの1つ(有料アプリ)の場合、ネットワークトラフィックを確認した後、ストアのアカウントページを使用して有料アプリケーションのリストを取得していることは明らかです。現在、それが使用するメカニズムは、Google Chromeと同じメカニズムであり、ポケモンGOはある時点で使用されていると考えられています。

簡単に言えば、そのための手順は次のとおりです。

  1. ログイン:最初のステップで言及したプログラムが行うことは、ユーザーをログインさせ、ユーザーのアクセストークンにアクセスすることです。そのために、android.accounts.AccountManager.getAuthToken()メソッドを使用します。(詳細:AccountManager)ただし、トークンのスコープに関してoauth2:https://www.google.com/accounts/OAuthLoginはリクエストされます。Google のOAth2ドキュメントに基づいて、このスコープは無効であることに注意することが重要な場合があります。ただし、Google OAuth v1の有効なスコープのようです。

  2. 新たに取得したアクセストークンをaに変換するubertoken:実際には何をすべきかubertokenは不明であり、公式のドキュメントはありません。ただし、Chromeブラウザがユーザーのログインに使用するのは一般的です。これは、https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1ページを要求することによって行われます。

  3. ubertokenWebサイトセッションへの変換:後で、新しく作成されubertokenhttps://accounts.google.com/MergeSessionAPIエンドポイントを使用してWebサイトセッションを取得することが可能です。このステップの後、アプリケーションは基本的に、ログイン中にブラウザーを使用して開くことができるすべての個人用ページをロードすることができます。支払い設定を含むいくつかの特別なページを除いて。

  4. 有料アプリケーションのリストの取得:https://play.google.com/store/accountページの リクエストと解析。

以下は、「パケットキャプチャ」によってキャプチャされたアプリケーションのトラフィックです

キャプチャされたトラフィック

写真にはっきりと表示されているため、最終結果は、ChromeデスクトップがインストールされているPCでストアのアカウントページを通常開いたときに得られるものと同じです。 Chromeビューソース

サイドノート

これらのエンドポイントはいずれも文書化されていないようです。これらは主にGoogle独自のプログラムで使用されており、内部で使用する必要があるためです。したがって、長期間実行する予定のプログラムやコード、または運用環境では使用しないことを強くお勧めします。また、ここにも悪いニュースがあります。GooglePlayのアカウントページには、有料アプリまたは特別な無料アプリ(特にOEMアプリ)しかリストされていないようです。少し時間を見つけて、他のアプリケーションをさらに掘り下げてみます。

興味深い記事

ポケモントークン

Google ChromeのOAuth2トークンを利用する


1
それがどのように機能するかを確認するために完全なサンプルを見せて、私が尋ねた質問に答えてもらえますか?私が書いたように、各アプリに関するさまざまな情報(価格、購入時など)を取得したい...無料アプリのリストを取得することもできますか?
Android開発者

3

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))

1

非公式の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コードから)です。これは、いくつかの分析と分析を含むページです。 これらの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、AdvertisingIdClient
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language-デバイスの言語コード"en"

次に、応答解析する必要があります。ここで問題が発生します。これらのAPIはProtobufとしてエンコードされたメッセージを返すため、スキーマ(もちろん、Googleだけが持っている)がない限り、それは本質的に単なるバイナリデータです。理論的にはこれについて移動するための一つの方法では、Google Playストアアプリを逆コンパイルなどのツールで自分の生成いるProtobufモデルを再利用することであるJADX

残念ながら、私はこれを試しましたが、実際には機能しません。Protobufモデルクラスは、標準の逆コンパイラでは複雑すぎます。使用できるのはPBTKというツールです。Google Playストア6.1.12 APKで実行するのが理想的です。これは、ProGuardを使い始める前の最後のバージョンであるためです。このプログラムのスクリプトには、実行前に修正する必要のある2つのエラーがあることに注意してください。gui.pyに変更'extracto'することと'extractor'jar_extract.pyの 500行目のアサーションステートメントを削除することです

これで、すべての応答クラスが.protoファイルとして出力されます。呼び出されるsrc / mainの下にフォルダーを作成し、proto生成された「com」ディレクトリ全体をそのフォルダーにドラッグします。の下にないものはすべて削除できますcom/google/android/finsky/protos。オンラインの指示に従って、Protobuf Liteプラグインを使用してGradleをセットアップします。

応答を解析する場合は、ResponseWrapperクラスを使用できます。それらはすべてその下に含まれているように見えるためです。

それは私があなたを連れて行くことができる限りです。私はこれの一部が間違っている可能性が高いです。JADXはここでの親友です。アプリが何をしているかを理解するための最良の方法は、そのコードを調べることです。これがお役に立てば幸いです。


についてAccountManager、まだご利用いただけますか?今日、Googleは使用するオプションのみを提供していると思いますAccountPicker(ここでは、stackoverflow.com / a / 26888259/878126のように)。しかし、残りをどのように実行しますか?あなたはそれをテストしましたか?うまくいきましたか?そのためのコードを共有してください。それが私が賞金を設定した理由です、それが実際に機能するのを見る...
アンドロイド開発者

うんAccountPickerは実際にはより良いアイデアです。そして、はい、私はトークンを取得するためのコードを試しましたが、それはうまくいきます。すべてが順調に進んだ場合、少なくとも5時間はかかるので、残りは試していません。500の賞金でもそれだけの価値はありません。
クォーバース2018

1
ただし、認証トークンを取得するための完全なコードは次のとおりです(スクリーンショットのpuchasedアプリと同じように機能します):github.com/ethanblake4/PlayStoreDemo
qualverse

auth-tokenを取得することはうまくいくようです。しかし、私が考える困難な部分は、アプリ自体のフェッチです:(
android developer

はい、それは残念ながら多くの仕事をする部分です。しかし、私は購入したアプリのコードを逆コンパイルしました。それがそこで行われた方法です。上記の手順についてサポートが必要な場合は、遠慮なくお知らせください。
1

-2

デバイスにインストールされているすべてのアプリのパッケージ名を取得し、ユーザーアカウントにアクセスする必要なく、デバイスで見つかったすべてのインストール済みパッケージの情報をGoogle Playから取得できます。アプリのパッケージ名を取得して、jsonとしてGoogle Playアプリの詳細を取得するためのサードパーティまたは非公式のAPIがあります。例:https : //42matters.com/ 次に、受け取ったすべてのパッケージの情報を使用して、無料のパッケージを見つけます。


いいえ、私が報奨金を出している質問は、ユーザーが今までにインストールしたアプリであり、現在インストールされているアプリだけではありません。また、公式な方法があるのに、なぜ非公式を使用するのか...
Android開発者

@androiddeveloperグーグルプレイでパッケージ名を取得してアプリの詳細を取得する公式のAPIはないと思います。公式のAPIはありますか?
Bahman

@androiddeveloperグーグルはすべてのユーザーのためにアンインストールされた無料アプリの名前を保持しますか?
2018

はい。Playストアアプリを開いた場合は、nav-drawerに移動してから、[マイアプリとゲーム]に移動します。現在インストールされているアプリだけでなく、そこからこれまでにインストールしたすべてのアプリが表示されます。そしてGoogleによれば、このAPIを使用することは許可されています(または少なくとも彼らはそれを言っているようです):issuetracker.google.com/issues/79195087。または、私と話をした人は誰もそこで何が起こっているのかよくわかりません...
Android開発者

-2

検討すべきリソースは2つあります。GOOGLEからAPIを使用して必要な操作を行うことはできません。これらのメトリックは電話に保存されていないため、Google Playストアサーボにあり、GoogleにはPlayストア用の公式APIがありません。ただし、次の2つのサイトからいくつかの情報を収集できます。

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store リンクの説明をここに入力してください

/android/162146/how-to-see-all-the-apps-i-have-downloaded-from-google-play-store

これは、これを達成する方法を確認するには十分です。

まず、アカウントがダウンロードしたアプリのリストは、そのアカウントだけが参照できます。これはPlayストアから行うことができます。アプリがそのユーザーの電話にインストールされるので、これは重要ではありません...

次に、GOOGLE PLAY STORE用に構築されたサードパーティのAPIが必要です。いくつかあります。最初のリンクを確認してください。

選択したapiを使用して、getリクエストをPlayストアに送信します。代わりに、ほとんどの場合、デシリアライズするjsonオブジェクトを受け取ります。

オブジェクトを逆シリアル化すると、リストが作成されます。取得するリストは、使用するエンドポイントによって異なりますが、API自体で説明する必要があります。

幸運を!


そこにあるすべてのリンクには、現在のユーザーがインストールしたアプリのリストを取得するリンクはありません。ログインフェーズすらありません。それらはすべて、ユーザーがアプリをインストールしたかどうかにかかわらず、アプリに関する一般的な情報を収集します。
Androidデベロッパー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.