it-roy-ru.com

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

Недавно я столкнулся с этим приложением Купить приложения , которое каким-то образом может извлекать приложения, за которые я заплатил, в Google Play после того, как я вошел в систему с помощью своей учетной записи Google.

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

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

Google Sign in asking for access to androidmarket


Правка: я назначаю новую награду за этот вопрос, как это было предложено в аналогичном вопросе, который я задавал о здесь и потому что здесь и там я не вижу реального ответа о том, как это сделать, и что можно с этим сделать.

Я хотел бы уточнить вопросы на несколько частей:

  1. Какой API можно использовать для получения информации о приобретенных приложениях? Где я могу прочитать об этом? Пожалуйста, покажите полный, рабочий пример того, как это сделать.

  2. Это может сделать больше? Может быть, выполнить поиск? Может быть, показать бесплатные приложения, которые были установлены? Может быть, когда они были установлены и удалены? И категории этих приложений?

  3. Существуют ли особые требования для использования этого API?


Правка: я возлагаю на это максимальное вознаграждение, потому что независимо от того, сколько я прочитал и попробовал, мне все равно не удалось создать POC, который может запрашивать приложения из Play Store, которые пользователь когда-либо загружал (имя, пакет имя, дата установки и/или удаления, значок URL, цена ...), включая платные и бесплатные приложения.

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

115
abhiank

Последнее обновление:

Это ошибка, и Google исправит ее в следующем обновлении.

Мы отложили эту проблему для рассмотрения в будущем выпуске. Спасибо за ваше время, чтобы сделать Android лучше


Этот ответ превратился в скопление идей и был отредактирован для включения информации из обсуждения в комментарии.

Api androidmarket будет настроенным api написанным разработчиком. Это не доступно для общественности.

Для решения ваших проблем в комментариях. Разработчик использовал бы текущие API, доступные через Android Developer и Google, чтобы создать проект, который управляет всем этим.

Что касается доступа к Full Account Access, я не уверен, как именно эти разработчики достигли этого.

Я бы порекомендовал использовать AccountManager , который является частью Android.accounts, имеет доступ к учетным данным и метод getUserData . Менеджер аккаунтов имеет доступ к паролям и может создавать и удалять аккаунты. Это, возможно, используется с Content Provider

Смотрите dinic/SyncAdapter Authentication .

Чтобы ответить на ваш комментарий:

Этот блог должен помочь вам начать. Напишите свой собственный Android Аутентификатор .


Как на самом деле работают эти приложения, я не могу вам сказать. Они также могут иметь разные реализации (если они не являются совместными усилиями за кулисами, они наверняка будут другими).

Одно предположение. Сначала используйте GoogleSignInAccount с com.google.Android.gms.auth.api.signin .

Есть определение для scope , чтобы определить степень разрешений, предоставленных приложению.

Используя requestScopes () ,

общедоступная статическая финальная строка 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 Playground .


Это github repo node-google-play , использующее node, является текущим и будет вызывать API Google Play. Как и архив, который использовался в качестве "неофициального" API Android-market-api для запроса рынка.


Приложение 1

заявка приложения для использования следующих разрешений:

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

Другое

  • получать данные из интернета
  • просмотреть сетевые подключения
  • полный доступ к сети
  • использовать учетные записи на устройстве
  • предотвратить устройство от сна
  • читать конфигурацию сервиса Google

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

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


Приложение 2

Другое приложение, к которому вы обращаетесь и которое делает то же самое, более открыто говорит о том, к чему осуществляется доступ.

Мои платные приложения

УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ/КОНФИДЕНЦИАЛЬНОСТИ
При первом запуске этого приложения оно запросит полное разрешение для вашей учетной записи Google. К сожалению, это единственный способ получить доступ к необходимой информации. Личная информация не хранится, информация о ваших приложениях не передается разработчику этого приложения и не передается третьим лицам. Все хранится только на вашем телефоне.


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

43
Yvette Colomb

В случае одного из этих приложений (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, неизвестно, и официальной документации об этом нет. Однако он был замечен в дикой природе для использования браузером chrome для входа в систему пользователей. Это делается путем запроса страницы https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1.

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

  4. Получение списка платных приложений: Запрос и анализ страницы https://play.google.com/store/account.

Ниже приведен трафик приложения, полученный с помощью ' Packet Capture ' :

Captured Traffic

Как ясно видно на картинке, конечный результат идентичен тому, что я получаю, когда я обычно открываю страницу учетной записи магазина на моем компьютере с помощью Chrome Desktop: Chrome view source

Примечание :

Кажется, ни одна из этих конечных точек не задокументирована, поскольку они в основном используются собственными программами Google и должны рассматриваться как внутренние. Поэтому я настоятельно рекомендую не использовать их ни в какой программе или коде, который вы ожидаете запустить в течение длительного времени или в производственной среде. Кроме того, здесь есть и плохие новости для вас, кажется, что на странице аккаунта Google Play перечислены только платные приложения или специальные бесплатные приложения (особенно приложения OEM). Я постараюсь найти время и покопаться глубже в другом приложении.

Интересные статьи :

токены покемонов

Эксплуатация токенов OAuth2 в Google Chrome

10
Soroush Falahati

Если у вас есть root-доступ, вы можете получить доступ к /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))
2
nkalra0123

Работа с неофициальными API Google - невероятно сложная территория. Будет возможно заставить это работать, но это все, что я скажу. Действуйте на свой страх и риск.

Первое, что вам нужно сделать, это получить токен авторизации Google Play . Это можно сделать несколькими способами, но вот как они это делают в купленных приложениях:

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 Store . Основной, используемый Приобретенными Приложениями, является 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 - идентификатор Google Services Framework вашего устройства, полученный из AdvertisingIdClient .
  • X-DFE-Client-Id - "am-Android-google"
  • Accept-Language - код языка устройства, например "en".

Теперь вам нужно проанализировать ответ . Вот где все становится сложнее. Эти API возвращают сообщение, закодированное как Protobuf , так что, по сути, это просто двоичные данные, если у вас нет схемы (что, конечно, есть только у Google). Один из способов сделать это теоретически - декомпилировать приложение Google Play Store и повторно использовать созданные им модели protobuf с помощью такого инструмента, как JADX .

К сожалению, я попробовал это, и это действительно не работает. Классы моделей Protobuf слишком сложны для стандартного декомпилятора. Вы можете использовать инструмент под названием PBTK . В идеале вам захочется запустить его в Google Play Store 6.1.12 APK, поскольку это последняя версия до того, как они начали использовать ProGuard. Обратите внимание, что в программе есть две ошибки в скрипте, которые необходимо исправить перед запуском: изменение 'extracto' на 'extractor' в gui.py и удаление оператора утверждения в строке 500 of jar_extract.py .

Теперь это должно вывести все классы ответов в виде файлов .proto. Создайте папку в src/main с именем proto и перетащите в нее весь созданный каталог 'com'. Вы можете удалить все, что не находится под com/google/Android/finsky/protos. Следуйте онлайн-инструкциям по настройке Gradle с помощью плагина Protobuf Lite.

Если вы хотите проанализировать ответ, вы можете использовать класс ResponseWrapper, так как все они содержатся в нем.

Это примерно так, как я могу взять тебя. Есть хороший шанс, что я получил какую-то часть этого неправильно; JADX - ваш лучший друг здесь, потому что лучший способ выяснить, что делает приложение, это посмотреть на его код. Надеюсь, что это помогает и счастливого развития!

0
qualverse