Como obter a lista de aplicativos baixados (pagos / gratuitos) por um usuário do Google Play?


121

Recentemente, encontrei este aplicativo Purchase Apps , que é de alguma forma capaz de recuperar aplicativos pelos quais paguei no Google Play depois que fiz login usando minha conta do Google.

Estou tentando descobrir como isso está sendo feito, pois quero construir um aplicativo semelhante, mas para os aplicativos gratuitos que foram baixados.

No entanto, não consigo encontrar qual escopo da API OAuth foi usado para recuperar essas informações, mesmo depois de passar por toda a lista de APIs .

Login do Google pedindo acesso ao androidmarket


EDIT: Estou colocando uma nova recompensa nesta pergunta, conforme sugerido por uma pergunta semelhante que fiz aqui , e porque aqui e ali não vejo uma resposta real sobre como fazer isso e o que pode ser feito com isso.

Eu gostaria de refinar as perguntas em várias partes:

  1. Qual é a API que pode ser usada para obter informações de aplicativos comprados? Onde posso ler sobre isso? Por favor, mostre um exemplo completo e prático de como fazer isso.

  2. Pode fazer mais? Talvez faça uma pesquisa? Talvez mostrar aplicativos gratuitos que foram instalados? Talvez na hora em que foram instalados e desinstalados? E as categorias desses aplicativos?

  3. Existem requisitos especiais para usar esta API?


EDIT: Estou colocando uma recompensa máxima nisso, porque não importa o quanto eu li e tentei, ainda não consegui fazer um POC que pudesse consultar os aplicativos da Play Store que o usuário já baixou (nome, pacote nome, data de instalação e / ou remoção, URL do ícone, preço ...), incluindo aplicativos pagos e gratuitos.

Se alguém encontrar uma amostra funcional, mostre como é feita e também como você a encontrou (documentação ou qualquer coisa que o tenha levado à solução). Não consigo encontrar em lugar nenhum, e as soluções atuais aqui são muito vagas para começar.



Gostaria de olhar para o iniciador de aplicativo de amostra. Ele sabe quais aplicativos são baixados no telefone.
danny117

@android desenvolvedor: Eu analisei o Purchase Appsarquivo apk por descompilação. Ele nunca usou uma API para obter a lista de aplicativos comprados. Sua abordagem é a mesma que conhecemos, que analisa o conteúdo html da página da web da play store. Aqui está um fragmento deste código: hastebin.com/uceyavurij.js
aminografia

@aminografia Então, como isso chega ao usuário? Afinal, ele precisa obter dados da conta Google do usuário ... Não basta apenas acessar os aplicativos da Play Store ... O que faz com as permissões que lhe são atribuídas?
desenvolvedor Android de

@androiddeveloper: Todas as informações fornecidas por Purchased Appspodem ser recuperadas do conteúdo da web da playstore. Infelizmente, não tenho acesso para comprar um aplicativo do Google Play. Se você compartilhar comigo uma conta que possui um aplicativo comprado, posso desenvolver um código de amostra para você.
aminografia de

Respostas:


51

O problema foi resolvido. A exploração foi fechada.

Estaremos fechando este bug devido a ser registrado em uma versão de visualização do Android. Se o problema ainda for relevante e reproduzível na versão pública mais recente (Android Q), capture um relatório de bug e registre o bug em https://source.android.com/setup/contribute/report-bugs . Se uma resposta não for recebida nos próximos 14 dias, este problema será encerrado. Obrigado pela sua compreensão.


Última atualização:

Este é um bug e o Google irá corrigi-lo na próxima atualização.

Adiamos esse problema para consideração em uma versão futura. Obrigado pelo seu tempo para tornar o Android melhor


Essa resposta se transformou em um conglomerado de ideias e foi editada para incluir informações da discussão nos comentários.

A androidmarketapi seria uma API customizada escrita pelo desenvolvedor. Não está disponível ao público.

Para abordar suas preocupações nos comentários. O desenvolvedor teria utilizado as apis atuais disponíveis no Android Developer e no Google para criar um projeto que gerenciasse tudo isso.

Quanto ao acesso Full Account Access, não sei exatamente como esses desenvolvedores conseguiram isso.

Eu recomendo usar o AccountManager , que faz parte de android.accounts, tem acesso a credenciais e um método getUserData . O gerente da conta tem acesso a senhas e é capaz de criar e excluir contas. Isso, possivelmente usado com o provedor de conteúdo

Consulte Autenticação Udinic / SyncAdapter .

Para responder ao seu comentário:

Este blog deve ajudá-lo a começar. Escreva seu próprio Autenticador Android .


Como esses aplicativos realmente funcionam, eu não posso te dizer. Eles também podem ter implementações diferentes (a menos que sejam um esforço colaborativo nos bastidores, eles certamente serão diferentes).

Um palpite. Em primeiro lugar, use GoogleSignInAccount com com.google.android.gms.auth.api.signin .

Há uma definição de escopo , para determinar a extensão das permissões que o aplicativo é concedido.

Usando requestScopes () , o

public static final String PROFILE

... / Permite que seu aplicativo da web acesse instalações de aplicativos Android remotos.

Por exemplo :

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

Se o acesso total puder ser obtido, uma lista de todos os aplicativos usados ​​pelo titular da conta pode ser encontrada e comparada com o que está no dispositivo.

O Gerenciador de pacotes recuperará uma lista de todos os aplicativos instalados atualmente no dispositivo.
PackageInfo fornece os detalhes sobre o aplicativo.
INSTALL_REASON_USER também filtrará aplicativos que foram instalados ativamente pelo usuário.

Você pode querer dar uma olhada em com.google.firebase.appindexing e Registrar ações do usuário . Diferentes ações podem ser rastreadas.

O histórico da conta do usuário pode ser encontrado em https://myactivity.google.com/myactivity .

Um link útil é o OAuth 2.0 Playground .


Este github repo node-google-play , usando node, é atual e chamará APIs do Google Play. Assim como o arquivo que foi usado como uma api "não oficial", android-market-api , para consultar o mercado.


App 1

O aplicativo afirma usar as seguintes permissões:

A versão 2.1.8 pode acessar:
$ compras no aplicativo

De outros

  • receber dados da Internet
  • ver conexões de rede
  • acesso total à rede
  • usar contas no dispositivo
  • evitar que o dispositivo hiberne
  • leia a configuração do serviço Google

Digno de nota, o aplicativo não define nenhuma permissão quando há uma instalação básica. Não consegui usar nenhum dos recursos, pois não tenho aplicativos pagos. Portanto, para a pesquisa inicial - não foram necessárias permissões, o que indicaria que o aplicativo não tinha acesso à minha conta.

Eu verifiquei as permissões - não havia nenhuma definida. Portanto, a única coisa necessária era aceitar o pop-up, conforme exibido em sua pergunta.


App 2

O outro aplicativo ao qual você se refere que faz a mesma coisa é mais direto sobre o que está sendo acessado.

Meus aplicativos pagos

AVISO DE SEGURANÇA / PRIVACIDADE
Na primeira vez que você executar este aplicativo, ele pedirá permissão total para sua conta do Google. Infelizmente, esta é a única maneira de acessar as informações necessárias. Nenhuma informação pessoal é armazenada, nenhuma informação sobre seus aplicativos é compartilhada com o desenvolvedor deste aplicativo, nem compartilhada com terceiros. Tudo é mantido apenas no seu telefone.


Eu entrei em detalhes sobre esses aplicativos nesta postagem do blog , que era para um projeto de conclusão de universidade (sem ganho monetário). Estou inclinado a pensar que isso é uma exploração na API e não o status do projeto do Google, já que não há chamadas de API para buscar compras de aplicativos que não sejam o próprio aplicativo do desenvolvedor. Eu suponho que seja um exploit de dia zero e, nesse caso, não há uma maneira legítima de acessar essas informações.


10

No caso de um desses aplicativos (Meus Aplicativos Pagos), após verificar o tráfego da rede, é bastante óbvio que ele usa a página Conta da Loja para recuperar a lista de aplicativos pagos. Agora, o mecanismo que ele usa é o mesmo mecanismo que o Google Chrome atualmente, e o Pokémon GO supostamente em um momento usado.

Em suma, as etapas para fazer isso são as seguintes:

  1. Login : o que o programa mencionado faz na primeira etapa é fazer o login do usuário e obter acesso ao token de acesso do usuário. Para fazer isso, ele usa o android.accounts.AccountManager.getAuthToken()método. (Veja mais: AccountManager ) Porém, quanto ao escopo do token, oauth2:https://www.google.com/accounts/OAuthLoginé solicitado. Pode ser importante observar que, com base na documentação OAth2 do Google, esse escopo não é válido; no entanto, parece um escopo válido para o Google OAuth v1.

  2. Convertendo o token de acesso recém-recuperado em umubertoken : Agora, o que realmente ubertokendeve ser feito é desconhecido e não há documentação oficial sobre isso. No entanto, ele foi visto à solta para ser usado pelo navegador Chrome para fazer login de usuários. Isso é feito solicitando a https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1página.

  3. Conversão ubertokenpara sessão de site : Posteriormente, usando o recém-criado ubertoken, é possível obter uma sessão de site usando o https://accounts.google.com/MergeSessionendpoint da API. Após esta etapa, o aplicativo é essencialmente capaz de carregar todas as páginas pessoais que você pode abrir usando seu navegador enquanto estiver conectado; exceto algumas páginas especiais, incluindo configurações de pagamento.

  4. Recuperando a lista de aplicativos pagos: Solicitando e analisando a https://play.google.com/store/accountpágina.

A seguir está o tráfego do aplicativo conforme capturado por ' Packet Capture ' :

Tráfego capturado

Como é claramente visível na imagem, o resultado final é idêntico ao que recebo quando normalmente abro a página da conta da loja no meu PC com o Chrome Desktop: Fonte de visualização do Chrome

Nota lateral :

Parece que nenhum desses endpoints está documentado, pois são usados ​​principalmente pelos próprios programas do Google e devem ser considerados internos. Portanto, eu recomendo fortemente não usá-los em qualquer programa ou código que você espera executar por muito tempo ou em um ambiente de produção. Além disso, também há más notícias para você, parece que a página da conta do Google Play lista apenas aplicativos pagos ou aplicativos gratuitos especiais (mais especialmente aplicativos OEM). Vou tentar encontrar algum tempo e me aprofundar na outra aplicação.

Artigos interessantes :

Tokens de Pokémon

Explorando tokens OAuth2 do Google Chrome


1
Você pode mostrar um exemplo completo para ver como funciona e responder às perguntas que fiz? Como escrevi, quero obter várias informações sobre cada aplicativo: preço, quando comprado, etc ... Também é possível obter a lista de aplicativos gratuitos?
desenvolvedor Android de

3

Se você tiver acesso root, você pode acessar /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

Este banco de dados contém todas as informações, qual aplicativo você baixou, quais aplicativos você comprou e até mesmo em qual aplicativo você fez IAP.

Verifique a tabela de propriedade, Tem todas as informações.

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

Lidar com APIs não oficiais do Google é um território incrivelmente complicado. Vai ser possível fazer isso funcionar, mas é tudo o que direi. Prossiga por sua conta e risco.

A primeira coisa que você precisa fazer é obter um token de autenticação do Google Play . Isso pode ser feito de várias maneiras, mas aqui está como eles fazem em aplicativos adquiridos:

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

Algumas coisas a serem observadas aqui:

  • O código acima deve ser executado de forma assíncrona . Eu recomendo RxJava, mas uma AsyncTask funcionará.
  • Você deve fornecer um e-mail para a conta que deseja usar. Vou deixar os detalhes com você, mas isso é bastante fácil de usar AccountManager.

Depois de ter um token de autenticação, agora você pode acessar qualquer ponto de extremidade da Google Play Store . O principal usado pelos aplicativos adquiridos é https://android.clients.google.com/fdfe/purchaseHistory. Outro que você pode estar interessado é https://android.clients.google.com/fdfe/details?doc=(package name)(do código APKfetch ). Aqui está uma página com mais algumas análises. Se você fizer uma solicitação a essas APIs, precisará fornecer vários cabeçalhos:

  • 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- o Google Services Framework ID do seu dispositivo, obtido de AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- O código de idioma do dispositivo, por exemplo "en".

Agora, você precisa analisar a resposta . É aqui que as coisas ficam complicadas. Essas APIs retornam uma mensagem codificada como um Protobuf , portanto, são essencialmente apenas dados binários, a menos que você tenha um esquema (que, claro, só o Google tem). Uma maneira de fazer isso em teoria é descompilar o aplicativo Google Play Store e reutilizar seus modelos protobuf gerados com uma ferramenta como o JADX .

Infelizmente, tentei fazer isso e realmente não funciona. As classes de modelo Protobuf são muito complexas para um descompilador padrão. O que você pode usar é uma ferramenta chamada PBTK . O ideal é executá-lo no APK 6.1.12 da Google Play Store, já que essa é a última versão antes de começarem a usar o ProGuard. Observe que este programa tem dois erros em seu script que precisam ser corrigidos antes de executá-lo: alterar 'extracto'para 'extractor'em gui.py e remover a declaração de asserção na linha 500 de jar_extract.py .

Agora, isso deve gerar todas as classes de resposta como arquivos .proto. Crie uma pasta sob src / main chamada protoe arraste todo o diretório 'com' gerado para ela. Você pode excluir tudo o que não está abaixo com/google/android/finsky/protos. Siga as instruções online para configurar o Gradle com o plug-in Protobuf Lite.

Quando você deseja analisar uma resposta, pode usar a classe ResponseWrapper, uma vez que todas parecem estar contidas nela.

Isso é o mais longe que eu posso te levar. Há uma boa chance de eu ter entendido algo errado; JADX é seu melhor amigo aqui, porque a melhor maneira de descobrir o que um aplicativo está fazendo é olhando seu código. Espero que isso ajude e feliz desenvolvimento!


Sobre AccountManager, tem certeza de que ainda está disponível? Acho que hoje em dia o Google oferece apenas a opção de usar AccountPicker(como aqui: stackoverflow.com/a/26888259/878126 ). Mas como faço o resto? Você já testou? Isso funcionou para você? Por favor, compartilhe o código para isso. É por isso que estabeleci uma recompensa, para vê-lo funcionar em ação ...
desenvolvedor Android

Sim, AccountPicker é uma ideia melhor, na verdade. E sim, eu tentei o código para obter um token e funcionou muito bem. Eu não tentei o resto porque tbh são pelo menos 5 horas de trabalho se tudo correr bem. Mesmo uma recompensa de 500 não vale isso.
qualverse

1
No entanto, aqui está o código completo para obter um token de autenticação (ele funciona como aplicativos adquiridos
qualverse

Obter o token de autenticação parece funcionar bem. Mas a parte difícil, eu acho, é a busca dos próprios aplicativos :(
desenvolvedor Android

Sim, essa é a parte que dá muito trabalho, infelizmente. No entanto, eu descompilei o código dos aplicativos adquiridos e é assim que é feito lá. Sinta-se à vontade para me avisar se precisar de ajuda nas etapas acima.
qualverse

-2

você pode obter o nome do pacote de todos os aplicativos instalados no dispositivo e, em seguida, obter as informações de cada pacote instalado que você encontrar no dispositivo do Google Play sem a necessidade de acessar a conta do usuário. há alguns apis de terceiros ou não oficiais para obter detalhes de aplicativos do Google Play como json obtendo o nome do pacote do aplicativo. por exemplo: https://42matters.com/ então use as informações recebidas para cada pacote para encontrar os gratuitos.


Não, a questão que coloquei na recompensa é sobre os aplicativos que o usuário já instalou, e não apenas os que estão instalados agora. Além disso, por que usar não oficial, se existe uma maneira oficial ...
desenvolvedor Android

@androiddeveloper Acho que não há uma API oficial para obter detalhes do aplicativo obtendo o nome do pacote no Google Play. existe alguma api oficial?
Bahman

@androiddeveloper o google mantém o nome dos aplicativos gratuitos desinstalados para cada usuário?
Bahman

Sim. Se você abrir o aplicativo Play Store, vá para a gaveta de navegação e, em seguida, para "meus aplicativos e jogos". Você verá todos os aplicativos que já instalou a partir daí, e não apenas aqueles que estão instalados atualmente. E de acordo com o Google, é permitido (ou pelo menos parece que dizem) usar esta API: issuetracker.google.com/issues/79195087 . Ou quem quer que tenha falado comigo não está familiarizado com o que está acontecendo lá ...
desenvolvedor Android

-2

eu tenho dois recursos para você considerar, mas primeiro, em uma palavra, não. não há api do GOOGLE para permitir que você faça o que quiser, pois essas métricas não estão armazenadas no telefone, estão nos servidores da google play store, e o google não tem API OFICIAL para a play store. no entanto, você pode obter algumas informações desses dois sites:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store insira a descrição do link aqui

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

e isso é o suficiente para ver como fazer isso.

primeiro, uma lista de quais aplicativos foram baixados por uma conta só pode ser consultada pela conta. e isso pode ser feito na loja de jogos. já que seu aplicativo será instalado no telefone do usuário, isso não importa ... você está dentro.

segundo, você precisará de uma API de terceiros desenvolvida para a GOOGLE PLAY STORE, existem algumas por aí, verifique o primeiro link.

usando a api de sua escolha, você enviará uma solicitação get para a play store e, em troca, receberá, na maioria dos casos, um objeto json para desserializar.

desserialize o objeto e você terá sua lista. a lista que você obterá dependerá do ponto de extremidade usado, mas isso deve ser explicado por / na própria API.

boa sorte!


Em todos os links lá, não vejo um que obtenha a lista dos aplicativos que foram instalados pelo usuário atual. Eles nem mesmo têm uma fase de login. Todos eles reúnem informações genéricas sobre os aplicativos, quer o usuário os tenha instalado ou não.
desenvolvedor Android
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.