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 .
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:
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.
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?
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.
fonte
Purchase Apps
arquivo 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.jsPurchased Apps
podem 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ê.Respostas:
O problema foi resolvido. A exploração foi fechada.
Última atualização:
Este é um bug e o Google irá corrigi-lo na próxima atualização.
Essa resposta se transformou em um conglomerado de ideias e foi editada para incluir informações da discussão nos comentários.
A
androidmarket
api 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
Por exemplo :
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:
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
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.
fonte
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:
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.Convertendo o token de acesso recém-recuperado em um
ubertoken
: Agora, o que realmenteubertoken
deve 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 ahttps://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1
página.Conversão
ubertoken
para sessão de site : Posteriormente, usando o recém-criadoubertoken
, é possível obter uma sessão de site usando ohttps://accounts.google.com/MergeSession
endpoint 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.Recuperando a lista de aplicativos pagos: Solicitando e analisando a
https://play.google.com/store/account
página.A seguir está o tráfego do aplicativo conforme capturado por ' Packet Capture ' :
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:
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
fonte
Se você tiver acesso root, você pode acessar
/data/data/com.android.vending/databases/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.
fonte
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:
Algumas coisas a serem observadas aqui:
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
proto
e arraste todo o diretório 'com' gerado para ela. Você pode excluir tudo o que não está abaixocom/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!
fonte
AccountManager
, tem certeza de que ainda está disponível? Acho que hoje em dia o Google oferece apenas a opção de usarAccountPicker
(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 ...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.
fonte
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!
fonte