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


121

Je suis récemment tombé sur cette application acheter des applications , ce qui est en quelque sorte en mesure de récupérer des applications que j'ai payé dans le jeu de Google après avoir signé à l' aide de mon compte Google.

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

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

Connectez-vous à Google pour demander l'accès à Androidmarket


EDIT: Je mets une nouvelle prime sur cette question, comme suggéré par une question similaire que j'ai posée 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 ça.

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? Veuillez montrer un exemple complet et fonctionnel de la façon de procéder.

  2. Peut-il faire plus? Peut-être effectuer une recherche? Peut-être afficher les applications gratuites qui ont été installées? Peut-être à quelle heure 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 l'utilisation de cette API?


EDIT: Je mets une prime maximale à ce sujet, car peu importe ce que j'ai lu et essayé, je n'ai toujours pas réussi à créer un POC capable d'interroger les applications du Play Store que l'utilisateur a déjà téléchargées (nom, package nom, date d'installation et / ou de suppression, icône URL, prix ...), y compris les applications payantes et gratuites.

Si quelqu'un trouve un exemple fonctionnel, montrez comment cela est fait et montrez également comment vous l'avez trouvé (documentation ou tout ce qui vous a conduit à la solution). Je ne le trouve nulle part, et les solutions actuelles ici sont trop vagues pour que je puisse commencer.



Je regarderais l'exemple de lanceur d'application. Il sait quelles applications sont téléchargées sur le téléphone.
danny117

@android developer: j'ai analysé le Purchase Appsfichier apk par décompilation. Il n'a jamais utilisé d'API pour obtenir la liste des applications achetées. Son approche est la même que celle que nous savons qui analyse le contenu html de la page Web du Play Store. Voici un fragment de ce code: hastebin.com/uceyavurij.js
aminographie

@aminographie Alors, comment l'obtient-il pour l'utilisateur? Après tout, il doit obtenir les données du compte Google de l'utilisateur ... Il ne suffit pas d'accéder aux applications Play Store ... Que fait-il avec les autorisations qui lui sont accordées?
développeur android

@androiddeveloper: toutes les informations fournies par Purchased Appspeuvent être récupérées à partir du contenu Web Playstore. Malheureusement, je n'ai pas accès pour acheter une application sur Google Play. Si vous me partagez un compte avec une application achetée, je peux développer un exemple de code pour vous.
aminographie

Réponses:


51

Le problème est résolu. L'exploit a été clos.

Nous allons fermer ce bogue en raison de la connexion dans une version préliminaire d'Android. Si le problème est toujours pertinent et reproductible dans la dernière version publique (Android Q), veuillez capturer un rapport de bogue et consigner le bogue sur https://source.android.com/setup/contribute/report-bugs . Si aucune réponse n'est reçue dans les 14 prochains jours, ce problème sera résolu. Merci de votre compréhension.


Dernière mise à jour:

Il s'agit d'un bug et Google le corrigera dans la prochaine mise à jour.

Nous avons reporté ce problème pour examen dans une prochaine version. Merci pour votre temps pour améliorer Android


Cette réponse s'est transformée en un conglomérat d'idées et a été modifiée pour inclure les informations issues de la discussion dans les commentaires.

L' androidmarketAPI serait une API personnalisée écrite par le développeur. Il n'est pas accessible au public.

Pour répondre à vos préoccupations dans les commentaires. Le développeur aurait utilisé les API actuelles disponibles via Android Developer et Google pour créer un projet qui gère tout cela.

En ce qui concerne l'accès Full Account Access, je ne sais pas exactement comment ces développeurs ont réalisé cela.

Je recommanderais d'utiliser AccountManager , qui fait partie de android.accounts, a accès aux informations d'identification et à une méthode getUserData . Le gestionnaire de compte a accès aux mots de passe et est capable de créer et de supprimer des comptes. Ceci, éventuellement utilisé avec le fournisseur de contenu

Voir Authentification Udinic / SyncAdapter .

Pour répondre à votre commentaire:

Ce blog devrait vous aider à démarrer. Écrivez votre propre authentificateur Android .


Comment fonctionnent ces applications, je ne peux pas vous le dire. Ils peuvent également avoir des implémentations différentes (à moins qu'il ne s'agisse d'un effort de collaboration en coulisse, ils seront très certainement différents).

Une supposition. Utilisez d'abord GoogleSignInAccount avec com.google.android.gms.auth.api.signin .

Il existe une définition de l' étendue , pour déterminer l'étendue des autorisations accordées à l'application.

En utilisant requestScopes () , le

public static final String PROFILE

... / Il permet à votre application Web d'accéder aux installations d'applications Android en direct.

Par exemple :

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

Si un accès complet peut être obtenu, une liste de toutes les applications utilisées par le titulaire du compte peut être trouvée et comparée à ce qui se trouve sur l'appareil.

Package Manager récupérera une liste de toutes les applications actuellement installées sur l'appareil.
PackageInfo fournit les détails sur l'application.
INSTALL_REASON_USER filtrera également les applications qui ont été activement installées par l'utilisateur.

Vous pouvez consulter com.google.firebase.appindexing et enregistrer les actions des utilisateurs . Différentes actions peuvent être suivies.

L'historique du compte des utilisateurs se trouve à l' adresse https://myactivity.google.com/myactivity .

Un lien utile est le terrain de jeu OAuth 2.0 .


Ce github repo node-google-play , utilisant node, est à jour et appellera les API Google Play. De même que l'archive qui a été utilisée comme une API "non officielle", android-market-api , pour interroger le marché.


Appli 1

L' application prétend utiliser les autorisations suivantes:

La version 2.1.8 peut accéder à:
$ Achats intégrés

Autre

  • recevoir des données d'Internet
  • afficher les connexions réseau
  • accès réseau complet
  • utiliser des comptes sur l'appareil
  • empêcher l'appareil de dormir
  • lire la configuration du service Google

Il convient de noter que l'application ne définit aucune autorisation lorsqu'il y a une installation de base. Je n'ai pu utiliser aucune des fonctionnalités, car je n'ai aucune application payante. Donc, pour la recherche initiale, aucune autorisation n'était nécessaire, ce qui indiquerait que l'application n'avait pas accès à mon compte.

J'ai vérifié les autorisations - il n'y en avait pas. Donc, la seule chose requise était d'accepter la fenêtre contextuelle, comme indiqué dans votre question.


App 2

L'autre application à laquelle vous faites référence qui fait la même chose est plus directe sur ce qui est accédé.

Mes applications payantes

AVIS DE SÉCURITÉ / CONFIDENTIALITÉ
La première fois que vous exécutez cette application, elle vous demandera l'autorisation complète de votre compte Google. C'est malheureusement le seul moyen d'accéder aux informations requises. Aucune information personnelle n'est stockée, aucune information sur vos applications n'est partagée avec le développeur de cette application, ni partagée avec des tiers. Tout est conservé sur votre téléphone uniquement.


Je suis entré dans les détails de ces applications dans cet article de blog , qui était pour un projet universitaire (pas de gain monétaire). J'ai tendance à penser qu'il s'agit d'un exploit dans l'API et non d'un statut par conception de Google, car il n'y a pas d'appels d'API pour récupérer des achats d'applications autres que la propre application du développeur. Je suppose que c'est un exploit zero day, auquel cas il n'y a pas de moyen légitime d'accéder à ces informations.


10

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

En un mot, les étapes pour le faire sont les suivantes:

  1. Connexion : ce que le programme mentionné fait pour la première étape est de connecter l'utilisateur et d'accéder au jeton d'accès de l'utilisateur. Pour ce faire, il utilise la android.accounts.AccountManager.getAuthToken()méthode. (Voir plus: AccountManager ) Cependant, comme pour la portée du jeton, oauth2:https://www.google.com/accounts/OAuthLoginest demandée. Il peut être important de noter que sur la base de la documentation OAth2 de Google, cette portée n'est pas valide; cependant, cela semble être une portée valide pour Google OAuth v1.

  2. Conversion du jeton d'accès nouvellement récupéré en unubertoken : Maintenant, ce qui est réellement ubertokencensé faire est inconnu et il n'y a pas de documentation officielle à ce sujet. Cependant, il a été vu à l'état sauvage pour être utilisé par le navigateur Chrome pour connecter les utilisateurs. Cela se fait en demandant la https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1page.

  3. Conversion ubertokenen session de site Web : plus tard, en utilisant la nouvelle session , ubertokenil est possible d'obtenir une session de site Web à l'aide du https://accounts.google.com/MergeSessionpoint de terminaison de l' API. 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 comprenant les paramètres de paiement.

  4. Récupération de la liste des applications payantes: Demande et analyse de la https://play.google.com/store/accountpage.

Voici le trafic de l'application capturé par ' Packet Capture ' :

Trafic capturé

Comme il est clairement visible sur l'image, le résultat final est identique à ce que j'obtiens lorsque j'ouvre normalement la page de compte du magasin sur mon PC avec Chrome Desktop: Source de la vue Chrome

Note latérale :

Il semble qu'aucun de ces points de terminaison ne soit documenté car ils sont principalement utilisés par les propres programmes de Google et doivent être considérés comme internes. Par conséquent, je recommande fortement de ne pas les utiliser dans un programme ou un code que vous prévoyez d'exécuter pendant une longue période ou dans un environnement de production. De plus, il y a de mauvaises nouvelles ici pour vous aussi, il semble que la page du compte Google Play ne répertorie que les applications payantes ou les applications gratuites spéciales (plus particulièrement les applications OEM). Je vais essayer de trouver du temps et de creuser plus profondément dans l'autre application.

Articles intéressants :

Jetons Pokémon

Exploiter les jetons OAuth2 de Google Chrome


1
Pouvez-vous s'il vous plaît montrer un échantillon complet pour voir comment cela fonctionne et répondre aux questions que j'ai posées? Comme je l'ai écrit, je souhaite obtenir diverses informations sur chaque application: prix, lors de l'achat, etc ... Est-il également possible d'obtenir la liste des applications gratuites?
développeur android

3

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, quelle application vous avez téléchargée, quelles applications vous avez achetées et même dans quelle application vous avez créée IAP.

Vérifiez la table de propriété, il a 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

Traiter avec des API Google non officielles est un domaine incroyablement compliqué. Il sera possible de faire fonctionner cela, mais c'est tout ce que je dirai. Procédez à vos risques et périls.

La première chose à faire est d' obtenir un jeton d'authentification Google Play . Cela peut être fait de plusieurs manières, mais voici comment procéder 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 une AsyncTask fonctionnera.
  • Vous devez fournir un e-mail pour le compte que vous souhaitez utiliser. Je vous laisse les détails mais c'est assez facile à utiliser 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 principal utilisé par les applications achetées est https://android.clients.google.com/fdfe/purchaseHistory. Un autre qui pourrait vous intéresser est https://android.clients.google.com/fdfe/details?doc=(package name)(à partir du code APKfetch ). 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- l'identifiant Google Services Framework de votre appareil, obtenu auprès de AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- Le code de langue de l'appareil, par ex "en".

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

Malheureusement, j'ai essayé cela et cela ne fonctionne 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 l'exécuter sur le Google Play Store 6.1.12 APK, car c'est la dernière version avant de commencer à utiliser ProGuard. Notez que ce programme a deux erreurs dans son script qui doivent être corrigées avant de l'exécuter: passer 'extracto'à '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éponse sous forme de fichiers .proto. Créez un dossier sous src / main appelé protoet 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 configurer Gradle avec le plugin Protobuf Lite.

Lorsque vous souhaitez analyser une réponse, vous pouvez utiliser la classe ResponseWrapper, car ils semblent tous être contenus en dessous.

C'est à peu près aussi loin que je peux vous emmener. Il y a de fortes chances que je me trompe en partie; JADX est votre meilleur ami ici, car la meilleure façon de comprendre ce que fait une application est de regarder son code. J'espère que cela aide et bon développement!


À propos de AccountManager, êtes-vous sûr qu'il est toujours disponible? Je pense que de nos jours, Google ne donne que l'option à utiliser AccountPicker(comme ici: stackoverflow.com/a/26888259/878126 ). Mais comment faire le reste? L'avez-vous testé? Cela a-t-il fonctionné pour vous? Veuillez partager le code pour cela. C'est pourquoi j'ai mis une prime, pour le voir fonctionner en action ...
Développeur Android

Ouais AccountPicker est une meilleure idée en fait. Et oui, j'ai essayé le code pour obtenir un jeton et cela fonctionne très bien. Je n'ai pas essayé le reste parce que c'est comme au moins 5 heures de travail si tout se passe bien. Même une prime de 500 ne vaut pas ça.
qualverse

1
Voici le code complet pour obtenir un jeton d'authentification (cela fonctionne comme les applications achetées dans votre capture d'écran): github.com/ethanblake4/PlayStoreDemo
qualverse

L'obtention du jeton d'authentification semble bien fonctionner. Mais la partie la plus difficile, je pense, est la récupération des applications elles-mêmes: (
développeur Android

Oui, c'est la partie qui demande malheureusement beaucoup de travail. Cependant, j'ai décompilé le code des applications achetées et c'est ainsi que cela se fait. N'hésitez pas à me faire savoir si vous avez besoin d'aide pour les étapes ci-dessus.
qualverse le

-2

vous pouvez obtenir le nom du package de toutes les applications installées sur l'appareil, puis obtenir les informations de chaque package installé que vous trouvez dans l'appareil à partir de Google Play sans avoir besoin d'accéder au compte utilisateur. il existe des apis tiers ou non officiels pour obtenir les détails des applications Google Play en tant que json en obtenant le nom du package d'application. par exemple: https://42matters.com/ puis utilisez les informations reçues pour chaque paquet pour en trouver des gratuits.


Non, la question sur laquelle j'ai mis la prime concerne les applications que l'utilisateur a déjà installées, et pas seulement celles qui sont installées maintenant. Aussi, pourquoi utiliser non officiel, s'il existe un moyen officiel ...
Développeur Android

@androiddeveloper Je suppose qu'il n'y a pas d'API officielle pour obtenir les détails de l'application en obtenant le nom du package dans Google Play. y a-t-il une API officielle?
Bahman

@androiddeveloper Google conserve-t-il le nom des applications gratuites désinstallées pour chaque utilisateur?
Bahman

Oui. Si vous ouvrez l'application Play Store, accédez au panneau de navigation, puis à «mes applications et jeux». Vous y verrez toutes les applications que vous avez déjà installées à partir de là, et pas seulement celles qui sont actuellement installées. Et selon Google, il est permis (ou du moins il semble qu'ils le disent) d'utiliser cette API: issuetracker.google.com/issues/79195087 . Ou, celui qui m'a parlé n'est pas familier avec ce qui se passe là-bas ...
Développeur Android

-2

J'ai deux ressources à considérer, mais d'abord, en un mot, non. il n'y a pas d'API de GOOGLE pour vous permettre de faire ce que vous voulez, car ces métriques ne sont pas stockées dans le téléphone, elles sont sur les serveurs de Google Play Store et Google n'a pas d'API OFFICIELLE pour le Play Store. vous pouvez cependant glaner quelques informations sur ces deux sites:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store entrez la description du lien ici

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

et cela suffit pour voir comment y parvenir.

Tout d'abord, une liste des applications téléchargées par un compte ne peut être référencée que par le compte. et cela peut être fait via le Play Store. puisque votre application sera installée sur le téléphone de cet utilisateur, ce n'est pas grave ... vous êtes.

deuxièmement, vous aurez besoin d'une API tierce conçue pour GOOGLE PLAY STORE, il y en a quelques-unes, vérifiez le premier lien.

en utilisant l'API de votre choix, vous enverrez une requête get, au Play Store, et en retour, vous devriez recevoir dans la plupart des cas un objet json à désérialiser.

désérialisez l'objet, et vous aurez votre liste. la liste que vous obtiendrez dépendra du point de terminaison que vous utilisez, mais cela devrait être expliqué par / dans l'API elle-même.

bonne chance!


Dans tous les liens, je ne vois pas celui qui obtient la liste des applications qui ont été installées par l'utilisateur actuel. Ils n'ont même pas de phase de connexion. Tous rassemblent des informations génériques sur les applications, que l'utilisateur les ait installées ou non.
développeur android
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.