[Google Play][HowTo] 檢查 Android App 在各國市集架上的狀態

App 無預警遭到下架的狀況時有所聞,原因可能是政策變更,也可能是官方內部作業的疏失。不論原因如何,為了能在第一時間發現 app 搜尋不到或不在架上的問題,好跟官方聯繫取得協助,有必要將自動監測 app 在各國市集架上狀況的機制建立起來。

不過 Google Play Store 並未提供像 Apple Search API 之類的工具,若要透過程式查詢 app 在架上的狀態,做法會跟檢查 Windows Phone Store App 在各國市集架上的狀態很類似 - 模擬手機上 Play Store 向 Google Play 發出請求的動作,架構上會像是:

howto-check-app-availability/arch.png

如上圖所示,Unofficial APIGoogle Play 之間是走 Protocol Buffers。但為什麼中間要安插一層 proxy 呢?那是因為 Google Play 也會根據手機地理位置所在的國家過濾查詢結果,得要透過位處於不同國家的 proxy servers,才能模擬當地使用者查詢 Google Play 的狀況。尤其是 app 只上架到特定市集時 (Country Targeting),這一層 proxy 就免除不了。

When determining whether to display your app, Google Play checks the device’s hardware and software requirement, as well as it’s carrier, location, and other characteristics. It then compares those against the restrictions and dependencies expressed by the application’s manifest file and publishing details.

這裡採用的 Unofficial API 實作是 egirault/googleplay-api (Python),直接用檢查 apps 是否在架上的例子做說明:

Tip 作者對 Play Store 這個 app (com.android.vending-1.apk) 進行逆向工程 (reverse engineering) 再搭配 proxy 側錄往 Google Play 的 traffic,進而將 googleplay.proto 重建起來。
import unittest2 as unittest
import os
from googleplay import GooglePlayAPI # 1

ANDROID_ID = 'a1b2c3d4e5f6g7h8' # actually, the Google Service Framework (GSF) ID KEY 3
GOOGLE_LOGIN = 'yourname@gmail.com'
GOOGLE_PASSWORD = 'secret'

HTTPS_PROXY_MAP = { # https, long-lived, reliable, fast 3
    'TW': None,
    'HK': '58.96.169.231:3128',
}

class GooglePlayTest(unittest.TestCase):

    def _test_country_lang(self, country, lang):
        self._setup_https_proxy(country)          # 3
        api = GooglePlayAPI(ANDROID_ID, lang)     # 2
        api.login(GOOGLE_LOGIN, GOOGLE_PASSWORD)

        resp = api.search(self._search, 50) # keyword, page size, offset 4
        apps = [(item.docid, item.title) for item in resp.doc[0].child]
        self.assertIn(self._package_name, dict(apps))

    def _setup_https_proxy(self, country):        # 3
        proxy = HTTPS_PROXY_MAP[country]
        if proxy:
            os.environ['HTTPS_PROXY'] = proxy
        elif 'HTTPS_PROXY' in os.environ:
            del os.environ['HTTPS_PROXY']

class YourAppGooglePlayTest(GooglePlayTest):

    _package_name = 'com.yourcompany.app'
    _search = 'keyword to search for the app'

    def test_tw(self):
        self._test_country_lang('TW', 'zh-tw')

    def test_hk(self):
        self._test_country_lang('HK', 'zh-hk')

if __name__ == '__main__':
    unittest.main()
1 取得 egirault/googleplay-api 的原始碼後,我們只會用到 googleplay.pygoogleplay_pb2.py,並直接操作 googleplay.GooglePlayAPI
2 使用 GooglePlayAPI 前要先完成登入,除了帳密之外,還得提供 Android ID。
Important 這裡的 Android ID 不同於 Settings.Secure.ANDROID_ID,雖然都是 64-bit hex string,但這裡指的是 Google Service Framework (GSF) ID KEY,可以用 Android Device ID 取得。

3往 Google Play 的請求視情況要間接透過 proxy servers。

如果可以自行在不同國家架設 proxy servers 當然最好,但如果是利用網路上免費的 proxy servers,考量的點有:

  • 支援 HTTPS/SSL Proxy,因為 Play Store 跟 Google Play 之間是走 HTTPS 協定。
  • 優先考量穩定度,再來才是速度。以 GatherProxy 為例,UPTIME (L/D) 欄位中的 L (live times) 越大越好,而 D (dead times) 則越小越好,再來才是考慮 RESPONSE TIMES
  • 就算 Geo IP Tool 之類的工具判定 proxy server 的 IP 落在特定國家,建議還是先用瀏覽器確認該 proxy server 也會被 Google Play Store 視為位在特定國家。(可以用 Firefox 搭配 Proxy Selector 快速切換不同的 proxy servers)
Figure 1. 可以從付費的幣別及下方連結的 URL 確認是否看到特定國家的市集 (此圖以香港 HK 為例)

4利用 GooglePlayAPI.search() 搜尋關鍵字,如果 package name 出現在查詢結果,就表示 app 還在該國市集架上。

參考資料

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s