120 votes

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 pour Acheter des Apps, qui est en quelque sorte en mesure de récupérer les applications que j'ai payé dans google play après que j'ai signé à l'aide de mon compte google.

J'essaie de trouver comment il se fait que je veux construire une application similaire, mais pour les applications gratuites qui ont été téléchargés.

Cependant, je ne peux pas trouver les API OAuth Champ d'application a été utilisé pour récupérer les informations, même après être passé par l'ensemble de la liste des Api.

Google Sign in asking for access to androidmarket


EDIT: Je suis en train de mettre une nouvelle récompense sur cette question, comme l'a suggéré une question similaire, j'ai demandé à ce sujet ici, et 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 elle.

J'aimerais affiner les questions en plusieurs morceaux:

  1. Qu'est-ce que l'API qui peut être utilisé pour obtenir des informations des applications achetées? Où puis-je le lire? Merci de montrer un complet, exemple de la façon de le faire.

  2. Peut-il faire de plus ? Peut-être effectuer une recherche? Peut-être montrer des applications gratuites qui ont été installés? Peut-être le temps qu'ils ont été installés et désinstallés? Et les catégories de ces applications?

  3. Existe-il des conditions spéciales pour l'utilisation de cette API ?


EDIT: je suis en train de mettre un max de bounty sur ce, parce que peu importe comment beaucoup j'ai lu et essayé, j'ai pas encore réussi à faire un POC qui permet d'interroger les applications à partir du Play Store que l'utilisateur a toujours téléchargé (nom, nom de paquet, sa date d'installation et/ou supprimé, l'icône URL, prix...), y compris les apps gratuites et payantes.

Si quelqu'un trouve un exemple de travail, de montrer comment il est fait, et montrent également comment vous avez trouvé à ce sujet (la documentation ou tout ce qui vous a conduit à la solution). Je ne peux pas le trouver n'importe où, et les solutions actuelles sont ici trop vague pour moi de commencer à partir.

51voto

Ms Yvette Points 7591

Dernière mise à jour:

C'est un bug et Google à le corriger dans la prochaine mise à jour.

Nous avons reporté ce problème à prendre en compte dans une future version. Merci vous pour votre temps pour faire Android mieux


Cette réponse s'est transformé en un conglomérat d'idées et d'été modifié pour inclure de l'information à partir de la discussion dans les commentaires.

L' androidmarket api, serait sur mesure un api écrite par le développeur. Ce n'est pas à la disposition du public.

Pour répondre à vos préoccupations dans les commentaires. Le développeur aurait utilisé l'actuelle api disponibles par le biais de Développeur Android et de Google pour créer un projet qui gère l'ensemble des ces.

Pour accéder Full Account Access, je ne suis pas sûr exactement comment ces développeurs ont atteint cet objectif.

Je vous recommande d'utiliser le AccountManager, qui est partie d'android.comptes, a accès à des 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. Cela, peut-être utilisée avec le Fournisseur de Contenu

Voir Udinic/SyncAdapter D'Authentification.

Pour répondre à votre commentaire:

Ce blog devrait vous aider à obtenir commencé. Écrivez votre propre Android Authentificateur.


La façon dont ces applications fonctionnent réellement, je ne peux pas vous dire. Ils peuvent aussi avoir différentes implémentations (sauf si elles sont un effort de collaboration en coulisses, ils vont certainement être différent).

On peut le supposer. Tout d'abord l'utilisation GoogleSignInAccount avec com.google.android.gms.auth.l'api.signin.

Il y a une définition de la portée, afin de déterminer l'étendue des autorisations de l'application est accordée.

À l'aide de requestScopes(), le

public static final String PROFIL

.../ Il permet à votre application web en accès direct de l'application Android installe.

Pour exemple:

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

Si l'accès complet peut être obtenu une liste de toutes les applications utilisées par le titulaire de compte peut être trouvé, et par rapport à ce qui est à l'appareil.

Le Gestionnaire de Package permettra de récupérer une liste de toutes les applications actuellement installées sur l'appareil.
PackageInfo fournit les détails à propos de l'application.
INSTALL_REASON_USER permettra également de filtrer les applications qui ont été activement installé par l'utilisateur.

Vous pourriez vouloir regarder com.google.firebase.appindexing et du Journal des Actions de l'Utilisateur. Différentes actions peuvent être suivis.

Le compte de l'utilisateur de l'histoire est trouvé à la https://myactivity.google.com/myactivity.

Un lien utile est le protocole OAuth 2.0 aire de Jeux.


Ce dépôt github nœud-google-play, l'aide d'un noeud, est en cours et fera appel Api Google Play. Comme l'a fait l'archive qui a été utilisé comme un "non officiel" de l'api, android-market-api, pour interroger la place du marché.


App 1

L' app prétend utiliser les autorisations suivantes:

La Version 2.1.8 pouvez accéder à:
$ D'achats In-app

D'autres

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

À noter, l'application ne permet pas de définir les autorisations lorsqu'il y a une base, installer. Je n'ai pas pu utiliser de fonctions, comme je n'ai pas d'applications payantes. Donc, pour la recherche initiale, - il n'y avait pas les autorisations nécessaires, ce qui pourrait indiquer l'application n'a pas accès à mon compte.

J'ai vérifié les autorisations - il n'y avait aucun jeu. Donc, la seule chose nécessaire est d'accepter les pop-up, comme indiqué dans votre question.


App 2

L'autre application que vous référer à la qui fait la même chose, c'est plus clair à propos de ce qui est en cours d'accès.

Mes Applications Payantes

SÉCURITÉ/CONFIDENTIALITÉ
La première fois que vous lancez cette application, il vous sera demander la permission à votre compte Google. Ce n'est malheureusement la seule façon d'accéder à l'information requise. Pas de personnel l'information est stockée, aucune informations à propos de vos applications est partagée avec le développeur de cette application, ni partagés avec des tiers. Tout est gardé sur votre téléphone.


Je suis allé dans les détails sur ces applications dans ce blog, qui a été pour une université de synthèse du projet (pas de gain monétaire). Je suis enclin à penser que c'est un exploit de l'API et de ne pas le statut de conception par Google, comme il n'y a pas d'appels d'API pour récupérer les achats d'applications autres que le développeur propre application. Je fais l'hypothèse que c'est un zero day exploit, auquel cas il n'y a aucun moyen légitime d'accès à ces informations.

10voto

Soroush Falahati Points 501

Dans le cas de l'une de ces applications (Mes Applications payantes), après vérification du trafic réseau, il est assez évident qu'il ne utilisez le Magasin de la page de Compte pour récupérer la liste des applications payantes. Maintenant, le mécanisme utilisé est le même mécanisme que Google Chrome actuellement, et Pokemon ALLER soi-disant à un point dans le temps utilisé.

En bref, les étapes sont comme suit:

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

  2. La conversion de la nouvellement extrait jeton d'accès à un ubertoken: Maintenant, ce qui s'est réellement ubertoken censé faire, est inconnue et il n'existe pas de documentation à ce sujet. Cependant, il a été vu dans la nature pour être utilisé par le navigateur chrome de connexion des utilisateurs. Ceci est fait en demandant à l' https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1 page.

  3. Convertir ubertoken de site web de session: Plus tard, à l'aide de la nouvellement créée ubertoken il est possible d'obtenir un site web de session à l'aide de l' https://accounts.google.com/MergeSession API point de terminaison. Après cette étape, l'application est essentiellement capable de chargement de toutes les pages personnelles que vous pouvez ouvrir à l'aide de votre navigateur lorsque vous êtes connecté; à l'exception de quelques pages spéciales, y compris les paramètres de Paiement.

  4. Récupération de la liste des applications payantes: Requérant et de l'analyse du https://play.google.com/store/account page.

Voici la demande de trafic capturé par"Capture de Paquets':

Captured Traffic

Comme il est clairement visible dans l'image, le résultat final est identique à ce que je reçois quand j'ai l'habitude d'ouvrir le magasin de la page de compte sur mon PC avec Chrome Desktop: Chrome view source

Note de côté:

Il semble qu'aucun de ces points sont documentées comme ils sont principalement utilisés par Google propres programmes et doivent être considérés comme internes. Par conséquent, je recommande fortement de ne pas les utiliser dans n'importe quel programme ou un code que vous vous attendez à exécuter pendant une longue période ou dans un environnement de production. Aussi, il ya de mauvaises nouvelles, ici, pour vous aussi, il semble que le Google Play page de compte que les listes des applications payantes ou spéciale des applications gratuites (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:

Pokemon jetons

Exploitation de Google Chrome OAuth2 Jetons

3voto

nkalra0123 Points 1046

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

2voto

qualverse Points 771

Traiter avec officieux Api Google est incroyablement compliqué territoire. Il va être possible pour obtenir que cela fonctionne, mais c'est tout ce que je vais dire. Procéder à vos propres risques.

La première chose que vous allez avoir besoin de faire est d' obtenir un Jeu de Google auth jeton. Cela peut être fait de plusieurs façons, mais ici, c'est 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 choses à noter ici:

  • Le code ci-dessus doit être exécutée de manière asynchrone. Je recommande RxJava, mais une AsyncTask fonctionne.
  • Vous devez fournir un e-mail pour le compte que vous souhaitez utiliser. Je vais laisser les détails à vous, mais c'est assez facile à l'aide d' AccountManager.

Après vous avez un jeton d'authentification, vous pouvez maintenant accéder à Google Play Store point de terminaison. Le principal utilisé par les Applications Achetées est - https://android.clients.google.com/fdfe/purchaseHistory. Un autre vous pourriez être intéressé en est - https://android.clients.google.com/fdfe/details?doc=(package name) (à partir de APKfetch code). Voici une page avec un peu plus et l'analyse. Si vous faites une demande pour 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 - votre appareil Google Cadre de Services d'ID, obtenu à partir de AdvertisingIdClient.
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language - La langue de l'appareil de code, par exemple, "en".

Maintenant, vous devez analyser la réponse. Voici où les choses deviennent difficiles. Ces Api renvoie un message codé comme un Protobuf, c'est donc essentiellement à des données binaires, sauf si vous avez un schéma (qui, bien sûr, seulement Google a). Une façon d'aller à ce sujet dans la théorie de l'est de décompiler le Google Play Store et la réutilisation de leurs généré protobuf modèles avec un outil comme JADX.

Malheureusement, j'ai essayé et ça ne fonctionne pas vraiment. Protobuf classes du modèle sont tout simplement trop complexes pour une norme decompiler. Ce que vous pouvez utiliser est un outil qui s'appelle PBTK. Vous serez idéalement voulez exécuter sur le Google Play Store 6.1.12 APK, puisque 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és avant de l'exécuter: évolution des 'extracto' de 'extractor' dans gui.py et la suppression de l'assertion sur la ligne 500 de jar_extract.py.

Maintenant, qui devrait sortir l'ensemble de la réponse des classes .proto fichiers. Créer un sous-répertoire src/main appelés proto et faire glisser l'ensemble de la génération "com' répertoire. Vous pouvez supprimer tout ce qui n'est pas en vertu de l' com/google/android/finsky/protos. Suivez les instructions en ligne pour l'installation de Gradle avec le Protobuf Lite plugin.

Lorsque vous souhaitez analyser une réponse, vous pouvez utiliser le ResponseWrapper de classe, car ils semblent tous être contenu dans cela.

C'est à peu près aussi loin que je peut vous prendre. Il ya une bonne chance j'ai eu une partie de ce mal; JADX est votre meilleur ami ici, parce que la meilleure façon de comprendre ce qu'une application est en train de faire est de regarder son code. Espérons que cela aide et heureux de se développer!

-2voto

BAHMAN Points 1256

vous pouvez obtenir le nom du paquet de toutes les applications installées sur le périphérique, puis obtenir les informations de chaque paquet installé que vous trouvez dans le périphérique à partir de Google Play, sans qu'il soit nécessaire d'obtenir un compte d'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 de l'application. par exemple: https://42matters.com/, puis utilisez les informations reçues pour chaque paquet afin de trouver des paquets gratuits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X