web-dev-qa-db-fra.com

Comment obtenir la liste des applications téléchargées (payantes/gratuites) par un utilisateur de Google Play?

Je suis récemment tombé sur cette application Purchase Apps , qui est en quelque sorte capable de récupérer des applications que j'ai payées dans Google Play après m'être connecté à l'aide de mon compte Google. 

J'essaie de savoir comment cela se passe car je souhaite créer une application similaire, mais pour les applications gratuites téléchargées. 

Cependant, je ne trouve pas quelle étendue d'API OAuth a été utilisée pour extraire ces informations, même après avoir parcouru la liste complète des API .

 Google Sign in asking for access to androidmarket


EDIT: Je mets une nouvelle prime à cette question, comme suggéré par une question similaire que j'ai posée à propos de ici , et parce qu'ici et là je ne vois pas de vraie réponse sur la façon de le faire et ce qui peut être fait avec.

J'aimerais affiner les questions en plusieurs parties:

  1. Quelle est l'API qui peut être utilisée pour obtenir des informations sur les applications achetées? Où puis-je lire à ce sujet? S'il vous plaît montrer un exemple complet, de travail de la façon de le faire.

  2. Peut-il faire plus? Peut-être effectuer une recherche? Peut-être afficher les applications gratuites installées? Peut-être le moment où ils ont été installés et désinstallés? Et les catégories de ces applications?

  3. Existe-t-il des exigences particulières pour utiliser cette API?


EDIT: Je mets une prime maximale sur cela, parce que peu importe combien j'ai lu et essayé, je n'ai toujours pas réussi à faire un POC qui peut interroger les applications du Play Store que l'utilisateur a déjà téléchargées (nom, paquet nom, date d'installation et/ou de suppression, URL de l'icône, prix ...), y compris les applications payantes et gratuites.

Si quelqu'un trouve un exemple de travail, montrez-en la procédure et montrez-le également (documentation ou tout ce qui vous a conduit à la solution). Je ne le trouve nulle part et les solutions actuelles sont trop vagues pour que je puisse commencer.

115
abhiank

Dans le cas d'une de ces applications (Mes applications payées), après vérification du trafic réseau, il est assez évident qu'il utilise la page Compte du magasin pour récupérer la liste des applications payantes . Maintenant, le mécanisme utilisé est le même. mécanisme actuellement utilisé par Google Chrome, et que Pokemon GO soit censé être utilisé à un moment donné.

En bref, voici les étapes à suivre:

  1. Login: Le programme mentionné pour la première étape consiste à connecter l'utilisateur et à accéder à son jeton d'accès. Pour ce faire, il utilise la méthode Android.accounts.AccountManager.getAuthToken(). (Voir plus: AccountManager ) Cependant, en ce qui concerne la portée du jeton, oauth2:https://www.google.com/accounts/OAuthLogin est demandé . Il peut être important de noter que, selon la documentation OAth2 de Google, cette portée est pas valide; Cependant, cela semble être une étendue valide pour Google OAuth v1.

  2. Conversion du jeton d'accès nouvellement récupéré en un ubertoken: Maintenant, ce que ubertoken est supposé faire est inconnu et il n'existe aucune documentation officielle à ce sujet. Cependant, il a été constaté que, dans la nature, le navigateur Chrome utilisait pour se connecter aux utilisateurs . Pour cela, il suffit de demander la page https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1.

  3. Conversion de ubertoken en session de site Web: Plus tard, en utilisant la nouvelle ubertoken créée, il est possible d'obtenir une session de site Web à l'aide du point de terminaison de l'API https://accounts.google.com/MergeSession. Après cette étape, l’application est essentiellement capable de charger toutes les pages personnelles que vous pouvez ouvrir à l’aide de votre navigateur lorsque vous êtes connecté; sauf certaines pages spéciales, y compris les paramètres de paiement.

  4. Récupération de la liste des applications payantes: Demander et analyser la page https://play.google.com/store/account.

Suit le trafic de l'application capturé par ' Capture de paquet ':

 Captured Traffic

Comme il est clairement visible sur l'image, le résultat final est identique à ce que je reçois lorsque j'ouvre normalement la page du compte du magasin sur mon PC avec Chrome Desktop:  Chrome view source

Note latérale

Il semble qu'aucun de ces terminaux ne soit documenté car ils sont principalement utilisés par les propres programmes de Google et doivent donc être considérés comme internes. Par conséquent, je vous recommande vivement de ne pas les utiliser dans les programmes ou les codes que vous prévoyez d'exécuter pendant une longue période ou dans un environnement de production . répertorie les applications payantes ou les applications gratuites spéciales (plus particulièrement les applications OEM). Je vais essayer de trouver un peu de temps et de creuser plus profondément dans l’autre application.

Articles intéressants:

Jetons Pokemon

Exploiter les jetons OAuth2 de Google Chrome

10
Soroush Falahati

Si vous avez un accès root, vous pouvez accéder à /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

Cette base de données contient toutes les informations, l'application que vous avez téléchargée, les applications que vous avez achetées et même l'application dans laquelle vous avez effectué IAP.

Vérifiez la table de propriété, elle contient toutes les informations.

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
nkalra0123

Traiter avec des API Google non officielles est un territoire incroyablement compliqué. Cela va être possible pour que cela fonctionne, mais c'est tout ce que je vais dire. Procédez à vos risques et périls.

La première chose à faire est de obtenir un jeton d'authentification Google Play. Cela peut être fait de plusieurs manières, mais voici comment ils le font dans les applications achetées:

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

Quelques points à noter ici:

  • Le code ci-dessus doit être exécuté de manière asynchrone. Je recommande RxJava, mais un AsyncTask fonctionnera.
  • Vous devez fournir un email pour le compte que vous souhaitez utiliser. Je vous laisse les détails, mais c'est assez facile avec AccountManager.

Une fois que vous avez un jeton d’authentification, vous pouvez désormais accéder à n’importe quel point de terminaison Google Play Store. Le code principal utilisé par les applications achetées est https://Android.clients.google.com/fdfe/purchaseHistory. Un autre élément susceptible de vous intéresser est https://Android.clients.google.com/fdfe/details?doc=(package name) (from APKfetch code ). Voici une page avec quelques analyses supplémentaires. Si vous faites une demande à ces API, vous devrez fournir plusieurs en-têtes:

  • 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 - Identifiant Google Services Framework de votre appareil, obtenu à partir de AdvertisingIdClient .
  • X-DFE-Client-Id - "am-Android-google"
  • Accept-Language - Le code de langue du périphérique, par exemple "en".

Maintenant, vous devez analyser la réponse. Voici où les choses deviennent difficiles. Ces API retournent un message codé en tant que Protobuf , il s’agit donc essentiellement de données binaires, sauf si vous avez un schéma (que seul Google a bien sûr). Une façon de procéder en théorie consiste à décompiler l'application Google Play Store et à réutiliser les modèles de protobuf générés avec un outil tel que JADX .

Malheureusement, j'ai essayé cela et ça ne marche pas vraiment. Les classes de modèle Protobuf sont tout simplement trop complexes pour un décompilateur standard. Ce que vous pouvez utiliser est un outil appelé PBTK . Vous voudrez idéalement exécuter ceci sur l'APK Google Play Store 6.1.12, car c'est la dernière version avant l'utilisation de ProGuard. Notez que ce programme comporte deux erreurs dans son script qui doivent être corrigées avant de l'exécuter: remplacer 'extracto' par 'extractor' dans gui.py et supprimer l'instruction d'assertion à la ligne 500 de jar_extract.py

Maintenant, cela devrait afficher toutes les classes de réponses sous forme de fichiers .proto. Créez un dossier sous src/main appelé proto et faites-y glisser tout le répertoire 'com' généré. Vous pouvez supprimer tout ce qui n'est pas sous com/google/Android/finsky/protos. Suivez les instructions en ligne pour installer Gradle avec le plugin Protobuf Lite.

Lorsque vous souhaitez analyser une réponse, vous pouvez utiliser la classe ResponseWrapper, car elles semblent toutes être contenues sous celle-ci.

C'est à peu près aussi loin que je peux vous emmener. Il y a de bonnes chances que je me trompe un peu; JADX est votre meilleur ami ici, car le meilleur moyen de savoir ce qu’une application fait est de regarder son code. J'espère que cela aide et heureux développement!

0
qualverse