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 .
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:
¿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.
¿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?
¿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.
Purchase Apps
archivo 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.jsPurchased Apps
podrí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.Respuestas:
El problema está resuelto. El exploit ha sido cerrado.
Última actualización:
Este es un error y Google lo solucionará en la próxima actualización.
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
androidmarket
API 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
Por ejemplo :
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:
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
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
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:
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/OAuthLogin
se 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.Convertir el token de acceso recién recuperado en un
ubertoken
: Ahoraubertoken
, 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 lahttps://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1
página.Conversión
ubertoken
a sesión de sitio web : más adelante, utilizando el recién creadoubertoken
, es posible obtener una sesión de sitio web utilizando elhttps://accounts.google.com/MergeSession
punto 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.Recuperar la lista de aplicaciones pagas: solicitar y analizar la
https://play.google.com/store/account
página.A continuación se muestra el tráfico de la aplicación capturado por ' Captura de paquetes ' :
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:
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
fuente
Si tiene acceso de root, puede acceder
/data/data/com.android.vending/databases/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.
fuente
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:
Algunas cosas a tener en cuenta aquí:
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 eshttps://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
proto
y arrastre todo el directorio 'com' generado a ella. Puede eliminar todo lo que no esté debajocom/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!
fuente
AccountManager
, ¿estás seguro de que todavía está disponible? Creo que hoy en día Google solo ofrece la opción de usarAccountPicker
(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 ...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.
fuente
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!
fuente