android - por - play store
¿Cómo obtener una lista de aplicaciones descargadas(de pago/gratuitas) de un usuario de Google Play? (6)
Última actualización:
Esto 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 ha sido editada para incluir información de la discusión en los comentarios.
La API de
androidmarket
, 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 API actuales disponibles a través de Android Developer y Google para crear un proyecto que gestione todo esto.
En cuanto al acceso
Full Account Access
, no estoy seguro exactamente cómo estos desarrolladores han logrado esto.
Recomiendo usar AccountManager , que es parte de android.accounts, tiene acceso a credenciales y a un método getUserData . El administrador de la cuenta tiene acceso a las contraseñas y es capaz de crear y eliminar cuentas. Esto, posiblemente usado con el proveedor de contenido
Consulte Autenticación Udinic / SyncAdapter .
Para responder a tu comentario:
Este blog debería ayudarte a comenzar. Escribe tu propio autenticador de Android .
Cómo funcionan realmente estas aplicaciones, no puedo decirte. También pueden tener implementaciones diferentes (a menos que sean un esfuerzo de colaboración detrás de escena, seguramente serán diferentes).
Una suposición Primero use GoogleSignInAccount con com.google.android.gms.auth.api.signin .
Existe una definición de scope , para determinar la extensión de los permisos que se le otorga a la aplicación.
Usando requestScopes() , el
perfil de cadena final público estático
... / Permite que su aplicación web acceda a instalaciones de aplicaciones de Android por aire.
Por example :
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.
Package Manager
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 ver com.google.firebase.appindexing y registrar acciones del usuario . Se pueden rastrear diferentes actions .
El historial de la cuenta de los usuarios se encuentra en https://myactivity.google.com/myactivity .
Un enlace útil es el OAuth 2.0 Playground .
Este repositorio github node-google-play , que usa node, es actual y llamará a las API de Google Play. Al igual que el archivo que se utilizó como api "no oficial", android-market-api , para consultar el mercado.
Aplicación 1
La aplicación afirma usar los siguientes permisos:
La versión 2.1.8 puede acceder a:
$ Compras en la aplicaciónOtro
- 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 había una instalación básica. No pude usar ninguna de las funciones, ya que 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 se refiere que hace lo mismo es más directa sobre lo que se está accediendo.
AVISO DE SEGURIDAD / PRIVACIDAD
La primera vez que ejecute esta aplicación, le pedirá permiso completo a 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 con terceros. Todo se guarda solo en su teléfono.
Entré 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 una vulnerabilidad en la API y no el estado por diseño de Google, ya que no hay llamadas API para recuperar 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.
Recientemente me encontré con esta aplicación Comprar aplicaciones , que de alguna manera es capaz de recuperar aplicaciones que he pagado 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é OAuth API Scope se utilizó para recuperar esa información, incluso después de revisar toda la lista de API .
EDITAR: estoy poniendo una nueva recompensa sobre esta pregunta, como lo sugiere una pregunta similar que he hecho here , 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 usar para obtener información de las aplicaciones compradas? ¿Dónde puedo leer al respecto? Muestre un ejemplo completo y práctico de cómo hacerlo.
-
¿Se puede hacer más? Tal vez realizar la 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?
-
¿Hay algún requisito especial para usar 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 ha descargado (nombre, paquete nombre, fecha de instalación y / o eliminación, icono de URL, precio ...), incluidas las aplicaciones pagas y gratuitas.
Si alguien encuentra una muestra que funcione, muestre cómo se hace y también cómo se ha encontrado al respecto (documentación o cualquier cosa que lo haya llevado a la solución). No puedo encontrarlo en ningún lado, y las soluciones actuales aquí son demasiado vagas para comenzar.
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 utiliza es el mismo mecanismo que Google Chrome actualmente, y Pokemon GO supuestamente en un punto en el tiempo utilizado.
En pocas palabras, los pasos para hacerlo son los siguientes:
-
Inicio de sesión : lo que hace el programa mencionado para el primer paso es iniciar sesión en el usuario y obtener acceso al token de acceso del usuario. Para hacerlo, utiliza el método
android.accounts.AccountManager.getAuthToken()
. (Ver más: AccountManager ) Sin embargo, en cuanto al alcance del token, seoauth2:https://www.google.com/accounts/OAuthLogin
. 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
: ahora, lo que se supone que debe hacerubertoken
, es desconocido 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 de
ubertoken
a sesión de sitio web : más adelante, utilizando elubertoken
recién creado, es posible obtener una sesión de sitio web utilizando el punto finalhttps://accounts.google.com/MergeSession
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. -
Recuperación de la lista de aplicaciones pagas: solicitud y análisis de la página
https://play.google.com/store/account
.
El siguiente es el tráfico de la aplicación capturado por '' Captura de paquetes '' :
Como es claramente visible 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 son utilizados principalmente por los propios programas de Google y deben considerarse internos. Por lo tanto, recomiendo 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
Si tiene acceso de root, puede acceder a
/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 realizado
IAP
.
Consulte la tabla de propiedad, 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))
Tengo dos recursos para que consideres, pero primero, en una palabra, no. no hay una API de GOOGLE que le permita hacer lo que quiera, ya que estas métricas no se almacenan 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 https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store
y esto es suficiente para ver cómo lograr esto.
primero, una lista de qué aplicaciones han sido descargadas por una cuenta solo es referenciable por la 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, esta dosificación es importante ... está dentro.
segundo, necesitará una API de terceros creada para GOOGLE PLAY STORE, hay algunas disponibles, consulte el primer enlace.
utilizando la API de su elección, enviará una solicitud de obtención a Play Store 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. qué lista obtendrá dependerá del punto final que utilice, pero eso debería explicarse por / en la API misma.
¡buena suerte!
Tratar con API no oficiales de Google 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 un AsyncTask funcionará.
-
Debe proporcionar un correo electrónico para la cuenta que desea usar.
AccountManager
los detalles a usted, pero esto es bastante fácil conAccountManager
.
Después de tener 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
paquete
https://android.clients.google.com/fdfe/details?doc=(package name)
(del
código APKfetch
).
Aquí hay una página con más y un poco de análisis.
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 ponen difíciles. Estas API devuelven un mensaje codificado como un Protobuf , por lo que se trata esencialmente de datos binarios a menos que tenga un esquema (que, por supuesto, solo Google tiene). En teoría, una forma de hacerlo es descompilar la aplicación Google Play Store y reutilizar sus modelos de protofobs generados con una herramienta como JADX .
Desafortunadamente, he intentado esto y realmente no funciona.
Las clases de modelo de Protobuf son demasiado complejas para un descompilador estándar.
Lo que puedes usar es una herramienta llamada
PBTK
.
Lo ideal sería ejecutar esto en el APK de Google Play Store 6.1.12, 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 en src / main llamada
proto
y arrastre todo el directorio ''com'' generado a él.
Puede eliminar todo lo que no esté en
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 todos parecen estar contenidos debajo de eso.
Eso es lo más lejos que puedo llevarte. Hay una buena posibilidad de que me haya equivocado parte de esto; JADX es tu mejor amigo aquí, porque la mejor manera de descubrir qué está haciendo una aplicación es mirar su código. Espero que esto ayude y feliz desarrollo!
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 API de terceros o no oficiales para obtener detalles de 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.