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

121

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

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

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

Вход в Google с запросом доступа к androidmarket


РЕДАКТИРОВАТЬ: Я назначаю новую награду за этот вопрос, как это было предложено аналогичным вопросом, который я задавал здесь , и потому что здесь и там я не вижу реального ответа о том, как это сделать, и что можно сделать. с этим.

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

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

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

  3. Есть ли какие-то особые требования для использования этого API?


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

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

abhiank
источник
Попробуйте этот репозиторий github.com/googlesamples/android-play-publisher-api/tree/master/…
Webserveis
Я бы посмотрел на образец запуска приложений. Он знает, какие приложения загружены на телефон.
danny117
Разработчик @android: Анализировал Purchase Appsapk файл методом декомпиляции. Он никогда не использовал API для получения списка купленных приложений. Его подход такой же, как мы знаем, который анализирует html-контент веб-страницы магазина воспроизведения. Вот фрагмент этого кода: hastebin.com/uceyavurij.js
аминография
@aminography Итак, как это получить для пользователя? В конце концов, ему нужно получить данные учетной записи Google пользователя ... Недостаточно просто получить доступ к приложениям Play Store ... Что он делает с предоставленными ему разрешениями?
разработчик Android
@androiddeveloper: вся информация, предоставленная сайтом, Purchased Appsможет быть получена из веб-содержимого игрового магазина. К сожалению, у меня нет возможности купить приложение в Google Play. Если вы поделитесь со мной учетной записью, в которой есть купленное приложение, я могу разработать для вас образец кода.
аминография

Ответы:

51

Вопрос решен. Эксплойт закрыт.

Мы будем закрывать эту ошибку, поскольку вы вошли в предварительную версию Android. Если проблема по-прежнему актуальна и воспроизводима в последней общедоступной версии (Android Q), сделайте отчет об ошибке и зарегистрируйте ошибку на странице https://source.android.com/setup/contribute/report-bugs . Если ответ не будет получен в течение следующих 14 дней, этот вопрос будет закрыт. Спасибо за Ваше понимание.


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

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

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


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

androidmarketАпи, был бы настроен апи написанный разработчиком. Это недоступно для публики.

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

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

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

См. Проверка подлинности Udinic / SyncAdapter .

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

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


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

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

Существует определение области , чтобы определить объем разрешений, предоставляемых приложению.

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

публичный статический окончательный строковый ПРОФИЛЬ

... / Это позволяет вашему веб-приложению получать доступ к установкам приложений 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 и Log User Actions . Можно отслеживать различные действия .

Историю учетной записи пользователя можно найти по адресу https://myactivity.google.com/myactivity .

Полезная ссылка - площадка OAuth 2.0 .


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


Приложение 1

Приложение требует использовать следующие разрешения:

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

Другой

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

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

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


Приложение 2

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

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

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


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


источник
10

В случае одного из этих приложений («Мои платные приложения») после проверки сетевого трафика становится очевидным, что оно действительно использует страницу учетной записи магазина для получения списка платных приложений. Теперь он использует тот же механизм, что и 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можно получить сеанс веб-сайта, используяhttps://accounts.google.com/MergeSession конечной точки API. После этого шага приложение, по сути, может загружать все личные страницы, которые вы можете открывать в браузере при входе в систему; за исключением некоторых специальных страниц, включая настройки платежей.

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

Ниже трафик приложения , как захвачена « Packet Capture » :

Захваченный трафик

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

Боковое примечание :

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

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

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

Использование токенов OAuth2 в Google Chrome

Соруш Фалахати
источник
1
Не могли бы вы показать полный образец, чтобы увидеть, как это работает, и ответить на мои вопросы? Как я уже писал, я хочу получить различную информацию о каждом приложении: цену, время покупки и т.д ... Можно ли также получить список бесплатных приложений?
разработчик Android
3

Если у вас есть 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))
nkalra0123
источник
1

Работа с неофициальными 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 . Главный из них, используемый 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- идентификатор 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 файла jar_extract.py .

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

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

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

qualverse
источник
О AccountManager, вы уверены, что он еще доступен? Я думаю, что в настоящее время Google предоставляет только возможность использования AccountPicker(например, здесь: stackoverflow.com/a/26888259/878126 ). Но как мне выполнить остальное? Вы это проверяли? Это сработало для вас? Поделитесь, пожалуйста, кодом. Вот почему я назначил награду, чтобы увидеть, как это работает ...
разработчик Android
Да, AccountPicker - лучшая идея. И да, я пробовал код для получения токена, и он отлично работает. Остальное я не пробовал, потому что это как минимум 5 часов работы, если все идет гладко. Даже награда в 500 не стоит этого.
qualverse
1
Вот полный код для получения токена аутентификации (он работает так же, как купленные приложения на вашем снимке экрана): github.com/ethanblake4/PlayStoreDemo
qualverse
Получение токена авторизации, похоже, работает хорошо. Но самая сложная часть, я думаю, это загрузка самих приложений :(
разработчик Android
Да, это, к сожалению, очень много работы. Однако я декомпилировал код для приобретенных приложений, и вот как это делается там. Не стесняйтесь сообщить мне, если вам понадобится помощь в вышеуказанных шагах.
qualverse 02
-2

вы можете получить имя пакета всех установленных приложений на устройстве, а затем получить информацию о каждом установленном пакете, который вы найдете на устройстве, из Google Play без необходимости входить в учетную запись пользователя. есть некоторые сторонние или неофициальные API для получения сведений о приложениях Google Play в виде json, получив имя пакета приложения. например: https://42matters.com/, затем используйте полученную информацию для каждого пакета, чтобы найти бесплатные.

Бахман
источник
Нет, вопрос, на который я поставил награду, касается приложений, которые пользователь когда-либо устанавливал, а не только тех, которые установлены сейчас. Кроме того, зачем использовать неофициальные, если есть официальный способ ...
разработчик Android
@androiddeveloper Я думаю, что нет официального API, чтобы получить подробную информацию о приложении, получив имя пакета в Google Play. есть ли официальный api?
Bahman
@androiddeveloper сохраняет ли Google названия удаленных бесплатных приложений для каждого пользователя?
Bahman
Да. Если вы откроете приложение «Play Маркет», перейдите в панель навигации, а затем в «Мои приложения и игры». Вы увидите там все приложения, которые вы когда-либо устанавливали, а не только те, которые установлены в настоящее время. И согласно Google, разрешено (или, по крайней мере, кажется, что они так говорят) использовать этот API: Issueetracker.google.com/issues/79195087 . Или, кто бы ни говорил со мной, не знает, что там происходит ...
разработчик Android
-2

У меня есть два ресурса, на которые вы можете обратить внимание, но сначала, одним словом, нет. API от GOOGLE не позволяет вам делать то, что вы хотите, поскольку эти показатели не хранятся в телефоне, они находятся на серверах магазина 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.

удачи!

PrinceOfRavens
источник
Во всех ссылках я не вижу ни одной, которая получает список приложений, установленных текущим пользователем. У них даже нет фазы входа в систему. Все они собирают общую информацию о приложениях, независимо от того, установил их пользователь или нет.
разработчик Android