¿Cómo obtener una lista de aplicaciones descargadas (pagadas / gratuitas) por un usuario de Google Play?

121

Recientemente me encontré con esta aplicación Comprar aplicaciones , que de alguna manera puede recuperar aplicaciones que pagué en Google Play después de iniciar sesión con mi cuenta de Google.

Estoy tratando de averiguar cómo se está haciendo, ya que quiero crear una aplicación similar, pero para las aplicaciones gratuitas que se descargaron.

Sin embargo, no puedo encontrar qué ámbito de API de OAuth se utilizó para recuperar esa información, incluso después de revisar la lista completa de API .

Google Sign in solicitando acceso a androidmarket


EDITAR: Estoy poniendo una nueva recompensa en esta pregunta, como lo sugiere una pregunta similar que hice aquí , y porque aquí y allá no veo una respuesta real sobre cómo hacerlo y qué se puede hacer. con eso.

Me gustaría refinar las preguntas en varias partes:

  1. ¿Cuál es la API que se puede utilizar para obtener información de las aplicaciones compradas? ¿Dónde puedo leerlo? Muestre un ejemplo completo y funcional de cómo hacerlo.

  2. ¿Puede hacer más? ¿Quizás realizar una búsqueda? ¿Quizás mostrar aplicaciones gratuitas que se instalaron? ¿Quizás el momento en que se instalaron y desinstalaron? ¿Y las categorías de esas aplicaciones?

  3. ¿Existen requisitos especiales para utilizar esta API?


EDITAR: Estoy poniendo una recompensa máxima por esto, porque no importa cuánto haya leído y probado, todavía no pude hacer un POC que pueda consultar las aplicaciones de Play Store que el usuario haya descargado (nombre, paquete nombre, fecha de instalación y / o eliminación, URL del icono, precio ...), incluidas las aplicaciones pagas y gratuitas.

Si alguien encuentra una muestra funcional, muestre cómo se hace y también cómo la encontró (documentación o cualquier cosa que lo haya llevado a la solución). No puedo encontrarlo en ninguna parte, y las soluciones actuales aquí son demasiado vagas para comenzar.

abhiank
fuente
Miraría el lanzador de aplicaciones de muestra. Sabe qué aplicaciones se descargan en el teléfono.
danny117
Desarrollador de @android: He analizado el Purchase Appsarchivo apk por descompilación. Nunca usó ninguna API para obtener la lista de aplicaciones compradas. Su enfoque es el mismo que sabemos, que está analizando el contenido html de la página web de Play Store. Aquí hay un fragmento de este código: hastebin.com/uceyavurij.js
aminografía
@aminography Entonces, ¿cómo lo consigue el usuario? Después de todo, necesita obtener datos de la cuenta de Google del usuario ... No es suficiente acceder a las aplicaciones de Play Store ... ¿Qué hace con los permisos que se le otorgan?
desarrollador de Android
@androiddeveloper: toda la información proporcionada por Purchased Appspodría recuperarse del contenido web de playstore. Lamentablemente, no tengo acceso para comprar una aplicación de Google Play. Si me comparte una cuenta que tiene una aplicación comprada, puedo desarrollar un código de muestra para usted.
aminografía

Respuestas:

51

El problema está resuelto. El exploit ha sido cerrado.

Cerraremos este error debido a que se inició sesión en una versión preliminar de Android. Si el problema sigue siendo relevante y reproducible en la última versión pública (Android Q), capture un informe de error y registre el error en https://source.android.com/setup/contribute/report-bugs . Si no se recibe una respuesta dentro de los próximos 14 días, este problema se cerrará. Gracias por su comprensión.


Última actualización:

Este es un error y Google lo solucionará en la próxima actualización.

Aplazamos este problema para su consideración en una versión futura. Gracias por tu tiempo para mejorar Android


Esta respuesta se ha convertido en un conglomerado de ideas y se ha editado para incluir información de la discusión en los comentarios.

La androidmarketAPI sería una API personalizada escrita por el desarrollador. No está disponible para el público.

Para abordar sus inquietudes en los comentarios. El desarrollador habría utilizado las apis actuales disponibles a través de Android Developer y Google para crear un proyecto que gestione todos estos.

En cuanto al acceso Full Account Access, no estoy seguro de cómo estos desarrolladores lo han logrado.

Recomendaría usar AccountManager , que es parte de android.accounts, tiene acceso a credenciales y un método getUserData . El administrador de cuentas tiene acceso a contraseñas y es capaz de crear y eliminar cuentas. Esto, posiblemente utilizado con el proveedor de contenido

Consulte Autenticación de Udinic / SyncAdapter .

Para responder a su comentario:

Este blog debería ayudarlo a comenzar. Escriba su propio autenticador de Android .


Cómo funcionan realmente estas aplicaciones, no puedo decirte. También pueden tener diferentes implementaciones (a menos que sean un esfuerzo de colaboración entre bastidores, seguramente serán diferentes).

Una conjetura. En primer lugar, utilice GoogleSignInAccount con com.google.android.gms.auth.api.signin .

Existe una definición de alcance , para determinar el alcance de los permisos que se otorga a la aplicación.

Usando requestScopes () , el

PERFIL de cadena final estática pública

... / Permite que su aplicación web acceda a instalaciones de aplicaciones de Android inalámbricas.

Por ejemplo :

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

Si se puede obtener acceso completo, se puede encontrar una lista de todas las aplicaciones utilizadas por el titular de la cuenta y compararlas con las del dispositivo.

El Administrador de paquetes recuperará una lista de todas las aplicaciones instaladas actualmente en el dispositivo.
PackageInfo proporciona los detalles sobre la aplicación.
INSTALL_REASON_USER también filtrará las aplicaciones que el usuario haya instalado activamente.

Es posible que desee consultar com.google.firebase.appindexing y registrar acciones de usuario . Se pueden rastrear diferentes acciones .

El historial de la cuenta de los usuarios se encuentra en https://myactivity.google.com/myactivity .

Un vínculo útil es OAuth 2.0 Playground .


Este repositorio de github node-google-play , que usa node, está actualizado y llamará a las API de Google Play. Al igual que el archivo que se usó como una API "no oficial", android-market-api , para consultar el mercado.


Aplicación 1

La aplicación afirma utilizar los siguientes permisos:

La versión 2.1.8 puede acceder a:
$ Compras en la aplicación

Otro

  • recibir datos de Internet
  • ver conexiones de red
  • acceso completo a la red
  • usar cuentas en el dispositivo
  • evitar que el dispositivo duerma
  • leer la configuración del servicio de Google

Cabe destacar que la aplicación no establece ningún permiso cuando hubo una instalación básica. No pude usar ninguna de las funciones porque no tengo aplicaciones pagas. Entonces, para la búsqueda inicial, no se necesitaban permisos, lo que indicaría que la aplicación no tenía acceso a mi cuenta.

Revisé los permisos, no había ninguno establecido. Entonces, lo único que se requería era aceptar la ventana emergente, como se muestra en su pregunta.


Aplicación 2

La otra aplicación a la que hace referencia que hace lo mismo es más directa sobre a qué se accede.

Mis aplicaciones pagas

AVISO DE SEGURIDAD / PRIVACIDAD
La primera vez que ejecute esta aplicación, le pedirá permiso completo para su cuenta de Google. Desafortunadamente, esta es la única forma de acceder a la información requerida. No se almacena información personal, no se comparte información sobre sus aplicaciones con el desarrollador de esta aplicación, ni se comparte con terceros. Todo se guarda solo en su teléfono.


He entrado en detalles sobre estas aplicaciones en esta publicación de blog , que fue para un proyecto final de la universidad (sin ganancia monetaria). Me inclino a pensar que esto es un exploit en la API y no un estado por diseño de Google, ya que no hay llamadas a la API para buscar compras de aplicaciones que no sean la propia aplicación del desarrollador. Supongo que es un exploit de día cero, en cuyo caso no hay una forma legítima de acceder a esta información.


fuente
10

En el caso de una de estas aplicaciones (Mis aplicaciones pagas), después de verificar el tráfico de la red, es bastante obvio que usa la página Cuenta de la tienda para recuperar la lista de aplicaciones pagas. Ahora, el mecanismo que usa es el mismo que Google Chrome actualmente, y que supuestamente Pokemon GO en un momento dado.

En pocas palabras, los pasos para hacerlo son los siguientes:

  1. Inicio de sesión : Lo que hace el programa mencionado en el primer paso es iniciar sesión y obtener acceso al token de acceso del usuario. Para ello, utiliza el android.accounts.AccountManager.getAuthToken()método. (Ver más: AccountManager ) Sin embargo, en cuanto al alcance del token, oauth2:https://www.google.com/accounts/OAuthLoginse solicita. Puede ser importante tener en cuenta que, según la documentación de OAth2 de Google, este alcance no es válido; sin embargo, parece un alcance válido para Google OAuth v1.

  2. Convertir el token de acceso recién recuperado en unubertoken : Ahora ubertoken, se desconoce qué se supone que debe hacer realmente y no hay documentación oficial al respecto. Sin embargo, se vio en la naturaleza para ser utilizado por el navegador Chrome para iniciar sesión en los usuarios. Esto se hace solicitando la https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1página.

  3. Conversión ubertokena sesión de sitio web : más adelante, utilizando el recién creado ubertoken, es posible obtener una sesión de sitio web utilizando el https://accounts.google.com/MergeSessionpunto final de la API. Después de este paso, la aplicación es esencialmente capaz de cargar todas las páginas personales que puede abrir usando su navegador mientras está conectado; excepto algunas páginas especiales que incluyen la configuración de pago.

  4. Recuperar la lista de aplicaciones pagas: solicitar y analizar la https://play.google.com/store/accountpágina.

A continuación se muestra el tráfico de la aplicación capturado por ' Captura de paquetes ' :

Tráfico capturado

Como se ve claramente en la imagen, el resultado final es idéntico al que obtengo cuando normalmente abro la página de la cuenta de la tienda en mi PC con Chrome Desktop: Fuente de vista de Chrome

Nota al margen :

Parece que ninguno de estos puntos finales está documentado, ya que los utilizan principalmente los programas de Google y deben considerarse internos. Por lo tanto, recomiendo encarecidamente no usarlos en ningún programa o código que espere ejecutar durante mucho tiempo o en un entorno de producción. Además, aquí también hay malas noticias para usted, parece que la página de la cuenta de Google Play solo enumera aplicaciones pagas o aplicaciones gratuitas especiales (más especialmente aplicaciones OEM). Intentaré encontrar algo de tiempo y profundizar en la otra aplicación.

Artículos interesantes :

Fichas de Pokémon

Explotación de los tokens OAuth2 de Google Chrome

Soroush Falahati
fuente
1
¿Puede mostrar una muestra completa para ver cómo funciona y responder las preguntas que le he hecho? Como escribí, quiero obtener información diversa sobre cada aplicación: precio, cuándo se compró, etc. ¿También es posible obtener la lista de aplicaciones gratuitas?
desarrollador de Android
3

Si tiene acceso de root, puede acceder /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

Esta base de datos tiene toda la información, qué aplicación ha descargado, qué aplicaciones ha comprado e incluso en qué aplicación ha hecho IAP.

Consultar tabla de titularidad, tiene toda la información.

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))
nkalra0123
fuente
1

Tratar con las API de Google no oficiales es un territorio increíblemente complicado. Será posible hacer que esto funcione, pero eso es todo lo que diré. Proceda bajo su propio riesgo.

Lo primero que tendrá que hacer es obtener un token de autenticación de Google Play . Esto se puede hacer de varias maneras, pero así es como lo hacen en las aplicaciones compradas:

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

Algunas cosas a tener en cuenta aquí:

  • El código anterior debe ejecutarse de forma asincrónica . Recomiendo RxJava, pero una AsyncTask funcionará.
  • Debe proporcionar un correo electrónico para la cuenta que desea utilizar. Dejaré los detalles en tus manos, pero esto es bastante fácil de usar AccountManager.

Una vez que tenga un token de autenticación, ahora puede acceder a cualquier punto final de Google Play Store . El principal utilizado por las aplicaciones compradas es https://android.clients.google.com/fdfe/purchaseHistory. Otro que podría interesarle es https://android.clients.google.com/fdfe/details?doc=(package name)(del código APKfetch ). Aquí hay una página con más análisis y más. Si realiza una solicitud a estas API, deberá proporcionar varios encabezados:

  • 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- el ID de marco de servicios de Google de su dispositivo, obtenido de AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- El código de idioma del dispositivo, por ejemplo "en".

Ahora, necesita analizar la respuesta . Aquí es donde las cosas se complican. Estas API devuelven un mensaje codificado como Protobuf , por lo que esencialmente son solo datos binarios a menos que tenga un esquema (que, por supuesto, solo Google tiene). Una forma de hacerlo en teoría es descompilar la aplicación Google Play Store y reutilizar sus modelos de protobuf generados con una herramienta como JADX .

Desafortunadamente, lo intenté y realmente no funciona. Las clases de modelos de Protobuf son demasiado complejas para un descompilador estándar. Lo que puede utilizar es una herramienta llamada PBTK . Idealmente, querrá ejecutar esto en Google Play Store 6.1.12 APK, ya que esa es la última versión antes de que comenzaran a usar ProGuard. Tenga en cuenta que este programa tiene dos errores en su script que deben corregirse antes de ejecutarlo: cambiar 'extracto'a 'extractor'en gui.py y eliminar la declaración de aserción en la línea 500 de jar_extract.py .

Ahora, eso debería generar todas las clases de respuesta como archivos .proto. Cree una carpeta bajo src / main llamada protoy arrastre todo el directorio 'com' generado a ella. Puede eliminar todo lo que no esté debajo com/google/android/finsky/protos. Siga las instrucciones en línea para configurar Gradle con el complemento Protobuf Lite.

Cuando desee analizar una respuesta, puede usar la clase ResponseWrapper, ya que todas parecen estar contenidas debajo de ella.

Eso es lo más lejos que puedo llevarte. Hay una buena posibilidad de que me haya equivocado en parte de esto; JADX es su mejor amigo aquí, porque la mejor manera de averiguar qué está haciendo una aplicación es mirando su código. ¡Espero que esto ayude y feliz desarrollo!

qualverse
fuente
Acerca de AccountManager, ¿estás seguro de que todavía está disponible? Creo que hoy en día Google solo ofrece la opción de usar AccountPicker(como aquí: stackoverflow.com/a/26888259/878126 ). ¿Pero cómo realizo el resto? ¿Lo has probado? ¿Funcionó para ti? Comparta el código para ello. Es por eso que establecí una recompensa, para verlo funcionar en acción ...
desarrollador de Android
Sí, AccountPicker es una mejor idea en realidad. Y sí, probé el código para obtener un token y funciona muy bien. No he probado el resto porque tbh son como al menos 5 horas de trabajo si todo va bien. Incluso una recompensa de 500 no vale eso.
qualverse
1
Sin embargo, aquí está el código completo para obtener un token de autenticación (funciona igual que las aplicaciones compradas en su captura de pantalla): github.com/ethanblake4/PlayStoreDemo
qualverse
Obtener el token de autenticación parece funcionar bien. Pero la parte difícil, creo, es la búsqueda de las aplicaciones en sí :(
desarrollador de Android
Sí, esa es la parte que lamentablemente requiere mucho trabajo. Sin embargo, descompillé el código para las aplicaciones compradas y así es como se hace allí. No dude en avisarme si necesita ayuda con los pasos anteriores.
qualverse
-2

Puede obtener el nombre del paquete de todas las aplicaciones instaladas en el dispositivo y luego obtener la información de cada paquete instalado que encuentre en el dispositivo desde Google Play sin necesidad de acceder a la cuenta de usuario. hay algunas apis de terceros o no oficiales para obtener detalles de las aplicaciones de Google Play como json al obtener el nombre del paquete de la aplicación. por ejemplo: https://42matters.com/ luego use la información recibida para cada paquete para encontrar los gratuitos.

Bahman
fuente
No, la pregunta por la que he puesto recompensa es sobre las aplicaciones que el usuario haya instalado alguna vez, y no solo las que están instaladas ahora. Además, ¿por qué usar no oficial, si hay una forma oficial ...?
desarrollador de Android
@androiddeveloper Supongo que no hay una API oficial para obtener detalles de la aplicación al obtener el nombre del paquete en Google Play. ¿hay alguna api oficial?
Bahman
@androiddeveloper, ¿Google mantiene el nombre de las aplicaciones gratuitas desinstaladas para cada usuario?
Bahman
Si. Si abre la aplicación Play Store, vaya al panel de navegación y luego a "mis aplicaciones y juegos". Verá allí todas las aplicaciones que haya instalado desde allí, y no solo las que están instaladas actualmente. Y según Google, está permitido (o al menos parece que lo dicen) utilizar esta API: issuetracker.google.com/issues/79195087 . O, quienquiera que haya hablado conmigo no está familiarizado con lo que está pasando allí ...
desarrollador de Android
-2

Tengo dos recursos para que los considere, pero primero, en una palabra, no. No hay una API de GOOGLE que te permita hacer lo que quieras, ya que estas métricas no están almacenadas en el teléfono, están en los servidores de Google Play Store y Google no tiene una API OFICIAL para Play Store. Sin embargo, puede obtener información de estos dos sitios:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store ingrese la descripción del enlace aquí

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

y esto es suficiente para ver cómo lograrlo.

En primer lugar, solo la cuenta puede hacer referencia a una lista de las aplicaciones descargadas por una cuenta. y esto se puede hacer a través de Play Store. ya que su aplicación se instalará en el teléfono de ese usuario, este asunto no importa ...

en segundo lugar, necesitará una API de terceros creada para GOOGLE PLAY STORE; hay algunas, consulte el primer enlace.

utilizando la API de su elección, enviará una solicitud de obtención a la tienda de juegos y, a cambio, debería recibir en la mayoría de los casos un objeto json para deserializar.

deserialice el objeto y tendrá su lista. la lista que obtenga dependerá del punto final que utilice, pero eso debería explicarse mediante / en la propia API.

¡buena suerte!

PrinceOfRavens
fuente
En todos los enlaces allí, no veo uno que obtenga una lista de las aplicaciones que fueron instaladas por el usuario actual. Ni siquiera tienen una fase de inicio de sesión. Todos recopilan información genérica sobre las aplicaciones, tanto si el usuario las ha instalado como si no.
desarrollador de Android