Google Play에서 사용자가 다운로드 한 앱 (유료 / 무료) 목록을 가져 오는 방법은 무엇입니까?


121

최근에이 앱 구매 앱을 보았습니다.이 앱은 Google 계정을 사용하여 로그인 한 후 Google Play에서 결제 한 앱을 검색 할 수 있습니다.

비슷한 앱을 만들고 싶었지만 다운로드 한 무료 앱에 대해 어떻게되는지 알아 보려고합니다.

그러나 전체 API 목록을 살펴본 후에도 해당 정보를 검색하는 데 사용 된 OAuth API 범위를 찾을 수 없습니다 .

androidmarket에 대한 액세스를 요청하는 Google 로그인


편집 : 나는 여기 에 대해 물어 본 비슷한 질문에서 제안한 것처럼이 질문에 새로운 현상금을 걸고 있으며 여기저기서 그것을 수행하는 방법에 대한 실제 답변을 볼 수 없으며 무엇을 할 수 있는지 그것으로.

질문을 여러 부분으로 구체화하고 싶습니다.

  1. 구매 한 앱 정보를 얻기 위해 사용할 수있는 API는 무엇입니까? 그것에 대해 어디서 읽을 수 있습니까? 이를 수행하는 방법에 대한 전체 작동 예를 보여주십시오.

  2. 더 많은 일을 할 수 있습니까? 검색을 수행 하시겠습니까? 설치된 무료 앱을 표시 하시겠습니까? 아마도 그들이 설치되고 제거되었을 때? 그리고 그 앱의 카테고리?

  3. 이 API를 사용하기위한 특별한 요구 사항이 있습니까?


편집 : 나는 이것에 최대 현상금을 걸고 있습니다. 아무리 많이 읽고 시도해도 사용자가 다운로드 한 앱 (이름, 패키지)을 Play 스토어에서 쿼리 할 수있는 POC를 만들지 못했습니다. 이름, 설치 및 / 또는 제거 된 날짜, 아이콘 URL, 가격 ...) (유료 및 무료 앱 모두 포함).

누군가가 작동하는 샘플을 찾은 경우, 어떻게 수행되었는지 보여주고, 어떻게 찾았는지 보여줍니다 (문서 또는 솔루션으로 이끈 모든 것). 어디에서도 찾을 수 없으며 여기에있는 현재 솔루션은 시작하기에는 너무 모호합니다.



샘플 앱 런처를 살펴 보겠습니다. 전화기에 어떤 앱이 다운로드되었는지 알고 있습니다.
danny117

@android 개발자 : Purchase Apps역 컴파일로 apk 파일을 분석 했습니다. 구매 한 앱 목록을 가져 오는 데 API를 사용하지 않았습니다. 접근 방식은 Play 스토어 웹 페이지의 html 콘텐츠를 구문 분석하는 것과 동일합니다. 다음은이 코드의 일부입니다. hastebin.com/uceyavurij.js
aminography

@aminography 그러면 사용자에게 어떻게 제공됩니까? 결국 사용자의 Google 계정 데이터를 가져와야합니다 ... Play 스토어 앱에 액세스하는 것만으로는 충분하지 않습니다 ... 주어진 권한으로 무엇을합니까?
안드로이드 개발자

@androiddeveloper :에서 제공하는 모든 정보는 Purchased Appsplaystore 웹 콘텐츠에서 검색 할 수 있습니다. 안타깝게도 Google Play에서 앱을 구매할 수 없습니다. 구매 한 앱이있는 계정을 공유하시면 샘플 코드를 개발해 드릴 수 있습니다.
aminography

답변:


51

문제가 해결되었습니다. 익스플로잇이 종료되었습니다.

Android의 미리보기 버전에 로그인되어 있기 때문에이 버그를 닫을 것입니다. 문제가 최신 공개 릴리스 (Android Q)에서 여전히 관련이 있고 재현 가능한 경우 버그 보고서를 캡처하고 https://source.android.com/setup/contribute/report-bugs에 버그를 기록 하세요 . 14 일 이내에 답변을받지 못하면이 문제는 종결됩니다. 이해해 주셔서 감사합니다.


최근 업데이트:

이것은 버그이며 Google 은 다음 업데이트에서 해결합니다.

향후 릴리스에서 고려할 수 있도록이 문제를 연기했습니다. Android를 개선하는 데 시간을 내 주셔서 감사합니다.


이 답변은 아이디어의 집합체로 바뀌었고 의견에 토론 정보를 포함하도록 편집되었습니다.

androidmarketAPI는 사용자 정의 될 API를 개발자에 의해 작성. 일반인은 사용할 수 없습니다.

의견에 대한 우려 사항을 해결하기 위해. 개발자는 Android 개발자와 Google을 통해 제공되는 현재 API를 활용하여이 모든 것을 관리하는 프로젝트를 만들었을 것입니다.

액세스에 관해서는 Full Account Access이 개발자들이 어떻게 이것을 달성했는지 정확히 모르겠습니다.

android.accounts의 일부인 AccountManager를 사용하여 자격 증명과 getUserData 메서드에 액세스하는 것이 좋습니다 . 계정 관리자는 암호에 액세스 할 수 있으며 계정을 만들고 삭제할 수 있습니다. 콘텐츠 제공 업체 와 함께 사용할 수 있습니다.

Udinic / SyncAdapter 인증을 참조하십시오 .

댓글에 답장하려면 :

이 블로그는 시작하는 데 도움이 될 것입니다. 나만의 Android Authenticator를 작성하세요 .


이러한 앱이 실제로 어떻게 작동하는지 말씀 드릴 수 없습니다. 그들은 또한 다른 구현을 가질 수 있습니다 (현장에서 공동 작업하지 않는 한, 분명히 다를 것입니다).

하나의 추측. 먼저 com.google.android.gms.auth.api.signin 과 함께 GoogleSignInAccount를 사용 합니다 .

앱에 부여 된 권한의 범위를 결정하기 위한 scope 정의가 있습니다 .

requestScopes () 사용 하여

공개 정적 최종 문자열 프로필

... / 웹 앱이 OTA (Over-the-Air) 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.appindexingLog User Actions 를 살펴볼 수 있습니다 . 다양한 동작 을 추적 할 수 있습니다.

사용자 계정 기록은 https://myactivity.google.com/myactivity 에서 찾을 수 있습니다 .

유용한 링크는 OAuth 2.0 Playground 입니다.


node를 사용하는 이 github 저장소 node-google-play 는 최신 상태이며 Google Play API를 호출합니다. 마켓 플레이스를 쿼리하기 위해 '비공식'API 인 android-market-api 로 사용 된 아카이브도 마찬가지 입니다.


앱 1

응용 프로그램은 주장 다음과 같은 권한을 사용할 수 :

버전 2.1.8 액세스 가능 :
$ 인앱 구매

다른

  • 인터넷에서 데이터를 받다
  • 네트워크 연결보기
  • 전체 네트워크 액세스
  • 기기에서 계정 사용
  • 잠자기에서 장치 방지
  • Google 서비스 구성 읽기

주목할 점은 앱은 기본 설치가있을 때 권한을 설정하지 않습니다. 유료 앱이 없어서 어떤 기능도 사용할 수 없었습니다. 따라서 초기 검색에는 권한이 필요하지 않았으며 이는 앱이 내 계정에 액세스 할 수 없음을 나타냅니다.

권한을 확인했습니다. 설정된 항목이 없습니다. 따라서 필요한 유일한 것은 귀하의 질문에 표시된 것처럼 팝업을 수락하는 것입니다.


앱 2

동일한 작업을 수행하는 다른 앱은 액세스되는 항목에 대해 더 솔직합니다.

내 유료 앱

보안 / 개인 정보 보호 알림
이 앱을 처음 실행하면 Google 계정에 대한 전체 권한을 요청합니다. 이것은 유감스럽게도 필요한 정보에 액세스하는 유일한 방법입니다. 개인 정보가 저장되지 않으며 앱에 대한 정보가이 앱의 개발자와 공유되거나 제 3 자와 공유되지 않습니다. 모든 것은 휴대 전화에만 보관됩니다.


이 블로그 게시물 에서 이러한 앱에 대해 자세히 설명했습니다. 이 블로그 게시물 은 대학 캡 스톤 프로젝트 (금전적 이득 없음)를위한 것입니다. 개발자 자신의 앱 이외의 앱 구매를 가져 오는 API 호출이 없기 때문에 이것이 Google의 설계 상태가 아니라 API의 악용이라고 생각하는 경향이 있습니다. 나는 그것이 제로 데이 익스플로잇이라고 가정하는데,이 경우이 정보에 접근 할 수있는 합법적 인 방법이 없습니다.


10

이러한 애플리케이션 (내 유료 앱) 중 하나의 경우 네트워크 트래픽을 확인한 후 스토어의 계정 페이지를 사용하여 유료 애플리케이션 목록을 검색하는 것이 매우 분명합니다. 이제 사용하는 메커니즘은 현재 Google Chrome과 동일한 메커니즘이며 Pokemon GO는 사용되는 시점에서 추정됩니다.

간단히 말해서이를 수행하는 단계는 다음과 같습니다.

  1. 로그인 : 언급 된 프로그램이 첫 번째 단계에서 수행하는 작업은 사용자를 로그인하고 사용자의 액세스 토큰에 액세스하는 것입니다. 이를 위해 android.accounts.AccountManager.getAuthToken()방법을 사용합니다 . (더보기 : AccountManager ) 그러나 토큰 범위 oauth2:https://www.google.com/accounts/OAuthLogin는 요청됩니다. Google 의 OAth2 문서에 따르면이 범위는 유효하지 않습니다. 그러나 Google OAuth v1의 유효한 범위 인 것 같습니다.

  2. 새로 검색된 액세스 토큰을 다음으로 변환ubertoken : 이제 실제로 수행 ubertoken해야하는 작업은 알 수 없으며 이에 대한 공식 문서도 없습니다. 그러나 크롬 브라우저에서 사용자 로그인에 사용되는 것으로 나타났습니다. 이것은 https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1페이지 를 요청하여 수행됩니다 .

  3. ubertoken웹 사이트 세션으로 전환 : 나중에 새로 생성 ubertoken된 웹 사이트 세션을 https://accounts.google.com/MergeSessionAPI 엔드 포인트를 이용하여 얻을 수 있습니다. 이 단계 후에 애플리케이션은 로그인 한 상태에서 브라우저를 사용하여 열 수있는 모든 개인 페이지를 기본적으로로드 할 수 있습니다. 지불 설정을 포함한 일부 특별 페이지를 제외하고.

  4. 유료 애플리케이션 목록 가져 오기 :https://play.google.com/store/account 페이지 요청 및 구문 분석 .

다음은 ' 패킷 캡처 '에서 캡처 한 애플리케이션의 트래픽입니다 .

캡처 된 트래픽

사진에서 명확하게 볼 수 있기 때문에 최종 결과는 Chrome 데스크톱을 사용하여 PC에서 상점의 계정 페이지를 정상적으로 열 때 얻는 것과 동일합니다. Chrome보기 소스

참고 :

이러한 엔드 포인트는 주로 Google 자체 프로그램에서 사용되며 내부로 간주되어야하므로 문서화되지 않은 것 같습니다. 따라서 오랫동안 실행할 것으로 예상되는 프로그램이나 코드 나 프로덕션 환경에서는 사용하지 않는 것이 좋습니다. 또한 여기에도 나쁜 소식이 있습니다. Google Play의 계정 페이지에는 유료 애플리케이션 또는 특별 무료 앱 (특히 OEM 앱) 만 나열되어있는 것 같습니다. 나는 시간을 내서 다른 응용 프로그램에 대해 더 깊이 파고 들도록 노력할 것입니다.

흥미로운 기사 :

포켓몬 토큰

Google 크롬의 OAuth2 토큰 악용


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

비공식 Google API를 다루는 것은 엄청나게 복잡한 영역입니다. 이것이 작동하도록 하는 것이 가능할 것입니다. 그러나 그것이 제가 말할 전부입니다. 자신의 책임하에 진행하십시오.

가장 먼저해야 할 일은 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 스토어 엔드 포인트에 액세스 할 수 있습니다 . 구매 한 앱에서 사용하는 기본 앱은 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 서비스 프레임 워크 ID가에서 얻은 AdvertisingIdClient .
  • X-DFE-Client-Id - "am-android-google"
  • Accept-Language -장치의 언어 코드 (예 : "en" .

이제 응답구문 분석 해야합니다 . 여기가 까다로워지는 부분입니다. 이러한 API는 Protobuf 로 인코딩 된 메시지를 반환 하므로 스키마가 없으면 기본적으로 바이너리 데이터 일뿐입니다 (물론 Google에만 있음). 이론적으로이를 해결하는 한 가지 방법은 Google Play 스토어 앱을 디 컴파일하고 생성 된 protobuf 모델을 JADX 와 같은 도구로 재사용하는 것 입니다 .

불행히도 나는 이것을 시도했지만 실제로 작동하지 않습니다. Protobuf 모델 클래스는 표준 디 컴파일러에 비해 너무 복잡합니다. 사용할 수있는 것은 PBTK 라는 도구 입니다. ProGuard 사용을 시작하기 전의 마지막 버전이므로 Google Play Store 6.1.12 APK에서 실행하는 것이 이상적입니다. 이 프로그램에는 실행하기 전에 수정해야하는 스크립트에 두 가지 오류가 있습니다. gui.py 에서 변경 'extracto'하고 jar_extract.py의 500 행에서 assertion 문을 제거하는 입니다.'extractor'

이제 모든 응답 클래스를 .proto 파일로 출력해야합니다. src / main 아래에 폴더를 만듭니다.proto 만들고 생성 된 전체 'com'디렉토리를 여기로 드래그합니다. 아래에 있지 않은 모든 항목을 삭제할 수 있습니다 com/google/android/finsky/protos. 온라인 지침에 따라 Protobuf Lite 플러그인으로 Gradle을 설정하십시오.

응답을 구문 분석하려는 경우 ResponseWrapper 클래스를 사용할 수 있습니다. 모두 그 아래에 포함 된 것처럼 보이기 때문입니다.

내가 당신을 데려 갈 수있는 정도입니다. 이 부분이 잘못되었을 가능성이 높습니다. JADX는 여기에서 가장 친한 친구입니다. 앱이 수행하는 작업을 파악하는 가장 좋은 방법은 코드를 보는 것입니다. 이것이 도움이되고 행복하게 발전하기를 바랍니다!


에 대해 AccountManager, 여전히 사용할 수 있습니까? 요즘에는 Google이 사용 옵션 만 제공한다고 생각합니다 AccountPicker(예 : stackoverflow.com/a/26888259/878126 ). 그러나 나머지는 어떻게 수행합니까? 테스트 했습니까? 당신에게 효과가 있었나요? 코드를 공유해주세요. 그것이 제가 현상금을 설정 한 이유입니다. 실제로 작동하는지보기 위해 ...
android developer

예 AccountPicker는 실제로 더 나은 아이디어입니다. 그리고 예, 토큰을 얻기 위해 코드를 시도했으며 훌륭하게 작동합니다. 나는 모든 것이 순조롭게 진행된다면 적어도 5 시간의 일과 같은 tbh 때문에 나머지를 시도하지 않았다. 500 현상금조차도 그만한 가치가 없습니다.
qualverse dec

1
다음은 인증 토큰을 얻기위한 전체 코드입니다 (스크린 샷에서 구매 한 앱처럼 작동 함) : github.com/ethanblake4/PlayStoreDemo
qualverse

인증 토큰을 얻는 것이 잘 작동하는 것 같습니다. 하지만 내가 생각하기에 어려운 부분은 앱 자체를 가져 오는 것입니다. (
android developer

예, 불행히도 많은 작업이 필요한 부분입니다. 그러나 구매 한 앱에 대한 코드를 디 컴파일했고 이것이 그곳에서 수행되는 방법입니다. 위 단계에서 도움이 필요하면 언제든지 알려주세요.
qualverse

-2

장치에 설치된 모든 앱의 패키지 이름을 얻은 다음 사용자 계정을 가져올 필요없이 Google Play에서 장치에 설치된 모든 패키지의 정보를 얻을 수 있습니다. 앱 패키지 이름을 가져 와서 Google Play 앱 세부 정보를 json으로 가져 오는 타사 또는 비공식 API가 있습니다. 예 : https://42matters.com/ 그런 다음 모든 패키지에 대해 수신 된 정보를 사용하여 무료 패키지를 찾으십시오.


아니요, 제가 바운티를 던지는 질문은 현재 설치된 앱뿐만 아니라 사용자가 지금까지 설치 한 앱에 관한 것입니다. 공식적인 방법 ...이 경우에도, 왜, 비공식 사용
안드로이드 개발자

@androiddeveloper Google Play에서 패키지 이름을 가져 와서 앱 세부 정보를 얻는 공식 API가 없다고 생각합니다. 공식 API가 있습니까?
Bahman

@androiddeveloper Google은 모든 사용자에 대해 제거 된 무료 앱의 이름을 유지합니까?
Bahman

예. Play 스토어 앱을 열면 탐색 창으로 이동 한 다음 '내 앱 및 게임'으로 이동합니다. 현재 설치된 앱뿐만 아니라 여기에서 설치 한 모든 앱이 표시됩니다. 그리고 Google에 따르면이 API를 사용하는 것이 허용됩니다 (또는 적어도 그들이 말하는 것처럼 보임) : issuetracker.google.com/issues/79195087 . 또는 저와 대화 한 사람이 무슨 일이 벌어지고 있는지 잘 알지 못합니다 ...
android developer

-2

고려할 두 가지 리소스가 있지만 먼저 한마디로 아니요. 이러한 측정 항목은 휴대 전화에 저장되지 않고 Google Play 스토어 서보에 있으며 Google에는 Play 스토어에 대한 공식 API가 없기 때문에 원하는 작업을 수행 할 수있는 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

이것을 달성하는 방법을보기에 충분합니다.

첫째, 계정에서 다운로드 한 앱 목록은 계정에서만 참조 할 수 있습니다. 플레이 스토어를 통해 가능합니다. 앱이 해당 사용자의 전화에 설치되기 때문에이 문제는 중요하지 않습니다.

둘째, GOOGLE PLAY STORE 용으로 구축 된 타사 API가 필요합니다. 거기에 일부가 있습니다. 첫 번째 링크를 확인하십시오.

선택한 API를 사용하여 플레이 스토어에 get 요청을 보내고 그 대가로 대부분의 경우 역 직렬화 할 json 객체를 받아야합니다.

개체를 deserialize하면 목록이 생깁니다. 표시되는 목록은 사용하는 엔드 포인트에 따라 다르지만 API 자체에서 설명해야합니다.

행운을 빕니다!


모든 링크에서 현재 사용자가 설치 한 앱 목록을 가져 오는 링크가 표시되지 않습니다. 로그인 단계도 없습니다. 이들 모두는 사용자가 설치했는지 여부에 관계없이 앱에 대한 일반적인 정보를 수집합니다.
안드로이드 개발자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.