[Windows][Store] 定期檢查 App 在各國市集架上的狀態

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

Windows Store 的狀況跟 Windows Phone Store 類似,雖然官方一樣沒有提供 API 可以查詢架上的 app,不過還是可以側錄市集的網路存取,藉以找出後端 web service 未公開的接口 – Search API

https://next-services.apps.microsoft.com/search/6.3.9600-0/776/<LANG>_<LANG>/m/<COUNTRY>/c/<COUNTRY>/il/<LANG>/cp/10005001/query/cid/0/pf/1/pc/0/pt/x64/af/0/lf/0/s/0/2/pn/0/pgc/-1?phrase=<KEYWORD>

其中:

查詢的結果是一個 XML,預設會傳回前 40 筆資料;在結構上,每一個 <Pt> 都表示一個 app,底下的 <I> 表示 app ID。因此,只要分別代入不同的 LANGCOUNTRY,並確認 app ID 有出現在查詢結果中,就可以達到檢查 app 是否還在架上的目的。

/search API 查詢結果
<?xml version="1.0" encoding="UTF-8"?>
<rslt>
   <Ptl>
      <AC>1000</AC> <!-- 查詢結果的筆數 -->
      <Pts>
         <Pt> <!-- 1 -->
            <I>add3d66a-358d-4fe2-be68-8a3f934e9ea1</I> <!-- App ID -->
            <T>Facebook</T> <!-- App 名稱 -->
            <!-- ... -->
         </Pt>
      </Pts>
   </Ptl>
   <navigator pageSize="40" hitCount="1000" PagiCode="" /> <!-- 2 -->
   <quality hasResult="True" />
</rslt>

下面的 unit test 可以測試 Facebook 是否在 Windows Phone 台灣、日本等不同國家的市集上:

import unittest2 as unittest
import urllib2
from xml.etree import ElementTree as ET

URL_SEARCH = 'https://next-services.apps.microsoft.com/search/6.3.9600-0/776/' \
             '%(lang)s_%(lang)s/m/%(country)s/c/%(country)s/il/%(lang)s/cp/' \
             '10005001/query/cid/0/pf/1/pc/0/pt/x64/af/0/lf/0/s/0/2/pn/0/pgc/-1' \
             '?phrase=%(keyword)s'
APPID = 'add3d66a-358d-4fe2-be68-8a3f934e9ea1'

class FacebookWindowsStoreTest(unittest.TestCase):

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

    def test_jp(self):
        self._test_country_lang('JP', 'ja-jp')

    def _test_country_lang(self, country, lang, keyword):
        params = dict(country=country, lang=lang, keyword='facebook', appid=APPID)

        apps = [] # (app_id, name)
        root = ET.fromstring(urllib2.urlopen(URL_SEARCH % params).read())

        for app in root.getiterator('Pt'):
            app_id = app.find('I').text
            name = app.find('T').text
            apps.append((app_id, name))

        assert APPID in dict(apps), apps
廣告

One thought on “[Windows][Store] 定期檢查 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