Bagaimana cara mendapatkan daftar aplikasi yang diunduh (berbayar / gratis) oleh pengguna dari Google Play?

121

Saya baru-baru ini menemukan aplikasi Pembelian Aplikasi ini , yang entah bagaimana dapat mengambil aplikasi yang telah saya bayar di google play setelah saya masuk menggunakan akun google saya.

Saya mencoba mencari tahu bagaimana hal itu dilakukan karena saya ingin membuat aplikasi serupa, tetapi untuk aplikasi gratis yang telah diunduh.

Namun, saya tidak dapat menemukan Cakupan API OAuth mana yang digunakan untuk mengambil informasi tersebut, bahkan setelah melalui seluruh daftar API .

Masuk dengan Google meminta akses ke androidmarket


EDIT: Saya memberikan hadiah baru pada pertanyaan ini, seperti yang disarankan oleh pertanyaan serupa yang saya tanyakan di sini , dan karena di sana-sini saya tidak melihat jawaban nyata tentang bagaimana melakukannya, dan apa yang bisa dilakukan dengan itu.

Saya ingin mempersempit pertanyaan menjadi beberapa bagian:

  1. Apa API yang dapat digunakan untuk mendapatkan informasi aplikasi yang dibeli? Di mana saya bisa membacanya? Harap tunjukkan contoh lengkap yang berfungsi tentang cara melakukannya.

  2. Bisakah itu berbuat lebih banyak? Mungkin melakukan pencarian? Mungkin menampilkan aplikasi gratis yang diinstal? Mungkin saat mereka dipasang dan dihapus? Dan kategori aplikasi tersebut?

  3. Apakah ada persyaratan khusus untuk menggunakan API ini?


EDIT: Saya memberikan hadiah maksimal untuk ini, karena tidak peduli berapa banyak saya telah membaca dan mencoba, saya masih gagal membuat POC yang dapat meminta aplikasi dari Play Store yang pernah diunduh pengguna (nama, paket nama, tanggal dipasang dan / atau dihapus, URL ikon, harga ...), termasuk aplikasi berbayar dan gratis.

Jika ada yang menemukan sampel yang berfungsi, tunjukkan cara melakukannya, dan juga tunjukkan bagaimana Anda menemukannya (dokumentasi atau apa pun yang mengarahkan Anda ke solusi). Saya tidak dapat menemukannya di mana pun, dan solusi saat ini di sini terlalu samar untuk saya mulai.

abhiank
sumber
Saya akan melihat peluncur aplikasi sampel. Ia tahu aplikasi apa yang diunduh di telepon.
danny117
@ pengembang Android: Saya telah menganalisis Purchase Appsfile apk dengan dekompilasi. Itu tidak pernah menggunakan api apa pun untuk mendapatkan daftar aplikasi yang dibeli. Pendekatannya sama seperti yang kita ketahui yaitu mengurai konten html dari halaman web play store. Berikut adalah bagian dari kode ini: hastebin.com/uceyavurij.js
aminography
@aminography Jadi bagaimana mendapatkannya bagi pengguna? Bagaimanapun, itu perlu mendapatkan data dari akun Google pengguna ... Tidak cukup hanya mengakses aplikasi Play Store ... Apa fungsinya dengan izin yang diberikan padanya?
pengembang android
@androiddeveloper: Semua informasi yang disediakan oleh Purchased Appsdapat diambil dari konten web playstore. Sayangnya saya tidak memiliki akses untuk membeli aplikasi dari google play. Jika Anda membagikan kepada saya akun yang memiliki aplikasi yang dibeli, saya dapat mengembangkan kode sampel untuk Anda.
aminografi

Jawaban:

51

Masalah teratasi. Eksploitasi telah ditutup.

Kami akan menutup bug ini karena masuk dalam versi Pratinjau Android. Jika masalahnya masih relevan dan dapat direkonstruksi dalam rilis publik terbaru (Android Q), catat laporan bug dan catat bug di https://source.android.com/setup/contribute/report-bugs . Jika balasan tidak diterima dalam 14 hari ke depan, masalah ini akan ditutup. Terima kasih atas pengertian Anda.


Pembaruan terkini:

Ini adalah bug dan Google akan mengatasinya di pembaruan berikutnya.

Kami telah menangguhkan masalah ini untuk dipertimbangkan di rilis mendatang. Terima kasih atas waktu Anda untuk menjadikan Android lebih baik


Jawaban ini telah berubah menjadi kumpulan ide dan telah diedit untuk memasukkan informasi dari diskusi di komentar.

The androidmarketapi, akan disesuaikan api yang ditulis oleh pengembang. Ini tidak tersedia untuk umum.

Untuk mengatasi masalah Anda di komentar. Pengembang akan memanfaatkan API saat ini yang tersedia melalui Pengembang Android dan Google untuk membuat proyek yang mengelola semua ini.

Untuk mengakses Full Account Access, saya tidak yakin bagaimana para pengembang ini mencapai ini.

Saya merekomendasikan penggunaan AccountManager , yang merupakan bagian dari android.accounts, memiliki akses ke kredensial dan metode getUserData . Manajer akun memiliki akses ke sandi dan mampu membuat dan menghapus akun. Ini, mungkin digunakan dengan Penyedia Konten

Lihat Udinic / SyncAdapter Authentication .

Untuk membalas komentar Anda:

Blog ini akan membantu Anda untuk memulai. Buat Authenticator Android Anda sendiri .


Bagaimana sebenarnya aplikasi ini bekerja, saya tidak dapat memberi tahu Anda. Mereka mungkin juga memiliki implementasi yang berbeda (kecuali jika mereka merupakan upaya kolaboratif di belakang layar, mereka pasti akan berbeda).

Satu tebakan. Pertama-tama gunakan GoogleSignInAccount dengan com.google.android.gms.auth.api.signin .

Ada definisi untuk ruang lingkup , untuk menentukan sejauh mana izin yang diberikan aplikasi.

Menggunakan requestScopes () , file

PROFIL String publik statis akhir

... / Ini memungkinkan aplikasi web Anda mengakses pemasangan aplikasi Android melalui udara.

Untuk contoh :

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

Jika akses penuh dapat diperoleh, daftar semua aplikasi yang digunakan oleh pemegang akun dapat ditemukan dan dibandingkan dengan apa yang ada di perangkat.

Package Manager akan mengambil daftar semua aplikasi yang saat ini terinstal di perangkat.
PackageInfo memberikan detail tentang aplikasi.
INSTALL_REASON_USER juga akan memfilter aplikasi yang telah aktif dipasang oleh pengguna.

Anda mungkin ingin melihat com.google.firebase.appindexing dan Mencatat Tindakan Pengguna . Tindakan yang berbeda dapat dilacak.

Riwayat akun pengguna ditemukan di https://myactivity.google.com/myactivity .

Tautan yang berguna adalah OAuth 2.0 Playground .


Github repo node-google-play ini , menggunakan node, adalah yang terbaru dan akan memanggil Google Play API. Begitu pula arsip yang digunakan sebagai api "tidak resmi", android-market-api , untuk menanyakan pasar.


Aplikasi 1

The app mengklaim untuk menggunakan hak akses berikut:

Versi 2.1.8 dapat mengakses:
$ Pembelian dalam aplikasi

Lain

  • menerima data dari Internet
  • lihat koneksi jaringan
  • akses jaringan penuh
  • gunakan akun di perangkat
  • cegah perangkat dari tidur
  • baca konfigurasi layanan Google

Patut dicatat, aplikasi tidak mengatur izin apa pun ketika ada dasar, instal. Saya tidak dapat menggunakan fitur apa pun, karena saya tidak memiliki aplikasi berbayar. Jadi untuk pencarian awal - tidak diperlukan izin, yang menunjukkan bahwa aplikasi tidak memiliki akses ke akun saya.

Saya memeriksa izin - tidak ada yang ditetapkan. Jadi satu-satunya hal yang diperlukan adalah menerima pop up, seperti yang ditampilkan dalam pertanyaan Anda.


Aplikasi 2

Aplikasi lain yang Anda rujuk yang melakukan hal yang sama lebih terbuka tentang apa yang sedang diakses.

Aplikasi Berbayar Saya

PEMBERITAHUAN KEAMANAN / PRIVASI
Pertama kali Anda menjalankan aplikasi ini, aplikasi ini akan meminta izin penuh ke akun Google Anda. Sayangnya, ini satu-satunya cara untuk mengakses informasi yang diperlukan. Tidak ada informasi pribadi yang disimpan, tidak ada informasi tentang aplikasi Anda yang dibagikan dengan pengembang aplikasi ini, atau dibagikan dengan pihak ketiga mana pun. Semuanya disimpan di ponsel Anda saja.


Saya telah membahas secara detail aplikasi ini di posting blog ini , yang ditujukan untuk proyek batu penjuru universitas (tidak ada keuntungan moneter). Saya cenderung berpikir ini adalah eksploitasi di API dan bukan status berdasarkan desain oleh Google, karena tidak ada panggilan API untuk mengambil pembelian aplikasi selain aplikasi milik pengembang. Saya berhipotesis bahwa ini adalah eksploitasi zero day, dalam hal ini tidak ada cara yang sah untuk mengakses informasi ini.


sumber
10

Dalam kasus salah satu dari aplikasi ini (Aplikasi Berbayar Saya), setelah memeriksa lalu lintas jaringan, cukup jelas bahwa ia menggunakan halaman Akun Toko untuk mengambil daftar aplikasi berbayar. Sekarang, mekanisme yang digunakan adalah mekanisme yang sama dengan Google Chrome saat ini, dan Pokemon GO konon digunakan pada suatu waktu.

Singkatnya, langkah-langkah untuk melakukannya adalah sebagai berikut:

  1. Login : Apa yang dilakukan program yang disebutkan untuk langkah pertama adalah memasukkan pengguna dan mendapatkan akses ke token akses pengguna. Untuk melakukannya, ia menggunakan android.accounts.AccountManager.getAuthToken()metode. (Lihat lebih lanjut: AccountManager ) Namun, untuk cakupan token, oauth2:https://www.google.com/accounts/OAuthLogindiminta. Perlu diperhatikan bahwa berdasarkan dokumentasi OAth2 dari Google, cakupan ini tidak valid; namun, sepertinya cakupan yang valid untuk Google OAuth v1.

  2. Mengonversi token akses yang baru diambil menjadiubertoken : Sekarang, apa yang ubertokenseharusnya dilakukan, tidak diketahui dan tidak ada dokumentasi resmi tentangnya. Namun, itu terlihat di alam liar untuk digunakan oleh browser chrome untuk login pengguna. Ini dilakukan dengan meminta https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1halaman.

  3. Konversi ubertokenke sesi situs web : Nanti, menggunakan sesi yang baru dibuat ubertokendimungkinkan untuk mendapatkan sesi situs web menggunakan https://accounts.google.com/MergeSessiontitik akhir API. Setelah langkah ini, aplikasi pada dasarnya mampu memuat semua halaman pribadi yang dapat Anda buka menggunakan browser saat masuk; kecuali beberapa halaman khusus termasuk pengaturan Pembayaran.

  4. Mengambil daftar aplikasi berbayar: Meminta dan mengurai https://play.google.com/store/accounthalaman.

Berikut ini adalah lalu lintas aplikasi seperti yang ditangkap oleh ' Packet Capture ' :

Lalu Lintas yang Diambil

Seperti yang terlihat jelas di gambar, hasil akhirnya identik dengan apa yang saya dapatkan ketika saya biasanya membuka halaman akun toko di PC saya dengan Chrome Desktop: Sumber tampilan Chrome

Catatan samping :

Tampaknya tidak satu pun dari titik akhir ini yang didokumentasikan karena sebagian besar digunakan oleh program Google sendiri dan harus dianggap internal. Oleh karena itu saya sangat menyarankan untuk tidak menggunakannya dalam program atau kode apa pun yang Anda harapkan dapat berjalan untuk waktu yang lama atau dalam lingkungan produksi. Selain itu, ada juga kabar buruk di sini untuk Anda, sepertinya halaman akun Google Play hanya mencantumkan aplikasi berbayar atau aplikasi khusus gratis (lebih khusus lagi aplikasi OEM). Saya akan mencoba mencari waktu dan menggali lebih dalam ke aplikasi lain.

Artikel menarik :

Token Pokemon

Memanfaatkan Token OAuth2 Google Chrome

Soroush Falahati
sumber
1
Bisakah Anda menunjukkan contoh lengkap untuk melihat cara kerjanya dan menjawab pertanyaan yang saya ajukan? Seperti yang saya tulis, saya ingin mendapatkan berbagai informasi tentang setiap aplikasi: harga, kapan dibeli, dll. Apakah mungkin juga mendapatkan daftar aplikasi gratis?
Pengembang android
3

Jika Anda memiliki akses root, Anda dapat mengakses /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

Basis data ini memiliki semua informasi, aplikasi mana yang telah Anda unduh, aplikasi mana yang telah Anda beli, dan bahkan aplikasi mana yang telah Anda lakukan IAP.

Periksa tabel kepemilikan, Ini memiliki semua informasi.

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
sumber
1

Berurusan dengan Google API tidak resmi adalah wilayah yang sangat rumit. Ini akan mungkin untuk membuat ini bekerja, tapi hanya itu yang akan saya katakan. Lanjutkan dengan risiko Anda sendiri.

Hal pertama yang perlu Anda lakukan adalah mendapatkan token autentikasi Google Play . Ini dapat dilakukan dengan beberapa cara, tetapi inilah cara mereka melakukannya di Aplikasi yang Dibeli:

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

Beberapa hal yang perlu diperhatikan di sini:

  • Kode di atas harus dijalankan secara asynchronous . Saya merekomendasikan RxJava, tetapi AsyncTask akan berfungsi.
  • Anda harus memberikan email untuk akun yang ingin Anda gunakan. Saya akan menyerahkan detailnya kepada Anda tetapi ini cukup mudah digunakan AccountManager.

Setelah Anda memiliki token autentikasi, Anda sekarang dapat mengakses titik akhir Google Play Store mana pun . Yang utama digunakan oleh Aplikasi yang Dibeli adalah https://android.clients.google.com/fdfe/purchaseHistory. Satu lagi yang mungkin menarik bagi Anda adalah https://android.clients.google.com/fdfe/details?doc=(package name)(dari kode pengambilan APK ). Berikut adalah halaman dengan lebih banyak dan beberapa analisis. Jika Anda membuat permintaan ke API ini, Anda perlu menyediakan beberapa header:

  • 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- ID Kerangka Kerja Layanan Google perangkat Anda, diperoleh dari AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- Kode bahasa perangkat, mis "en".

Sekarang, Anda perlu mengurai responsnya . Di sinilah hal-hal menjadi rumit. API ini mengembalikan pesan yang dikodekan sebagai Protobuf , jadi pada dasarnya ini hanya data biner kecuali Anda memiliki skema (yang tentu saja hanya dimiliki Google). Salah satu cara untuk melakukannya secara teori adalah dengan mendekompilasi aplikasi Google Play Store dan menggunakan kembali model protobuf yang dihasilkan dengan alat seperti JADX .

Sayangnya, saya sudah mencobanya dan tidak berhasil. Kelas model protobuf terlalu kompleks untuk dekompiler standar. Yang dapat Anda gunakan adalah alat yang disebut PBTK . Idealnya Anda ingin menjalankan ini di Google Play Store 6.1.12 APK, karena itu versi terakhir sebelum mereka mulai menggunakan ProGuard. Perhatikan bahwa program ini memiliki dua kesalahan dalam skripnya yang perlu diperbaiki sebelum menjalankannya: mengubah 'extracto'ke 'extractor'dalam gui.py dan menghapus pernyataan pernyataan pada baris 500 dari jar_extract.py .

Sekarang, itu harus menampilkan semua kelas respons sebagai file .proto. Buat folder di bawah src / main yang dipanggil protodan seret seluruh direktori 'com' yang dihasilkan ke sana. Anda dapat menghapus semua yang tidak ada di bawah com/google/android/finsky/protos. Ikuti petunjuk online untuk menyiapkan Gradle dengan plugin Protobuf Lite.

Saat Anda ingin mengurai respons, Anda dapat menggunakan kelas ResponseWrapper, karena semuanya tampak dimuat di bawahnya.

Itu sejauh yang bisa saya lakukan untuk Anda. Ada kemungkinan besar saya mendapat bagian dari kesalahan ini; JADX adalah teman terbaik Anda di sini, karena cara terbaik untuk mengetahui apa yang dilakukan aplikasi adalah dengan melihat kodenya. Semoga ini bisa membantu dan selamat berkembang!

berkualitas
sumber
Tentang AccountManager, apakah Anda yakin itu masih tersedia? Saya pikir saat ini Google hanya memberikan opsi untuk digunakan AccountPicker(seperti di sini: stackoverflow.com/a/26888259/878126 ). Tetapi bagaimana saya melakukan sisanya? Sudahkah Anda mengujinya? Apakah itu berhasil untuk Anda? Silakan bagikan kode untuk itu. Itulah mengapa saya menetapkan hadiah, untuk melihatnya bekerja dalam aksi ...
pengembang android
Yeah AccountPicker sebenarnya adalah ide yang lebih baik. Dan ya, saya memang mencoba kode untuk mendapatkan token dan berhasil dengan baik. Saya belum mencoba sisanya karena tbh itu seperti setidaknya 5 jam kerja jika semuanya berjalan lancar. Bahkan hadiah 500 tidak sebanding dengan itu.
kualifikasi
1
Berikut kode lengkap untuk mendapatkan token autentikasi
kualifikasi
Mendapatkan auth-token tampaknya berfungsi dengan baik. Tetapi bagian tersulit yang menurut saya adalah mengambil aplikasinya sendiri :(
pengembang android
Ya, sayangnya itu adalah bagian yang membutuhkan banyak pekerjaan. Namun, saya mendekompilasi kode untuk Aplikasi yang Dibeli dan begitulah cara melakukannya di sana. Jangan ragu untuk memberi tahu saya jika Anda memerlukan bantuan terkait langkah-langkah di atas.
kualifikasi
-2

Anda bisa mendapatkan nama paket dari semua aplikasi yang diinstal di perangkat dan kemudian mendapatkan informasi dari setiap paket yang diinstal yang Anda temukan di perangkat dari google play tanpa perlu masuk ke akun pengguna. ada beberapa pihak ketiga atau aplikasi tidak resmi untuk mendapatkan detail aplikasi google play sebagai json dengan mendapatkan nama paket aplikasi. misalnya: https://42matters.com/ kemudian gunakan informasi yang diterima untuk setiap paket untuk menemukan yang gratis.

Bahman
sumber
Tidak, pertanyaan yang saya berikan hadiah, adalah tentang aplikasi yang pernah dipasang pengguna, dan bukan hanya yang dipasang sekarang. Juga, mengapa menggunakan tidak resmi, jika ada cara resmi ...
pengembang android
@androiddeveloper Saya kira tidak ada api resmi untuk mendapatkan detail aplikasi dengan mendapatkan nama paket di google play. apakah ada api resmi?
Bahman
@androiddeveloper apakah google menyimpan nama aplikasi gratis yang tidak diinstal untuk setiap pengguna?
Bahman
Iya. Jika Anda membuka aplikasi Play Store, buka nav-drawer, lalu ke "aplikasi & game saya". Anda akan melihat di sana semua aplikasi yang pernah Anda instal dari sana, dan bukan hanya yang sedang diinstal. Dan menurut Google, diperbolehkan (atau setidaknya mereka mengatakannya) untuk menggunakan API ini: Issuetracker.google.com/issues/79195087 . Atau, siapa pun yang berbicara dengan saya tidak mengetahui apa yang terjadi di sana ...
pengembang android
-2

Saya punya dua sumber untuk Anda pertimbangkan, tapi pertama, singkatnya, tidak. tidak ada api dari GOOGLE yang memungkinkan Anda melakukan apa yang Anda inginkan, karena metrik ini tidak disimpan di ponsel, metrik ini ada di server google play store, dan google tidak memiliki api RESMI untuk play store. namun Anda dapat memperoleh beberapa info dari kedua situs ini:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store masukkan deskripsi tautan di sini

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

dan ini cukup untuk melihat bagaimana mencapai ini.

pertama, daftar aplikasi apa yang telah diunduh oleh suatu akun hanya dapat dirujuk oleh akun tersebut. dan ini bisa dilakukan melalui play store. karena aplikasi Anda akan diinstal pada ponsel pengguna itu, dosnt ini penting ... Anda sudah masuk.

kedua, Anda akan membutuhkan API pihak ke-3 yang dibuat untuk GOOGLE PLAY STORE, ada beberapa di luar sana, periksa tautan pertama.

menggunakan api pilihan Anda, Anda akan mengirim permintaan get, ke play store, dan sebagai gantinya Anda akan menerima dalam banyak kasus objek json untuk deserialisasi.

deserialize objek, dan Anda akan memiliki daftar Anda. daftar mana yang Anda dapatkan akan bergantung pada titik akhir yang Anda gunakan, tetapi itu harus dijelaskan oleh / dalam API itu sendiri.

semoga berhasil!

PrinceOfRavens
sumber
Di semua tautan di sana, saya tidak melihat satu pun yang mendapat daftar aplikasi yang dipasang oleh pengguna saat ini. Mereka bahkan tidak memiliki fase login. Semuanya mengumpulkan informasi umum tentang aplikasi, apakah pengguna telah menginstalnya atau tidak.
Pengembang android