Як отримати список завантажених програм (платних / безкоштовних) користувачем з Google Play?


121

Нещодавно я натрапив на це додаток Purchase Apps , яке якимось чином дозволяє отримати додатки, за які я заплатив у програванні google, після того як я ввійшов у свій обліковий запис google.

Я намагаюся дізнатися, як це робиться, як я хочу створити подібний додаток, але для безкоштовних програм, які завантажували.

Однак я не можу знайти, який обсяг API OAuth використовувався для отримання цієї інформації, навіть після проходження всього списку API .

Google Увійти з проханням отримати доступ до androidmarket


EDIT: Я ставлю нове щедро на це питання, як це запропоновано аналогічним запитанням, про яке я тут задавав , і тому що тут і там я не бачу реальної відповіді про те, як це зробити, і що можна зробити з цим.

Я б хотів уточнити запитання на кілька фрагментів:

  1. Що таке API, за допомогою якого можна отримати інформацію про придбані додатки? Де я можу прочитати про це? Покажіть, будь ласка, повний робочий приклад того, як це зробити.

  2. Чи може це зробити більше? Можливо, здійснити пошук? Можливо, показати безкоштовні програми, які були встановлені? Може бути час їх встановлення та видалення? А категорії цих додатків?

  3. Чи існують якісь особливі вимоги щодо використання цього API?


РЕДАКТУВАТИ: Я додаю до цього максимум грошей, тому що скільки б я не читав і не намагався, я все-таки не зміг створити POC, який може запитувати програми з Play Store, які користувач коли-небудь завантажував (ім'я, пакет назва, дата встановлення та / або видалення, URL-адреса значка, ціна ...), включаючи як оплачені, так і безкоштовні програми.

Якщо хтось знайде робочий зразок, покажіть, як це робиться, а також покажіть, як ви знайшли про нього (документацію або все, що призвело до рішення). Я не можу його знайти ніде, і сучасні рішення тут занадто розпливчасті для мене, щоб почати з цього.



Я б подивився на зразок запуску програм. Він знає, які програми завантажуються на телефон.
danny117

@android developer: Я аналізував Purchase Appsфайл apk шляхом декомпіляції. Він ніколи не використовував жодної api для отримання списку придбаних програм. Його підхід такий самий, як ми знаємо, який аналізує вміст html веб-сторінки магазину ігрових магазинів. Ось фрагмент цього коду: hastebin.com/uceyavurij.js
амінографія

@aminography Отже, як це отримати користувачеві? Зрештою, йому потрібно отримати дані облікового запису Google користувача ... Недостатньо просто отримати доступ до додатків Play Store ... Що це стосується наданих йому дозволів?
андроїд розробник

@androiddeveloper: Вся інформація, яку надає, Purchased Appsможе бути отримана з веб-вмісту Playstore. На жаль, я не маю доступу придбати додаток у google play. Якщо ви поділитесь мені з обліковим записом, у якому є придбаний додаток, я можу розробити зразок коду для вас.
амінографія

Відповіді:


51

Питання вирішено. Експлоатація була закрита.

Ми будемо закривати цю помилку через вхід у попередню версію Android. Якщо проблема все-таки є актуальною та відтворюваною в останній публічній версії (Android Q), будь ласка, зафіксуйте помилку помилок та введіть помилку в https://source.android.com/setup/contribute/report-bugs . Якщо відповідь не буде отримана протягом наступних 14 днів, це питання буде закрито. Дякую за розуміння.


Останнє оновлення:

Це помилка, і Google вирішить її у наступному оновлення.

Ми відклали цю проблему для розгляду в майбутньому випуску. Дякуємо за ваш час, щоб покращити Android


Ця відповідь перетворилася на конгломерацію ідей та була відредагована таким чином, щоб включити до коментарів інформацію з обговорення.

androidmarketАпі, буде налаштований апі написаний розробником. Це не доступне для публіки.

Щоб вирішити свої проблеми в коментарях. Розробник використав би поточний apis, доступний через Android Developer та Google, щоб створити проект, який керує всіма ними.

Щодо доступу Full Account Access , я не впевнений, як саме ці розробники досягли цього.

Я рекомендую використовувати AccountManager , який є частиною android.accounts, має доступ до облікових даних та методу getUserData . Менеджер облікових записів має доступ до паролів і здатний створювати та видаляти облікові записи. Це, можливо, використовується у постачальника вмісту

Див. Ідентифікацію Udinic / SyncAdapter .

Щоб відповісти на ваш коментар:

Цей блог повинен допомогти вам розпочати роботу. Напишіть власний аутентифікатор Android .


Як справді працюють ці додатки, я не можу вам сказати. Вони також можуть мати різну реалізацію (якщо вони не будуть спільними зусиллями за кадром, вони, звичайно, будуть іншими).

Одна здогадка. По-перше, використовуйте GoogleSignInAccount з com.google.android.gms.auth.api.signin .

Існує визначення обсягу , щоб визначити ступінь дозволів, яким надається програма.

Використовуючи requestScopes () ,

загальнодоступний статичний фінал String PROFILE

... / Це дозволяє вашому веб-додатку отримувати доступ до встановлених програм Android.

Для прикладу :

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

Якщо можна отримати повний доступ, можна знайти список усіх додатків, які використовує власник облікового запису, і порівняти їх з пристроєм.

Менеджер пакунків отримає список усіх програм, які зараз встановлені на пристрої.
PackageInfo надає детальну інформацію про додаток.
INSTALL_REASON_USER також відфільтрує додатки, які активно встановлюється користувачем.

Ви можете переглянути com.google.firebase.appindexing та " Журнал дій користувача" . Можна відслідковувати різні дії .

Історію облікових записів користувачів можна знайти на веб-сторінці https://myactivity.google.com/myactivity .

Корисна посилання - майданчик OAuth 2.0 .


Цей github repo node-google-play , використовуючи вузол, є поточним і викликає API Google Play. Як і архів, який використовувався як "неофіційна" api, android-market-api , для запиту на ринку.


Додаток 1

Додаток вимагає використовувати наступні дозволи:

Версія 2.1.8 може отримати доступ:
$ Покупки через додаток

Інший

  • отримувати дані з Інтернету
  • переглянути мережеві з'єднання
  • повний доступ до мережі
  • використовувати облікові записи на пристрої
  • запобігання сну пристрою
  • читати конфігурацію служби Google

Зазначимо, що додаток не встановлює жодних дозволів, коли була основна установка. Мені не вдалося скористатися жодною з функцій, оскільки у мене немає платних додатків. Отже, для початкового пошуку - не було потрібних дозволів, що вказувало б, що програма не має доступу до мого облікового запису.

Я перевірив дозволи - не було жодного набору. Тож єдине, що потрібно було - прийняти спливаюче вікно, як це відображено у вашому запитанні.


Додаток 2

Інше додаток, про яке ви посилаєтесь, робить те саме, є більш наперед щодо того, до чого звертаються.

Мої платні програми

ПОВІДОМЛЕННЯ ПРО БЕЗПЕКА / ПРИВАТНІСТЬ
Перший раз, коли ви запустите цю програму, вона запитає повний дозвіл на ваш обліковий запис Google. На жаль, це єдиний спосіб отримати необхідну інформацію. Жодна особиста інформація не зберігається, жодна інформація про ваші програми не надається розробнику цього додатка, не надається будь-яким третім сторонам. Все зберігається лише на вашому телефоні.


Я детально розглядав ці додатки в цій публікації в блозі , яка була присвячена проекту університетського капіталу (без грошових вигод). Я схильний вважати, що це експлуатування в API, а не статус за дизайном від Google, оскільки немає жодних дзвінків API для отримання покупок додатків, окрім власної програми розробника. Я гіпотезую, що це експлуатування нульового дня, і в цьому випадку немає законного способу отримати доступ до цієї інформації.


10

У випадку з одним із цих додатків (My Paid Apps) після перевірки мережевого трафіку очевидно, що він використовує сторінку облікового запису магазину для отримання списку платних програм. Тепер механізм, який він використовує, це той самий механізм, який зараз працює Google Chrome, а Pokemon GO нібито в певний момент часу, що використовується.

Коротше кажучи, наступні кроки:

  1. Вхід : Те, що згадана програма робить для першого кроку, - це увійти до користувача та отримати доступ до маркера доступу користувача. Для цього використовується android.accounts.AccountManager.getAuthToken()метод. (Див. Більше: AccountManager ) Однак, що стосується області токена, oauth2:https://www.google.com/accounts/OAuthLoginзапитується. Можливо, важливо зазначити, що на основі документації OAth2 від Google цей обсяг не є дійсним; однак, здається, це дійсна область застосування для Google OAuth v1.

  2. Перетворення щойно отриманого маркера доступу доubertoken : Тепер, що насправді ubertokenмає робити, невідомо, і офіційної документації про це немає. Однак це було помічено, що його використовували хромовий браузер для входу в систему користувачів. Це робиться шляхом запиту на https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1сторінку.

  3. Перехід ubertokenна сеанс веб-сайту : пізніше за допомогою новоствореного ubertokenможна отримати сеанс веб-сайту за допомогою https://accounts.google.com/MergeSessionкінцевої точки API. Після цього кроку програма по суті здатна завантажувати всі особисті сторінки, які ви можете відкрити за допомогою свого браузера під час входу; крім деяких спеціальних сторінок, включаючи налаштування оплати.

  4. Отримання списку платних додатків: Запит та аналіз https://play.google.com/store/accountсторінки.

Далі йде трафік програми, захоплений " Захоплення пакетів " :

Захоплений трафік

Як добре видно на малюнку, кінцевий результат ідентичний тому, що я отримую, коли зазвичай відкриваю сторінку облікового запису магазину на своєму ПК із Chrome Desktop: Джерело перегляду Chrome

Бічна примітка :

Здається, жодна з цих кінцевих точок не задокументована, оскільки вони в основному використовуються власними програмами Google і повинні вважатися внутрішніми. Тому я настійно рекомендую не використовувати їх у будь-якій програмі чи коді, які ви очікуєте тривалий час працювати або у виробничих умовах. Крім того, тут є і погані новини для вас, схоже, що на сторінці облікового запису Google Play відображаються лише платні програми або спеціальні безкоштовні додатки (точніше програми OEM). Я спробую знайти деякий час і заглибитися в інший додаток.

Цікаві статті :

Покемонні жетони

Використання маркерів OAuth2 Google Chrome


1
Чи можете ви, будь ласка, показати повний зразок, щоб побачити, як це працює, і відповісти на запитання, які я задав? Як я вже писав, я хочу отримати різну інформацію про кожен додаток: ціну, коли придбано тощо ... Чи можливо також отримати список безкоштовних додатків?
андроїд розробник

3

Якщо у вас є кореневий доступ, Ви можете отримати доступ /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

У цій базі даних є вся інформація, який додаток ви завантажили, які додатки ви придбали і навіть у якому додатку ви це зробили IAP.

Перевірте таблицю власності, у ній є вся інформація.

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

Справа з неофіційними API Google - це надзвичайно складна територія. Це стане можливим , але це все, що я скажу. Продовжуйте на власний ризик.

Перше, що вам потрібно буде зробити, це отримати авторський маркер Google Play . Це можна зробити декількома способами, але ось, як це зробити в Purchased Apps:

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

Тут слід зазначити кілька речей:

  • Вищевказаний код повинен запускатися асинхронно . Я рекомендую RxJava, але AsyncTask спрацює.
  • Ви повинні надіслати електронний лист для облікового запису, який ви хочете використовувати. Деталі я залишу вам, але це досить просто AccountManager.

Отримавши маркер авторизації, тепер ви можете отримати доступ до будь-якої кінцевої точки магазину Google Play . Основна з них, що використовується Purchased Apps, - це https://android.clients.google.com/fdfe/purchaseHistory. Ще один, який може вас зацікавити, - це https://android.clients.google.com/fdfe/details?doc=(package name)коду APKfetch ). Ось сторінка з ще деяким та деяким аналізом. Якщо ви подаєте запит на ці API, вам потрібно надати кілька заголовків:

  • 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- ідентифікатор Framework Services Google на вашому пристрої, отриманий від AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language- код мови пристрою, наприклад "en".

Тепер вам потрібно проаналізувати відповідь . Ось де все складно. Ці API повертають повідомлення, закодоване як Protobuf , тому це по суті лише двійкові дані, якщо у вас немає схеми (що, звичайно, має лише Google). Один із способів зробити це теоретично - це декомпілювати додаток Google Play Store та повторно використовувати їх створені протобуфні моделі за допомогою інструменту типу JADX .

На жаль, я спробував це, і це насправді не працює. Класи моделей Protobuf просто занадто складні для стандартного декомпілятора. Можна використовувати інструмент під назвою PBTK . Ідеально вам захочеться запустити це в Google Play Store 6.1.12 APK, оскільки це остання версія, перш ніж вони почали використовувати ProGuard. Зверніть увагу , що ця програма має дві помилки в своєму сценарії , які повинні бути виправлена перед запуском: зміни 'extracto'до 'extractor'в gui.py і видалення оператора затвердження на лінії 500 jar_extract.py .

Тепер це повинно виводити всі класи відповідей як .proto файли. Створіть папку під src / main call protoі перетягніть до неї весь створений каталог 'com'. Ви можете видалити все, що не міститься com/google/android/finsky/protos. Дотримуйтесь інструкцій в Інтернеті, щоб налаштувати Gradle за допомогою плагіна Protobuf Lite.

Коли ви хочете проаналізувати відповідь, ви можете використовувати клас ResponseWrapper, оскільки вони, як видається, містяться під цим.

Це приблизно наскільки я можу вас взяти. Є хороший шанс, що я зрозумів якусь частину цього неправильного; JADX - ваш найкращий друг тут, тому що найкращий спосіб з’ясувати, що робить додаток, - перегляньте його код. Сподіваюсь, це допомагає та щасливо розвивається!


О AccountManager, ти впевнений, що він ще доступний? Я думаю, що в даний час Google надає лише можливість використання AccountPicker(наприклад, тут: stackoverflow.com/a/26888259/878126 ). Але як я виконую решту? Ви перевірили? Це працювало для вас? Будь ласка, поділіться кодом для цього. Ось чому я встановив щедрості, щоб побачити, як це працює в дії ...
андроїд розробник

Так, AccountPicker - це найкраща ідея. І так, я спробував код для отримання маркера, і він чудово працює. Я не пробував решти, тому що це як мінімум 5 годин роботи, якщо все йде нормально. Навіть 500 бонусів не варті цього.
kvalverse

1
Ось повний код для отримання автентичного маркера (він працює так само, як придбані програми на екрані екрана): github.com/ethanblake4/PlayStoreDemo
qualverse

Як видається, автор-маркер працює добре. Але найважчою частиною, на мою думку, є отримання самих додатків :(
андроїд розробник

Так, саме ця частина, на жаль, займає багато роботи. Однак я декомпілював код для Purchased Apps і саме так це робиться там. Не соромтеся повідомити мені, чи потрібна вам допомога у вищезазначених кроках.
kvalverse

-2

ви можете отримати назву пакета всіх встановлених програм на пристрої, а потім отримати інформацію про кожен встановлений пакет, який ви знайдете на пристрої, з google play, не потребуючи доступу до облікового запису користувача. є якась третя сторона або неофіційна apis, щоб отримати деталі додатків google play як json, отримавши назву пакета програми. наприклад: https://42matters.com/ потім використовуйте отриману інформацію для кожного пакету, щоб знайти безкоштовні.


Ні, питання, на яке я ставив щедрості, - це програми, які користувач коли-небудь встановлював, а не лише ті, які зараз встановлені. Крім того, навіщо використовувати неофіційне, якщо є офіційний спосіб ...
андроїд розробник

@androiddeveloper Я думаю, немає офіційного api, щоб отримати детальну інформацію про додаток, отримавши назву пакета в Google play. чи є офіційні api?
Бахман

@androiddeveloper чи Google зберігає назву видалених безкоштовних програм для кожного користувача?
Бахман

Так. Якщо ви відкриєте додаток Play Store, перейдіть до навігаційного ящика, а потім - "мої програми та ігри". Ви побачите там усі додатки, які ви коли-небудь інсталювали, а не лише ті, що зараз встановлені. За даними Google, використовувати цей API можна (або, принаймні, схоже, що вони говорять): issueetracker.google.com/isissue/79195087 . Або той, хто спілкувався зі мною, не знайомий з тим, що там відбувається ...
розробник андроїдів

-2

У мене є два ресурси, які ви повинні розглянути, але спочатку, одним словом, ні. від GOOGLE немає api, який би дозволяв вам робити те, що ви хочете, оскільки ці показники не зберігаються в телефоні, вони знаходяться в сервісах магазину google play, а в Google немає офіційних api для магазину ігор. однак ви можете отримати інформацію з цих двох сайтів:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store введіть опис посилання тут

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

і цього достатньо, щоб побачити, як це досягти.

по-перше, список тих програм, які були завантажені обліковим записом, посилається лише на обліковий запис. і це можна зробити через магазин ігор. оскільки ваш додаток буде встановлено на телефоні цього користувача, це не важливо ... ви знаходитесь.

по-друге, вам знадобиться сторонній API, побудований для GOOGLE PLAY STORE, є деякі там, перевірте перше посилання.

скориставшись обраним вами api, ви надішлете запит на отримання в магазин ігор, а взамін ви отримаєте в більшості випадків об’єкт json для деріаріалізації.

десеріалізуйте об’єкт, і ви отримаєте свій список. список, який ви отримаєте, залежатиме від кінцевої точки, яку ви використовуєте, але це слід пояснити через / у самому API.

Щасти!


У всіх посиланнях там я не бачу списку програм, які були встановлені поточним користувачем. Вони навіть не мають фази входу. Усі вони збирають загальну інформацію про програми, встановив їх користувач чи ні.
андроїд розробник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.