Come ottenere l'elenco delle app scaricate (a pagamento / gratuite) da un utente da Google Play?


121

Di recente mi sono imbattuto in questa app Acquista app , che in qualche modo è in grado di recuperare le app che ho pagato in Google Play dopo aver effettuato l'accesso utilizzando il mio account Google.

Sto cercando di scoprire come viene fatto perché voglio creare un'app simile, ma per le app gratuite che sono state scaricate.

Tuttavia, non riesco a trovare quale ambito API OAuth è stato utilizzato per recuperare tali informazioni, anche dopo aver esaminato l'intero elenco di API .

Accedi con Google per chiedere l'accesso ad androidmarket


EDIT: sto mettendo una nuova taglia su questa domanda, come suggerito da una domanda simile che ho posto qui , e perché qua e là non vedo una vera risposta su come farlo e cosa si può fare con esso.

Vorrei raffinare le domande in più parti:

  1. Qual è l'API che può essere utilizzata per ottenere informazioni sulle app acquistate? Dove posso leggerlo? Si prega di mostrare un esempio completo e funzionante di come farlo.

  2. Può fare di più? Forse eseguire la ricerca? Forse mostrare app gratuite che sono state installate? Forse la volta in cui sono stati installati e disinstallati? E le categorie di quelle app?

  3. Esistono requisiti speciali per l'utilizzo di questa API?


MODIFICA: sto mettendo una taglia massima su questo, perché non importa quanto ho letto e provato, non sono ancora riuscito a creare un POC che possa interrogare le app dal Play Store che l'utente ha mai scaricato (nome, pacchetto nome, data di installazione e / o rimozione, URL icona, prezzo ...), comprese le app a pagamento e gratuite.

Se qualcuno trova un campione funzionante, mostra come è fatto e mostra anche come l'hai trovato (documentazione o qualsiasi cosa che ti abbia portato alla soluzione). Non riesco a trovarlo da nessuna parte e le attuali soluzioni qui sono troppo vaghe per me da cui iniziare.



Guarderei il programma di avvio delle app di esempio. Sa quali app vengono scaricate sul telefono.
danny117

@ sviluppatore Android: ho analizzato il Purchase Appsfile apk tramite la decompilazione. Non ha mai utilizzato alcuna API per ottenere l'elenco delle app acquistate. Il suo approccio è lo stesso che sappiamo che sta analizzando il contenuto html della pagina web del Play Store. Ecco un frammento di questo codice: hastebin.com/uceyavurij.js
aminography

@aminography Quindi come lo ottiene per l'utente? Dopotutto, ha bisogno di ottenere i dati dell'account Google dell'utente ... Non è sufficiente accedere solo alle app del Play Store ... Cosa fa con i permessi che gli vengono concessi?
sviluppatore Android

@androiddeveloper: tutte le informazioni fornite da Purchased Appspotrebbero essere recuperate dai contenuti web del playstore. Purtroppo non ho accesso per acquistare un'app da Google Play. Se mi condividi un account con un'app acquistata, posso sviluppare un codice di esempio per te.
aminografia

Risposte:


51

Il problema è stato risolto. L'exploit è stato chiuso.

Chiuderemo questo bug a causa dell'accesso a una versione di anteprima di Android. Se il problema è ancora pertinente e riproducibile nell'ultima versione pubblica (Android Q), acquisire una segnalazione di bug e registrare il bug in https://source.android.com/setup/contribute/report-bugs . Se non si riceve una risposta entro i prossimi 14 giorni, il problema verrà chiuso. Grazie per la vostra comprensione.


Ultimo aggiornamento:

Questo è un bug e Google lo risolverà nel prossimo aggiornamento.

Abbiamo rinviato questo problema per la considerazione in una versione futura. Grazie per il tuo tempo per migliorare Android


Questa risposta si è trasformata in un conglomerato di idee ed è stata modificata per includere informazioni dalla discussione nei commenti.

L' androidmarketAPI, sarebbe un'API personalizzata scritta dallo sviluppatore. Non è disponibile al pubblico.

Per affrontare le tue preoccupazioni nei commenti. Lo sviluppatore avrebbe utilizzato le attuali API disponibili tramite Android Developer e Google per creare un progetto che gestisca tutti questi.

Per quanto riguarda l'accesso Full Account Access, non sono sicuro di come questi sviluppatori abbiano raggiunto questo obiettivo.

Consiglierei di utilizzare AccountManager , che fa parte di android.accounts, ha accesso alle credenziali e un metodo getUserData . Il gestore dell'account ha accesso alle password ed è in grado di creare ed eliminare account. Questo, possibilmente usato con Content Provider

Vedere Autenticazione Udinic / SyncAdapter .

Per rispondere al tuo commento:

Questo blog dovrebbe aiutarti a iniziare. Scrivi il tuo autenticatore Android .


Come funzionano effettivamente queste app, non posso dirtelo. Possono anche avere implementazioni diverse (a meno che non siano uno sforzo collaborativo dietro le quinte, sicuramente saranno diverse).

Una supposizione. Innanzitutto utilizza GoogleSignInAccount con com.google.android.gms.auth.api.signin .

Esiste una definizione per l' ambito , per determinare l'estensione delle autorizzazioni concesse all'app.

Utilizzando requestScopes () , il

public static final String PROFILE

... / Consente alla tua app web di accedere alle installazioni di app Android over-the-air.

Ad esempio :

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

Se è possibile ottenere l'accesso completo, è possibile trovare un elenco di tutte le app utilizzate dal titolare dell'account e confrontarle con quelle presenti sul dispositivo.

Package Manager recupererà un elenco di tutte le app attualmente installate sul dispositivo.
PackageInfo fornisce i dettagli sull'app.
INSTALL_REASON_USER filtrerà anche le app che sono state installate attivamente dall'utente.

Potresti voler esaminare com.google.firebase.appindexing e Log User Actions . È possibile monitorare diverse azioni .

La cronologia dell'account utente si trova su https://myactivity.google.com/myactivity .

Un collegamento utile è OAuth 2.0 Playground .


Questo repository GitHub node-google-play , utilizzando node, è aggiornato e chiamerà le API di Google Play. Così come l'archivio che è stato utilizzato come API "non ufficiale", android-market-api , per interrogare il mercato.


App 1

L' app afferma di utilizzare le seguenti autorizzazioni:

La versione 2.1.8 può accedere a:
$ Acquisti in-app

Altro

  • ricevere dati da Internet
  • visualizzare le connessioni di rete
  • accesso completo alla rete
  • utilizzare gli account sul dispositivo
  • impedire al dispositivo di dormire
  • leggi la configurazione del servizio Google

Degno di nota, l'app non imposta alcuna autorizzazione quando c'era un'installazione di base. Non sono stato in grado di utilizzare nessuna delle funzionalità, poiché non ho app a pagamento. Quindi, per la ricerca iniziale, non erano necessarie autorizzazioni, il che indicherebbe che l'app non aveva accesso al mio account.

Ho controllato le autorizzazioni: non ce n'erano impostate. Quindi l'unica cosa richiesta era accettare il popup, come mostrato nella tua domanda.


App 2

L'altra app a cui fai riferimento che fa la stessa cosa è più anticipata su ciò a cui si accede.

Le mie app a pagamento

AVVISO DI SICUREZZA / PRIVACY
La prima volta che esegui questa app, ti chiederà l'autorizzazione completa al tuo account Google. Questo è purtroppo l'unico modo per accedere alle informazioni richieste. Nessuna informazione personale viene memorizzata, nessuna informazione sulle tue app viene condivisa con lo sviluppatore di questa app, né condivisa con terze parti. Tutto è conservato solo sul tuo telefono.


Sono entrato nei dettagli su queste app in questo post del blog , che era per un progetto chiave di volta dell'università (nessun guadagno monetario). Sono propenso a pensare che questo sia un exploit nell'API e non lo stato in base alla progettazione di Google, poiché non ci sono chiamate API per recuperare gli acquisti di app diverse dall'app dello sviluppatore. Ipotizzo che sia un exploit zero day, nel qual caso non esiste un modo legittimo per accedere a queste informazioni.


10

Nel caso di una di queste applicazioni (Le mie app a pagamento), dopo aver controllato il traffico di rete è abbastanza ovvio che utilizza la pagina Account del negozio per recuperare l'elenco delle applicazioni a pagamento. Ora, il meccanismo che utilizza è lo stesso meccanismo che Google Chrome attualmente e Pokemon GO presumibilmente in un momento utilizzato.

In poche parole, i passaggi per farlo sono i seguenti:

  1. Accesso : ciò che il programma citato fa per il primo passaggio è accedere all'utente e ottenere l'accesso al token di accesso dell'utente. Per fare ciò, utilizza il android.accounts.AccountManager.getAuthToken()metodo. (Vedi di più: AccountManager ) Tuttavia, come per l'ambito del token, oauth2:https://www.google.com/accounts/OAuthLoginè richiesto. Potrebbe essere importante notare che, in base alla documentazione OAth2 di Google, questo ambito non è valido; tuttavia, sembra un ambito valido per Google OAuth v1.

  2. Conversione del token di accesso appena recuperato in unubertoken : Ora, cosa si ubertokendovrebbe effettivamente fare, è sconosciuto e non esiste alcuna documentazione ufficiale al riguardo. Tuttavia, è stato visto in natura per essere utilizzato dal browser Chrome per accedere agli utenti. Questo viene fatto richiedendo la https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1pagina.

  3. Conversione ubertokenalla sessione del sito Web : Successivamente, utilizzando la nuova creazione ubertokenè possibile ottenere una sessione del sito Web utilizzando l' https://accounts.google.com/MergeSessionendpoint API. Dopo questo passaggio, l'applicazione è essenzialmente in grado di caricare tutte le pagine personali che puoi aprire utilizzando il tuo browser mentre sei loggato; tranne alcune pagine speciali incluse le impostazioni di pagamento.

  4. Recupero dell'elenco delle applicazioni a pagamento: richiesta e analisi della https://play.google.com/store/accountpagina.

Di seguito è riportato il traffico dell'applicazione acquisito da " Packet Capture " :

Traffico acquisito

Come è chiaramente visibile nell'immagine, il risultato finale è identico a quello che ottengo quando normalmente apro la pagina dell'account del negozio sul mio PC con Chrome Desktop: Sorgente di visualizzazione di Chrome

Nota a margine :

Sembra che nessuno di questi endpoint sia documentato in quanto sono utilizzati principalmente dai programmi di Google e dovrebbero essere considerati interni. Pertanto consiglio vivamente di non utilizzarli in alcun programma o codice che prevedi di eseguire per molto tempo o in un ambiente di produzione. Inoltre, ci sono brutte notizie anche per te, sembra che la pagina dell'account di Google Play elenchi solo applicazioni a pagamento o app gratuite speciali (in particolare app OEM). Cercherò di trovare un po 'di tempo e di approfondire l'altra applicazione.

Articoli interessanti :

Gettoni Pokemon

Sfruttare i token OAuth2 di Google Chrome


1
Puoi mostrare un campione completo per vedere come funziona e rispondere alle domande che ho posto? Come ho scritto, desidero avere varie informazioni su ciascuna app: prezzo, quando acquistata, ecc ... È anche possibile ottenere l'elenco delle app gratuite?
sviluppatore Android

3

Se hai accesso root, puoi accedere /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

Questo database contiene tutte le informazioni, quale app hai scaricato, quali app hai acquistato e anche in quale app hai fatto IAP.

Controlla la tabella delle proprietà, contiene tutte le informazioni.

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

Trattare con API di Google non ufficiali è un territorio incredibilmente complicato. Sarà possibile farlo funzionare, ma è tutto quello che dirò. Procedete a vostro rischio.

La prima cosa che dovrai fare è ottenere un token di autenticazione di Google Play . Questo può essere fatto in diversi modi, ma ecco come lo fanno nelle app acquistate:

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

Alcune cose da notare qui:

  • Il codice precedente deve essere eseguito in modo asincrono . Raccomando RxJava, ma un AsyncTask funzionerà.
  • Devi fornire un'e-mail per l'account che desideri utilizzare. Lascio a te i dettagli, ma è abbastanza facile da usare AccountManager.

Dopo aver ottenuto un token di autenticazione, ora puoi accedere a qualsiasi endpoint di Google Play Store . Quello principale utilizzato dalle app acquistate è https://android.clients.google.com/fdfe/purchaseHistory. Un altro che potrebbe interessarti è https://android.clients.google.com/fdfe/details?doc=(package name)(dal codice APKfetch ). Ecco una pagina con ancora e qualche analisi. Se effettui una richiesta a queste API, dovrai fornire diverse intestazioni:

  • 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'ID Google Services Framework del tuo dispositivo, ottenuto da AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- Il codice della lingua del dispositivo, ad es "en".

Ora devi analizzare la risposta . È qui che le cose si complicano. Queste API restituiscono un messaggio codificato come Protobuf , quindi sono essenzialmente solo dati binari a meno che tu non abbia uno schema (che ovviamente solo Google ha). Un modo per farlo in teoria è decompilare l'app Google Play Store e riutilizzare i modelli protobuf generati con uno strumento come JADX .

Sfortunatamente, l'ho provato e non funziona davvero. Le classi del modello Protobuf sono semplicemente troppo complesse per un decompilatore standard. Quello che puoi usare è uno strumento chiamato PBTK . Idealmente vorrai eseguirlo sull'APK di Google Play Store 6.1.12, poiché è l'ultima versione prima che iniziassero a utilizzare ProGuard. Fare nota che questo programma ha due errori nel suo script che devono essere corretti prima di eseguirlo: cambiando 'extracto'a 'extractor'in gui.py e rimuovendo la dichiarazione asserzione sulla linea 500 di jar_extract.py .

Ora, questo dovrebbe produrre tutte le classi di risposta come file .proto. Crea una cartella sotto src / main chiamata protoe trascina l'intera directory "com" generata su di essa. Puoi eliminare tutto ciò che non è sotto com/google/android/finsky/protos. Segui le istruzioni online per configurare Gradle con il plug-in Protobuf Lite.

Quando si desidera analizzare una risposta, è possibile utilizzare la classe ResponseWrapper, poiché sembrano essere tutte contenute sotto quella.

È più o meno quanto posso portarti. Ci sono buone probabilità che io abbia sbagliato una parte; JADX è il tuo migliore amico qui, perché il modo migliore per capire cosa sta facendo un'app è guardare il suo codice. Spero che questo aiuti e felice sviluppo!


A proposito AccountManager, sei sicuro che sia ancora disponibile? Penso che al giorno d'oggi Google dia solo la possibilità di utilizzare AccountPicker(come qui: stackoverflow.com/a/26888259/878126 ). Ma come eseguo il resto? L'hai provato? Ha funzionato per te? Per favore condividi il codice. Ecco perché ho impostato una taglia, per vederlo funzionare in azione ...
sviluppatore Android

Sì, AccountPicker è un'idea migliore in realtà. E sì, ho provato il codice per ottenere un token e funziona benissimo. Non ho provato il resto perché sono almeno 5 ore di lavoro se tutto va liscio. Anche una taglia di 500 non vale quello.
qualifiche il

1
Ecco il codice completo per ottenere un token di autenticazione (funziona proprio come le app acquistate nel tuo screenshot): github.com/ethanblake4/PlayStoreDemo
qualverse

L'ottenimento del token di autenticazione sembra funzionare bene. Ma la parte difficile penso sia il recupero delle app stesse :(
sviluppatore Android

Sì, questa è la parte che sfortunatamente richiede molto lavoro. Tuttavia, ho decompilato il codice per le app acquistate ed è così che viene fatto lì. Sentiti libero di farmi sapere se hai bisogno di assistenza per i passaggi precedenti.
qualverse

-2

puoi ottenere il nome del pacchetto di tutte le app installate sul dispositivo e quindi ottenere le informazioni di ogni pacchetto installato che trovi nel dispositivo da Google Play senza bisogno di accedere all'account utente. ci sono alcune API di terze parti o non ufficiali per ottenere i dettagli delle app di Google Play come json ottenendo il nome del pacchetto dell'app. ad esempio: https://42matters.com/ quindi utilizza le informazioni ricevute per ogni pacchetto per trovare quelli gratuiti.


No, la domanda su cui ho messo la taglia è sulle app che l'utente ha mai installato e non solo su quelle installate ora. Inoltre, perché usare non ufficiale, se esiste un modo ufficiale ...
sviluppatore Android

@androiddeveloper Immagino che non esista alcuna API ufficiale per ottenere i dettagli dell'app ottenendo il nome del pacchetto in Google Play. c'è qualche API ufficiale?
Bahman

@androiddeveloper Google mantiene il nome delle app gratuite non installate per ogni utente?
Bahman

Sì. Se apri l'app Play Store, vai al menu di navigazione, quindi a "le mie app e i miei giochi". Vedrai lì tutte le app che hai installato da lì e non solo quelle attualmente installate. E secondo Google, è consentito (o almeno sembra che lo dicano) utilizzare questa API: issuetracker.google.com/issues/79195087 . Oppure, chiunque abbia parlato con me non ha familiarità con quello che sta succedendo lì ...
sviluppatore Android

-2

ho due risorse da considerare, ma prima, in una parola, no. non esiste alcuna API di GOOGLE che ti permetta di fare quello che vuoi, poiché queste metriche non sono memorizzate nel telefono, sono sui server di Google Play Store e Google non ha API UFFICIALI per il Play Store. puoi comunque raccogliere alcune informazioni da questi due siti:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store inserisci qui la descrizione del link

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

e questo è sufficiente per vedere come farlo.

in primo luogo, un elenco di quali app sono state scaricate da un account è riferibile solo dall'account. e questo può essere fatto tramite il Play Store. poiché la tua app verrà installata sul telefono di quel utente, non importa ... sei dentro.

secondo, avrai bisogno di un'API di terze parti creata per GOOGLE PLAY STORE, ce ne sono alcune là fuori, controlla il primo link.

utilizzando l'API di tua scelta, invierai una richiesta get, al Play Store, e in cambio dovresti ricevere nella maggior parte dei casi un oggetto json da deserializzare.

deserializza l'oggetto e avrai la tua lista. quale elenco si ottiene dipenderà dall'endpoint che si utilizza, ma ciò dovrebbe essere spiegato da / nell'API stessa.

in bocca al lupo!


In tutti i collegamenti lì, non ne vedo uno che ottiene l'elenco delle app installate dall'utente corrente. Non hanno nemmeno una fase di accesso. Tutti raccolgono informazioni generiche sulle app, indipendentemente dal fatto che l'utente le abbia installate o meno.
sviluppatore Android
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.