Jak uzyskać listę pobranych aplikacji (płatnych / bezpłatnych) przez użytkownika z Google Play?

121

Niedawno natknąłem się na tę aplikację Kup aplikacje , która w jakiś sposób jest w stanie odzyskać aplikacje, za które zapłaciłem w Google Play po zalogowaniu się przy użyciu konta Google.

Próbuję dowiedzieć się, jak to się robi, ponieważ chcę zbudować podobną aplikację, ale dla bezpłatnych aplikacji, które zostały pobrane.

Nie mogę jednak znaleźć zakresu interfejsu API OAuth, który został użyty do pobrania tych informacji, nawet po przejrzeniu całej listy interfejsów API .

Zaloguj się Google z prośbą o dostęp do androidmarket


EDYCJA: Stawiam nową nagrodę za to pytanie, jak sugeruje podobne pytanie, o które tutaj zadałem , a ponieważ tu i tam nie widzę prawdziwej odpowiedzi, jak to zrobić i co można zrobić z tym.

Chciałbym zawęzić pytania do kilku części:

  1. Jaki interfejs API można wykorzystać do uzyskania informacji o zakupionych aplikacjach? Gdzie mogę o tym poczytać? Pokaż pełny, działający przykład, jak to zrobić.

  2. Czy może więcej? Może przeprowadzić wyszukiwanie? Może pokazać darmowe aplikacje, które zostały zainstalowane? Może kiedy zostały zainstalowane i odinstalowane? A kategorie tych aplikacji?

  3. Czy są jakieś specjalne wymagania dotyczące korzystania z tego interfejsu API?


EDYCJA: Stawiam za to maksymalną nagrodę, ponieważ bez względu na to, ile przeczytałem i próbowałem, nadal nie udało mi się utworzyć POC, który może wysyłać zapytania do aplikacji ze Sklepu Play, które użytkownik kiedykolwiek pobrał (nazwa, pakiet nazwa, data zainstalowania i / lub usunięcia, adres URL ikony, cena ...), w tym zarówno płatne, jak i bezpłatne aplikacje.

Jeśli ktoś znajdzie działającą próbkę, pokaż, jak to się robi, a także pokaż, w jaki sposób ją znalazłeś (dokumentacja lub cokolwiek, co doprowadziło Cię do rozwiązania). Nie mogę go nigdzie znaleźć, a obecne rozwiązania są dla mnie zbyt niejasne, aby zacząć od nich.

abhiank
źródło
Spojrzałbym na przykładowy program uruchamiający aplikacje. Wie, jakie aplikacje są pobierane na telefon.
danny117
@android developer: przeanalizowałem Purchase Appsplik apk przez dekompilację. Nigdy nie korzystał z żadnego interfejsu API, aby uzyskać listę zakupionych aplikacji. Jego podejście jest takie samo, jak wiemy, które analizuje zawartość html strony internetowej sklepu Play. Oto fragment tego kodu: hastebin.com/uceyavurij.js
aminography
@aminografia Jak więc uzyskuje to dla użytkownika? W końcu musi pobrać dane z konta Google użytkownika ... Nie wystarczy uzyskać dostęp do aplikacji Sklepu Play ... Co to robi z nadanymi mu uprawnieniami?
programista Androida
@androiddeveloper: wszystkie informacje dostarczane przez Purchased Appsmożna pobrać z treści internetowych sklepu playstore. Niestety nie mam dostępu do kupowania aplikacji z Google Play. Jeśli udostępniasz mi konto, na którym jest kupiona aplikacja, mogę opracować dla Ciebie przykładowy kod.
aminografia

Odpowiedzi:

51

Problem został rozwiązany. Exploit został zamknięty.

Będziemy zamykać ten błąd, ponieważ jesteśmy zalogowani w wersji zapoznawczej Androida. Jeśli problem jest nadal istotny i można go odtworzyć w najnowszej publicznej wersji (Android Q), zapisz raport o błędzie i zaloguj się na stronie https://source.android.com/setup/contribute/report-bugs . Jeśli nie otrzymamy odpowiedzi w ciągu najbliższych 14 dni, sprawa zostanie zamknięta. Dziękuję za zrozumienie.


Najnowsza aktualizacja:

To jest błąd i Google zajmie się nim w następnej aktualizacji.

Odłożyliśmy ten problem do rozważenia w przyszłej wersji. Dziękujemy za poświęcony czas na ulepszanie Androida


Ta odpowiedź przekształciła się w konglomerat pomysłów i została zredagowana tak, aby zawierała informacje z dyskusji w komentarzach.

Interfejs androidmarketAPI byłby dostosowanym interfejsem API napisanym przez programistę. Nie jest dostępny publicznie.

Aby odpowiedzieć na Twoje obawy w komentarzach. Deweloper wykorzystałby obecny interfejs API dostępny w Android Developer i Google, aby stworzyć projekt, który zarządza wszystkimi tymi elementami.

Jeśli chodzi o dostęp Full Account Access, nie jestem pewien, jak dokładnie ci programiści to osiągnęli.

Polecam użycie AccountManagera , który jest częścią android.accounts, ma dostęp do poświadczeń i metody getUserData . Menedżer konta ma dostęp do haseł i jest w stanie tworzyć i usuwać konta. To prawdopodobnie używane z dostawcą treści

Zobacz Uwierzytelnianie Udinic / SyncAdapter .

Aby odpowiedzieć na Twój komentarz:

Ten blog powinien pomóc Ci zacząć. Napisz swój własny Android Authenticator .


Jak te aplikacje faktycznie działają, nie mogę ci powiedzieć. Mogą również mieć różne implementacje (chyba że są wspólnym wysiłkiem za kulisami, z pewnością będą inne).

Jedno przypuszczenie. Najpierw użyj GoogleSignInAccount z com.google.android.gms.auth.api.signin .

Istnieje definicja zakresu , aby określić zakres uprawnień, które aplikacja jest przyznawana.

Korzystanie requestScopes () ,

public static final String PROFILE

... / Umożliwia aplikacji internetowej dostęp do bezprzewodowych instalacji aplikacji na Androida.

Na przykład :

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

Jeśli można uzyskać pełny dostęp, można znaleźć listę wszystkich aplikacji używanych przez właściciela konta i porównać ją z tym, co jest na urządzeniu.

Menedżer pakietów pobierze listę wszystkich aplikacji aktualnie zainstalowanych na urządzeniu.
PackageInfo zawiera szczegółowe informacje o aplikacji.
INSTALL_REASON_USER odfiltruje również aplikacje, które zostały aktywnie zainstalowane przez użytkownika.

Warto przyjrzeć się com.google.firebase.appindexing i rejestrować działania użytkownika . Można śledzić różne działania .

Historia kont użytkowników znajduje się pod adresem https://myactivity.google.com/myactivity .

Pomocnym łączem jest OAuth 2.0 Playground .


Ten węzeł repozytorium github -google-play , używający węzła, jest aktualny i będzie wywoływał interfejsy API Google Play. Podobnie jak archiwum, które było używane jako „nieoficjalny” interfejs API, android-market-api , do wysyłania zapytań o rynek.


Aplikacja 1

Aplikacja twierdzi wykorzystać następujące uprawnienia:

Wersja 2.1.8 ma dostęp do:
$ zakupów w aplikacji

Inny

  • odbierać dane z Internetu
  • przeglądać połączenia sieciowe
  • pełny dostęp do sieci
  • korzystać z kont na urządzeniu
  • zapobiec zasypianiu urządzenia
  • przeczytaj konfigurację usług Google

Warto zauważyć, że aplikacja nie ustawia żadnych uprawnień, gdy była podstawowa instalacja. Nie mogłem skorzystać z żadnej funkcji, ponieważ nie mam płatnych aplikacji. Więc dla początkowego wyszukiwania - nie były potrzebne żadne uprawnienia, co wskazywałoby, że aplikacja nie miała dostępu do mojego konta.

Sprawdziłem uprawnienia - nie były ustawione. Więc jedyną wymaganą rzeczą było zaakceptowanie wyskakującego okienka wyświetlanego w pytaniu.


Aplikacja 2

Druga aplikacja, do której się odnosisz, robi to samo, jest bardziej otwarta na temat tego, do czego uzyskujesz dostęp.

Moje płatne aplikacje

INFORMACJA O BEZPIECZEŃSTWIE / PRYWATNOŚCI
Przy pierwszym uruchomieniu tej aplikacji poprosi ona o pełne pozwolenie na dostęp do Twojego konta Google. Jest to niestety jedyny sposób uzyskania dostępu do wymaganych informacji. Żadne dane osobowe nie są przechowywane, żadne informacje o twoich aplikacjach nie są udostępniane twórcom tej aplikacji ani udostępniane osobom trzecim. Wszystko jest przechowywane tylko w Twoim telefonie.


Omówiłem szczegółowo te aplikacje w tym poście na blogu , który dotyczył projektu zwieńczenia uniwersytetu (bez zysku finansowego). Jestem skłonny sądzić, że jest to exploit w API, a nie stan z założenia przez Google, ponieważ nie ma wywołań API w celu pobrania zakupów aplikacji innych niż własna aplikacja programisty. Stawiam hipotezę, że jest to exploit typu zero day, w którym to przypadku nie ma legalnego sposobu uzyskania dostępu do tych informacji.


źródło
10

W przypadku jednej z tych aplikacji (My Paid Apps), po sprawdzeniu ruchu sieciowego jest całkiem oczywiste, że używa ona strony Konta Sklepu do pobrania listy płatnych aplikacji. Teraz mechanizm, którego używa, jest tym samym mechanizmem, którego używa Google Chrome obecnie i Pokemon GO podobno w pewnym momencie.

Krótko mówiąc, kroki, które należy wykonać, są następujące:

  1. Logowanie : Wspomniany program w pierwszym kroku loguje użytkownika i uzyskuje dostęp do tokena dostępu użytkownika. Aby to zrobić, używa android.accounts.AccountManager.getAuthToken()metody. (Zobacz więcej: AccountManager ) Jednak, jak w przypadku zakresu tokenu, oauth2:https://www.google.com/accounts/OAuthLoginjest wymagane. Warto zauważyć, że na podstawie dokumentacji OAth2 od Google ten zakres jest nieprawidłowy; wydaje się jednak, że jest to prawidłowy zakres dla Google OAuth v1.

  2. Konwersja nowo pobranego tokena dostępu na aubertoken : Teraz, co właściwie ubertokenpowinno zrobić, jest nieznane i nie ma na ten temat oficjalnej dokumentacji. Jednak w środowisku naturalnym był używany przez przeglądarkę Chrome do logowania użytkowników. Odbywa się to poprzez żądanie https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1strony.

  3. Konwersja ubertokenna sesję WWW : Później za pomocą nowo utworzonej ubertokensesji można uzyskać sesję WWW za pomocą https://accounts.google.com/MergeSessionpunktu końcowego API. Po tym kroku aplikacja jest w zasadzie w stanie załadować wszystkie osobiste strony, które możesz otworzyć za pomocą przeglądarki po zalogowaniu; z wyjątkiem niektórych stron specjalnych, w tym ustawień płatności.

  4. Pobieranie listy płatnych aplikacji: żądanie i analiza https://play.google.com/store/accountstrony.

Poniżej przedstawiono ruch aplikacji przechwycony przez „ Przechwytywanie pakietów :

Przechwycony ruch

Jak widać na zdjęciu, efekt końcowy jest identyczny z tym, co otrzymuję, gdy normalnie otwieram stronę konta sklepu na moim komputerze z Chrome Desktop: Źródło widoku Chrome

Uwaga dodatkowa :

Wygląda na to, że żaden z tych punktów końcowych nie jest udokumentowany, ponieważ są używane głównie przez własne programy Google i powinny być traktowane jako wewnętrzne. Dlatego zdecydowanie odradzam używanie ich w żadnym programie lub kodzie, który ma działać przez długi czas lub w środowisku produkcyjnym. Jest też dla ciebie zła wiadomość, wydaje się, że strona konta Google Play zawiera tylko płatne aplikacje lub specjalne bezpłatne aplikacje (zwłaszcza aplikacje OEM). Postaram się znaleźć trochę czasu i zagłębić się w inną aplikację.

Ciekawe artykuły :

Tokeny Pokemonów

Wykorzystywanie tokenów OAuth2 przeglądarki Google Chrome

Soroush Falahati
źródło
1
Czy możesz pokazać pełną próbkę, aby zobaczyć, jak to działa i odpowiedzieć na pytania, które zadałem? Tak jak napisałem, chcę uzyskać różne informacje o każdej aplikacji: cenę, datę zakupu itp. Czy jest też możliwość uzyskania listy darmowych aplikacji?
programista Androida
3

Jeśli masz uprawnienia administratora, możesz uzyskać dostęp /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

Ta baza danych zawiera wszystkie informacje, którą aplikację pobrałeś, które aplikacje kupiłeś, a nawet w której aplikacji zrobiłeś IAP.

Sprawdź tabelę własności, zawiera wszystkie informacje.

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
źródło
1

Radzenie sobie z nieoficjalnymi interfejsami API Google to niezwykle skomplikowany obszar. Będzie możliwe, aby to zadziałało, ale to wszystko, co powiem. Postępuj na własne ryzyko.

Pierwszą rzeczą, którą musisz zrobić, jest zdobycie tokena autoryzacji Google Play . Można to zrobić na kilka sposobów, ale oto jak robią to w zakupionych aplikacjach:

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

Kilka rzeczy, na które należy zwrócić uwagę:

  • Powyższy kod musi być uruchamiany asynchronicznie . Polecam RxJava, ale AsyncTask będzie działać.
  • Musisz podać adres e-mail konta, którego chcesz używać. Szczegóły pozostawię Tobie, ale jest to dość łatwe w użyciu AccountManager.

Po uzyskaniu tokena uwierzytelniania możesz teraz uzyskać dostęp do dowolnego punktu końcowego Sklepu Google Play . Głównym używanym przez zakupione aplikacje jest https://android.clients.google.com/fdfe/purchaseHistory. Innym, który może Cię zainteresować, jest https://android.clients.google.com/fdfe/details?doc=(package name)(z kodu APKfetch ). Oto strona zawierająca więcej i trochę analiz. Jeśli wysyłasz żądanie do tych interfejsów API, musisz podać kilka nagłówków:

  • 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- identyfikator Google Services Framework Twojego urządzenia uzyskany z AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- Kod języka urządzenia, np "en".

Teraz musisz przeanalizować odpowiedź . Oto, gdzie sprawy stają się trudne. Te interfejsy API zwracają wiadomość zakodowaną jako Protobuf , więc zasadniczo są to tylko dane binarne, chyba że masz schemat (który oczywiście ma tylko Google). Jednym ze sposobów rozwiązania tego w teorii jest dekompilacja aplikacji Sklep Google Play i ponowne użycie ich wygenerowanych modeli protobuf za pomocą narzędzia takiego jak JADX .

Niestety próbowałem tego i tak naprawdę nie działa. Klasy modeli Protobuf są po prostu zbyt złożone dla standardowego dekompilatora. Możesz użyć narzędzia o nazwie PBTK . Najlepiej byłoby uruchomić to w Google Play Store 6.1.12 APK, ponieważ jest to ostatnia wersja przed rozpoczęciem korzystania z ProGuard. Zwróć uwagę, że ten program ma dwa błędy w swoim skrypcie, które należy naprawić przed jego uruchomieniem: zmiana 'extracto'na 'extractor'w gui.py i usunięcie instrukcji asercji w wierszu 500 pliku jar_extract.py .

Teraz powinno to wypisać wszystkie klasy odpowiedzi jako pliki .proto. Utwórz folder w src / main o nazwie protoi przeciągnij do niego cały wygenerowany katalog „com”. Możesz usunąć wszystko, czego nie ma pod com/google/android/finsky/protos. Postępuj zgodnie z instrukcjami online, aby skonfigurować Gradle z wtyczką Protobuf Lite.

Jeśli chcesz przeanalizować odpowiedź, możesz użyć klasy ResponseWrapper, ponieważ wszystkie wydają się być pod nią zawarte.

To mniej więcej tak daleko, jak mogę cię zabrać. Jest duża szansa, że ​​jakaś część tego pomyliłem; JADX jest tutaj Twoim najlepszym przyjacielem, ponieważ najlepszym sposobem sprawdzenia, co robi aplikacja, jest spojrzenie na jej kod. Mam nadzieję, że to pomoże i szczęśliwego rozwoju!

qualverse
źródło
O AccountManager, czy na pewno jest nadal dostępny? Myślę, że w dzisiejszych czasach Google daje tylko możliwość użycia AccountPicker(jak tutaj: stackoverflow.com/a/26888259/878126 ). Ale jak mam wykonać resztę? Czy to przetestowałeś? Czy to zadziałało? Udostępnij kod. Dlatego wyznaczyłem nagrodę, aby zobaczyć, jak działa ...
programista Androida
Tak, AccountPicker to lepszy pomysł. I tak, wypróbowałem kod do uzyskania tokena i działa świetnie. Reszty nie próbowałem, bo tbh to co najmniej 5 godzin pracy, jeśli wszystko pójdzie gładko. Nawet nagroda w wysokości 500 nie jest tego warta.
Qualverse
1
Oto pełny kod do uzyskania tokena autoryzacji
Qualverse
Wydaje się, że uzyskanie tokena autoryzacji działa dobrze. Ale najtrudniejszą częścią, jak sądzę, jest pobieranie samych aplikacji :(
programista Androida
Tak, to niestety wymaga dużo pracy. Jednak zdekompilowałem kod dla zakupionych aplikacji i tak to się tam robi. Jeśli potrzebujesz pomocy w wykonaniu powyższych czynności, daj mi znać.
kwalifikacja
-2

możesz uzyskać nazwę pakietu wszystkich zainstalowanych aplikacji na urządzeniu, a następnie uzyskać informacje o każdym zainstalowanym pakiecie, który znajdziesz na urządzeniu z Google Play, bez konieczności uzyskiwania dostępu do konta użytkownika. istnieje nieoficjalny interfejs API innej firmy lub nieoficjalny plik API, który pobiera szczegóły aplikacji Google Play jako json, pobierając nazwę pakietu aplikacji. na przykład: https://42matters.com/ następnie użyj otrzymanych informacji dla każdego pakietu, aby znaleźć darmowe.

Bahman
źródło
Nie, pytanie, na które postawiłem nagrodę, dotyczy aplikacji, które użytkownik kiedykolwiek zainstalował, a nie tylko tych, które są zainstalowane teraz. Poza tym, po co używać nieoficjalnego, skoro istnieje oficjalny sposób ...
programista Androida
@androiddeveloper Wydaje mi się, że nie ma oficjalnego interfejsu API, aby uzyskać szczegółowe informacje o aplikacji, pobierając nazwę pakietu w Google Play. czy jest jakiś oficjalny interfejs API?
Bahman
@androiddeveloper czy Google przechowuje nazwy odinstalowanych bezpłatnych aplikacji dla każdego użytkownika?
Bahman
Tak. Jeśli otworzysz aplikację Sklep Play, przejdź do panelu nawigacji, a następnie do „Moje aplikacje i gry”. Zobaczysz tam wszystkie aplikacje, które kiedykolwiek zainstalowałeś, a nie tylko te, które są aktualnie zainstalowane. Według Google dozwolone jest (a przynajmniej tak się wydaje) korzystać z tego interfejsu API: issuetracker.google.com/issues/79195087 . Albo ktokolwiek ze mną rozmawiał, nie wie, co się tam dzieje ...
programista android
-2

Mam do rozważenia dwa źródła, ale po pierwsze, jednym słowem, nie. nie ma interfejsu API od GOOGLE, który pozwoliłby ci robić to, co chcesz, ponieważ te dane nie są przechowywane w telefonie, są na serwerach sklepu Google Play, a Google nie ma OFICJALNEGO interfejsu API dla Sklepu Play. możesz jednak zebrać informacje z tych dwóch witryn:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store wprowadź opis linku tutaj

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

i to wystarczy, aby zobaczyć, jak to osiągnąć.

po pierwsze, lista aplikacji, które zostały pobrane przez konto, jest dostępna tylko dla tego konta. i można to zrobić za pośrednictwem sklepu Play. ponieważ Twoja aplikacja zostanie zainstalowana na telefonie tego użytkownika, to nie ma znaczenia ... jesteś w środku.

po drugie, będziesz potrzebować interfejsu API innej firmy, zbudowanego dla SKLEPU GOOGLE PLAY, jest kilka, sprawdź pierwszy link.

korzystając z wybranego interfejsu API, wyślesz żądanie pobierania do sklepu Play, aw zamian w większości przypadków powinieneś otrzymać obiekt json do deserializacji.

zdeserializuj obiekt, a będziesz mieć swoją listę. lista, którą otrzymasz, będzie zależeć od używanego punktu końcowego, ale powinno to zostać wyjaśnione przez / w samym interfejsie API.

powodzenia!

PrinceOfRavens
źródło
We wszystkich linkach nie widzę takiego, który zawiera listę aplikacji zainstalowanych przez bieżącego użytkownika. Nie mają nawet fazy logowania. Wszystkie zbierają ogólne informacje o aplikacjach, niezależnie od tego, czy użytkownik je zainstalował, czy nie.
programista Androida