Google Play'den bir kullanıcı tarafından indirilen uygulamaların (ücretli / ücretsiz) listesi nasıl alınır?


121

Kısa süre önce , google hesabımı kullanarak oturum açtıktan sonra google play'de ödeme yaptığım uygulamaları bir şekilde alabilen bu Uygulama Satın Alma uygulamasına rastladım .

Benzer bir uygulama oluşturmak istediğim için bunun nasıl yapıldığını bulmaya çalışıyorum, ancak indirilen ücretsiz uygulamalar için.

Ancak, API listesinin tamamını gözden geçirdikten sonra bile, bu bilgileri almak için hangi OAuth API Kapsamının kullanıldığını bulamıyorum .

Androidmarket'e erişim isteyen Google Oturum Açma


DÜZENLEME: Burada sorduğum benzer bir sorunun önerdiği gibi, bu soruya yeni bir ödül koyuyorum ve burada ve orada nasıl yapılacağı ve ne yapılabileceği konusunda gerçek bir cevap göremiyorum Bununla.

Soruları birden çok parçaya ayırmak istiyorum:

  1. Satın alınan uygulamaların bilgilerini almak için kullanılabilecek API nedir? Bunun hakkında nereden okuyabilirim? Lütfen bunun nasıl yapılacağına dair eksiksiz, çalışan bir örnek gösterin.

  2. Daha fazlasını yapabilir mi? Belki arama yaparsınız? Yüklü ücretsiz uygulamaları gösterebilir misiniz? Belki de kuruldukları ve kaldırıldıkları zaman? Ve bu uygulamaların kategorileri?

  3. Bu API'yi kullanmak için herhangi bir özel gereksinim var mı?


DÜZENLEME: Buna maksimum bir ödül koyuyorum, çünkü ne kadar okuyup denediğim önemli değil, Play Store'dan kullanıcının şimdiye kadar indirdiği uygulamaları sorgulayabilecek bir POC (isim, paket ad, yükleme ve / veya kaldırma tarihi, simge URL'si, fiyat ...), hem ücretli hem de ücretsiz uygulamalar dahil.

Biri çalışan bir örnek bulursa, bunun nasıl yapıldığını gösterin ve ayrıca onu nasıl bulduğunuzu gösterin (belgeler veya sizi çözüme götüren herhangi bir şey). Hiçbir yerde bulamıyorum ve buradaki mevcut çözümler benim başlamak için çok belirsiz.



Örnek uygulama başlatıcıya bakardım. Telefona hangi uygulamaların indirildiğini bilir.
danny117

@android geliştirici: APK Purchase Appsdosyasını derleme yoluyla analiz ettim . Satın alınan uygulamaların listesini almak için hiçbir zaman API kullanmadı. Yaklaşımı, hangisinin oyun mağazası web sayfasının html içeriğini ayrıştırdığını bildiğimizle aynıdır. İşte bu kodun bir parçası: hastebin.com/uceyavurij.js
aminography

@aminography Peki kullanıcı için bunu nasıl elde ediyor? Sonuçta, kullanıcının Google hesabının verilerini alması gerekiyor ... Sadece Play Store uygulamalarına erişmek yeterli değil ... Kendisine verilen izinlerle ne yapıyor?
android geliştiricisi

@androiddeveloper: tarafından sağlanan tüm bilgiler Purchased Apps, playstore web içeriğinden alınabilir. Maalesef google play'den bir uygulama satın almaya erişimim yok. Satın alınan bir uygulamaya sahip bir hesabı benimle paylaşırsanız, sizin için örnek bir kod geliştirebilirim.
aminografi

Yanıtlar:


51

Sorun çözüldü. İstismar kapatıldı.

Android'in Önizleme sürümünde oturum açtığımız için bu hatayı kapatacağız. Sorun en son genel sürümde (Android Q) hala alakalı ve tekrarlanabilirse lütfen bir hata raporu yakalayın ve https://source.android.com/setup/contribute/report-bugs adresinde hatayı kaydedin . Önümüzdeki 14 gün içinde yanıt alınmazsa bu konu kapatılacaktır. Anlayışınız için teşekkürler.


Son Güncelleme:

Bu bir hatadır ve Google bunu bir sonraki güncellemede ele alacaktır.

Bu sorunu gelecekteki bir sürümde değerlendirilmek üzere erteledik. Android'i daha iyi hale getirmek için zaman ayırdığınız için teşekkür ederiz


Bu cevap, bir fikir kümesine dönüştü ve yorumlarda tartışmadan elde edilen bilgileri içerecek şekilde düzenlendi.

androidmarketApi, özelleştirilmiş olacağını api geliştirici tarafından yazılan. Halka açık değil.

Endişelerinizi yorumlarda ele almak için. Geliştirici, tüm bunları yöneten bir proje oluşturmak için Android Geliştirici ve Google aracılığıyla sunulan mevcut API'leri kullanırdı.

Erişime gelince Full Account Access, bu geliştiricilerin bunu tam olarak nasıl başardığından emin değilim.

Ben kullanarak tavsiye ediyoruz AccountManager , android.accounts parçasıdır kimlik ve bir yönteme erişebilir, getUserData . Hesap yöneticisinin şifrelere erişimi vardır ve hesap oluşturup silebilir. Bu, muhtemelen İçerik Sağlayıcı ile kullanılır

Bkz. Udinic / SyncAdapter Kimlik Doğrulaması .

Yorumunuzu yanıtlamak için:

Bu blog, başlamanıza yardımcı olacaktır. Kendi Android Authenticator'ınızı yazın .


Bu uygulamaların gerçekte nasıl çalıştığını size söyleyemem. Farklı uygulamalara da sahip olabilirler (perde arkasında işbirliğine dayalı bir çaba olmadıkça, kesinlikle farklı olacaklardır).

Bir tahmin. Öncelikle com.google.android.gms.auth.api.signin ile GoogleSignInAccount kullanın .

Uygulamaya verilen izinlerin kapsamını belirlemek için kapsam tanımı vardır .

RequestScopes () kullanarak ,

public static final String PROFILE

... / Web uygulamanızın kablosuz Android uygulama yüklemelerine erişmesini sağlar.

For Örneğin :

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

Tam erişim sağlanabiliyorsa, hesap sahibi tarafından kullanılan tüm uygulamaların bir listesi bulunabilir ve cihazdakilerle karşılaştırılabilir.

Paket Yöneticisi , cihazda şu anda yüklü olan tüm uygulamaların bir listesini alacaktır.
PackageInfo , uygulama hakkındaki ayrıntıları sağlar.
INSTALL_REASON_USER, kullanıcı tarafından aktif olarak yüklenmiş uygulamaları da filtreleyecektir.

Com.google.firebase.appindexing'e bakmak ve Kullanıcı İşlemlerini Günlüğe Kaydetmek isteyebilirsiniz . Farklı eylemler izlenebilir.

Kullanıcıların hesap geçmişi https://myactivity.google.com/myactivity adresinde bulunur .

Faydalı bir bağlantı OAuth 2.0 Playground'dur .


Düğümü kullanan bu github repo node-google-play günceldir ve Google Play API'lerini çağıracaktır. Pazarı sorgulamak için "resmi olmayan" bir api, android-market-api olarak kullanılan arşiv de yaptı .


Uygulama 1

Uygulamanın iddia aşağıdaki izinleri kullanmak:

Sürüm 2.1.8 kutu erişimi:
$ In-app alımları

Diğer

  • İnternetten veri almak
  • ağ bağlantılarını görüntüle
  • tam ağ erişimi
  • cihazdaki hesapları kullan
  • cihazın uyumasını önle
  • Google hizmet yapılandırmasını oku

Dikkate değer, uygulama temel bir kurulum olduğunda herhangi bir izin ayarlamıyor. Ücretli uygulamam olmadığı için hiçbir özelliği kullanamadım. Yani ilk arama için - gerekli izin yoktu, bu da uygulamanın hesabıma erişemediğini gösteriyordu.

İzinleri kontrol ettim - ayarlanmış hiçbir şey yoktu. Dolayısıyla, yapmanız gereken tek şey sorunuzda gösterildiği gibi açılır pencereyi kabul etmekti.


Uygulama 2

Aynı şeyi yapan diğer uygulama, neye erişildiği konusunda daha nettir.

Ücretli Uygulamalarım

GÜVENLİK / GİZLİLİK BİLDİRİMİ
Bu uygulamayı ilk kez çalıştırdığınızda, Google hesabınız için tam izin isteyecektir. Maalesef gerekli bilgilere ulaşmanın tek yolu bu. Hiçbir kişisel bilgi depolanmaz, uygulamalarınızla ilgili hiçbir bilgi bu uygulamanın geliştiricisiyle veya üçüncü şahıslarla paylaşılmaz. Her şey yalnızca telefonunuzda tutulur.


Bir üniversite kapsamı projesi için olan bu blog yazısında bu uygulamalarla ilgili ayrıntılara girdim (parasal kazanç yok). Geliştiricinin kendi uygulaması dışındaki uygulamaların satın alımlarını getirmeye yönelik API çağrıları olmadığı için, bunun API'de bir istismar olduğunu ve Google'ın tasarım gereği bir durum olmadığını düşünme eğilimindeyim. Bunun sıfır gün istismarı olduğunu varsayıyorum, bu durumda bu bilgiye erişmenin meşru bir yolu yok.


10

Bu uygulamalardan biri (Ücretli Uygulamalarım) durumunda, ağ trafiğini kontrol ettikten sonra ücretli uygulamaların listesini almak için Mağazanın Hesap sayfasını kullandığı oldukça açıktır. Şimdi, kullandığı mekanizma şu anda Google Chrome ve sözde kullanılan bir noktada Pokemon GO ile aynı mekanizma.

Özetle, bunu yapmak için gereken adımlar aşağıdaki gibidir:

  1. Oturum Açma : Bahsedilen programın ilk adım için yaptığı şey, kullanıcının oturum açması ve kullanıcının erişim jetonuna erişim sağlanmasıdır. Bunu yapmak için android.accounts.AccountManager.getAuthToken()yöntemi kullanır . (Daha fazlasını görün: AccountManager ) Bununla birlikte, belirteç kapsamı oauth2:https://www.google.com/accounts/OAuthLoginiçin talep edilir. Google'ın OAth2 belgelerine göre bu kapsamın geçerli olmadığını unutmamak önemli olabilir ; ancak, Google OAuth v1 için geçerli bir kapsam gibi görünüyor.

  2. Yeni alınan erişim belirtecini aubertoken : Şimdi, gerçekte ne ubertokenyapılması gerektiği bilinmiyor ve bununla ilgili resmi bir belge yok. Ancak, kullanıcıların oturum açmak için krom tarayıcısı tarafından kullanılması vahşi olarak görüldü. Bu, https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1sayfayı talep ederek yapılır .

  3. ubertokenWeb sitesi oturumuna dönüştürme : Daha sonra, yeni oluşturulmuş ubertokenolanı kullanarak https://accounts.google.com/MergeSessionAPI uç noktasını kullanarak bir web sitesi oturumu elde etmek mümkündür . Bu adımdan sonra, uygulama, oturumunuz açıkken tarayıcınızı kullanarak açabileceğiniz tüm kişisel sayfaları yükleyebilir; Ödeme ayarları dahil bazı özel sayfalar hariç.

  4. Ücretli uygulamaların listesini alma:https://play.google.com/store/account Sayfayı isteme ve ayrıştırma .

Aşağıda, uygulamanın trafiği ' Paket Yakalama ' tarafından yakalandığı halidir :

Yakalanan Trafik

Resimde açıkça görülebildiği için, sonuç, normalde mağazanın hesap sayfasını PC'mde Chrome Masaüstü ile açtığımda elde ettiğim sonuçla aynı: Chrome görünümü kaynağı

Yan not :

Görünüşe göre bu uç noktalardan hiçbiri, esas olarak Google'ın kendi programları tarafından kullanıldığı ve dahili olarak kabul edilmesi gerektiğinden belgelenmemiş. Bu nedenle, uzun süre çalıştırmayı beklediğiniz herhangi bir program veya kodda veya bir üretim ortamında kullanmamanızı şiddetle tavsiye ederim. Ayrıca, burada sizin için de kötü haberler var, Google Play'in hesap sayfasında yalnızca ücretli uygulamaları veya özel ücretsiz uygulamaları (özellikle OEM uygulamaları) listelediği görülüyor. Biraz zaman bulmaya ve diğer uygulamaya daha derine inmeye çalışacağım.

İlginç makaleler :

Pokemon jetonları

Google Chrome'un OAuth2 Jetonlarını Kullanmak


1
Nasıl çalıştığını görmek ve sorduğum soruları cevaplamak için lütfen tam bir örnek gösterebilir misiniz? Yazdığım gibi, her bir uygulama hakkında çeşitli bilgiler almak istiyorum: fiyat, satın alma zamanı vb. Ücretsiz uygulamaların listesini de almak mümkün mü?
android geliştiricisi

3

Kök erişiminiz varsa, erişebilirsiniz /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

Bu veritabanı, hangi uygulamayı indirdiğiniz, hangi uygulamaları satın aldığınız ve hatta hangi uygulamada yaptığınız tüm bilgileri içerir IAP.

Sahiplik tablosunu kontrol edin, tüm bilgileri içerir.

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

Resmi olmayan Google API'leriyle uğraşmak inanılmaz derecede karmaşık bir konudur. Bunu çalıştırmak mümkün olacak , ama tüm söyleyeceğim bu. Kendi sorumluluğunuzda ilerleyin.

Yapmanız gereken ilk şey bir Google Play kimlik doğrulama jetonu almaktır . Bu birkaç şekilde yapılabilir, ancak Satın Alınan Uygulamalarda bunu şu şekilde yaparlar:

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

Burada dikkat edilmesi gereken birkaç nokta:

  • Yukarıdaki kod eşzamansız olarak çalıştırılmalıdır . RxJava'yı öneririm, ancak bir AsyncTask çalışacaktır.
  • Kullanmak istediğiniz hesap için bir e-posta sağlamalısınız. Ayrıntıları size bırakacağım ama kullanımı oldukça kolay AccountManager.

Bir kimlik doğrulama jetonunuz olduktan sonra, artık herhangi bir Google Play Store uç noktasına erişebilirsiniz . Satın Alınan Uygulamalar tarafından kullanılan ana uygulama https://android.clients.google.com/fdfe/purchaseHistory. İlginizi çekebilecek başka bir şey https://android.clients.google.com/fdfe/details?doc=(package name)( APKfetch kodundan ). İşte biraz daha ve biraz analiz içeren bir sayfa. Bu API'lere bir istekte bulunursanız, birkaç başlık sağlamanız gerekir:

  • 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- cihazınızın AdvertisingIdClient'ten alınan Google Hizmetleri Çerçeve Kimliği .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- Cihazın dil kodu, örn "en".

Şimdi, yanıtı çözümlemeniz gerekiyor . İşte burada işler karmaşıklaşıyor. Bu API'ler , Protobuf olarak kodlanmış bir mesaj döndürür , bu nedenle, bir şemanız yoksa (elbette yalnızca Google'da bulunan) sadece ikili verilerdir. Teoride bunu yapmanın bir yolu, Google Play Store uygulamasını derlemek ve ürettikleri protobuf modellerini JADX gibi bir araçla yeniden kullanmaktır .

Maalesef bunu denedim ve gerçekten işe yaramıyor. Protobuf model sınıfları, standart bir derleyici için çok karmaşıktır. Kullanabileceğiniz şey PBTK adlı bir araçtır . Bunu ideal olarak Google Play Store 6.1.12 APK'da çalıştırmak isteyeceksiniz, çünkü bu, ProGuard'ı kullanmaya başlamadan önceki son sürümdür. Değişen: bu program ihtiyacı çalıştırmadan önce düzeltilmesi yönündeki komut iki hatalar var o notu musunuz 'extracto'için 'extractor'de gui.py ve hattı 500 üzerinde onaylama işlemi deyimi çıkarmadan jar_extract.py .

Şimdi, bu tüm yanıt sınıflarını .proto dosyaları olarak vermelidir. Src / main adlı bir klasör oluşturun protove oluşturulan 'com' dizininin tamamını bu klasöre sürükleyin. Altında olmayan her şeyi silebilirsiniz com/google/android/finsky/protos. Gradle'ı Protobuf Lite eklentisiyle kurmak için çevrimiçi talimatları izleyin.

Bir yanıtı ayrıştırmak istediğinizde, hepsi bunun altında yer aldığı için ResponseWrapper sınıfını kullanabilirsiniz.

Seni götürebileceğim kadarıyla bu kadar. Bunun bir kısmını yanlış anlama ihtimalim çok yüksek; JADX buradaki en iyi arkadaşınız, çünkü bir uygulamanın ne yaptığını anlamanın en iyi yolu koduna bakmaktır. Umarım bu yardımcı olur ve mutlu gelişir!


Hakkında AccountManager, hala mevcut olduğundan emin misin? Sanırım bugünlerde Google yalnızca kullanma seçeneği sunuyor AccountPicker(burada olduğu gibi: stackoverflow.com/a/26888259/878126 ). Ama gerisini nasıl yapacağım? Test ettin mi? Senin için çalıştı mı? Lütfen bunun kodunu paylaşın. İşte bu yüzden iş başında çalışmasını görmek için bir ödül belirledim ...
android geliştiricisi

Evet, AccountPicker aslında daha iyi bir fikir. Ve evet, bir jeton almak için kodu denedim ve harika çalışıyor. Gerisini denemedim çünkü tbh her şey yolunda giderse en az 5 saatlik çalışma gibi. 500 lük bir ödül bile buna değmez.
2018, 00:22

1
Yine de bir kimlik doğrulama belirteci almak için tam kod (ekran görüntünüzdeki satın alınmış
qualverse

Auth-token'ı almak iyi çalışıyor gibi görünüyor. Ancak bence zor olan, uygulamaların kendilerinin getirilmesi :(
android geliştiricisi

Evet, maalesef çok çalışma gerektiren kısım bu. Ancak, Satın Alınan Uygulamaların kodunu derledim ve orada böyle yapılıyor. Yukarıdaki adımlarda yardıma ihtiyacınız olursa bana bildirmekten çekinmeyin.
2019

-2

Cihazda yüklü tüm uygulamaların paket adını alabilir ve ardından kullanıcı hesabına ulaşmanıza gerek kalmadan, cihazda bulduğunuz yüklü her paketin bilgilerini google play'den alabilirsiniz. Uygulama paketi adını alarak google play uygulamaları ayrıntılarını json olarak almak için bazı üçüncü taraf veya resmi olmayan apiler var. örneğin: https://42matters.com/ daha sonra ücretsiz olanları bulmak için her paket için alınan bilgileri kullanın.


Hayır, ödül koyduğum soru, yalnızca şu anda yüklü olanlar değil, kullanıcının şimdiye kadar yüklediği uygulamalarla ilgili. Ayrıca, resmi bir yolu varsa neden resmi olmayan kullanıyorsunuz ...
android geliştiricisi

@androiddeveloper Sanırım google play'de paket adını alarak uygulama detayını almak için resmi bir api yok. herhangi bir resmi api var mı?
Bahman

@androiddeveloper, google her kullanıcı için Kaldırılan ücretsiz uygulamaların adını saklar mı?
Bahman

Evet. Play Store uygulamasını açarsanız, gezinme çekmecesine ve ardından "uygulamalarım ve oyunlarım" a gidin. Orada şimdiye kadar yüklediğiniz tüm uygulamaları göreceksiniz, yalnızca şu anda yüklü olanları değil. Ve Google'a göre, bu API'yi kullanma izni var (veya en azından öyle diyorlar): issuetracker.google.com/issues/79195087 . Ya da benimle kim konuşursa orada neler olup bittiğine aşina değil ...
android geliştiricisi

-2

Düşünmeniz gereken iki kaynağım var, ama önce tek kelimeyle hayır. GOOGLE'da istediğinizi yapmanıza izin verecek bir api yoktur, çünkü bu ölçümler telefonda depolanmaz, google play store sunucularında bulunur ve google play store için RESMİ api'ye sahip değildir. ancak bu iki siteden bazı bilgiler edinebilirsiniz:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store bağlantı açıklamasını buraya girin

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

ve bunu nasıl başaracağımızı görmek için bu yeterli.

ilk olarak, bir hesap tarafından hangi uygulamaların indirildiğinin bir listesine yalnızca hesap tarafından başvurulabilir. ve bu oyun mağazası aracılığıyla yapılabilir. Uygulamanız o kullanıcının telefonuna yükleneceğinden, bu önemli değil ... varsınız.

ikincisi, GOOGLE PLAY STORE için oluşturulmuş bir 3. taraf API'ye ihtiyacınız olacak, orada bazıları var, ilk bağlantıyı kontrol edin.

seçtiğiniz api'yi kullanarak, oyun mağazasına bir alma isteği göndereceksiniz ve karşılığında çoğu durumda seriyi kaldırmak için bir json nesnesi almalısınız.

nesnenin serisini kaldırırsanız listeniz olur. Hangi listeyi alacağınız, kullandığınız uç noktaya bağlı olacaktır, ancak bu, API'nin kendisinde / tarafından açıklanmalıdır.

iyi şanslar!


Oradaki tüm bağlantılarda, mevcut kullanıcı tarafından yüklenen uygulamaların listesini alan birini görmüyorum. Bir giriş aşamaları bile yok. Hepsi, kullanıcı yüklemiş olsun ya da olmasın uygulamalar hakkında genel bilgiler toplar.
android geliştiricisi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.