[c#]iTuens の api を使って App Store のアプリ情報の取得

iTunesより早い「高速AppStore検索」作りました。 – ku-sukeのはてなダイアリー
http://d.hatena.ne.jp/ku-suke/20100228
iPhoneアプリの値下げ情報をつぶやくBotを作りました。あと、App storeのxmlの取得の仕方。 ≪ KORESS: ジャパニーズ・モダン・ドンブラコ
http://koress.jp/2009/10/iphonebotapp_storexml.html

あたりを見て、iTunes の web api を叩けば ok ってことで、簡単に。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void button1_Click(object sender, EventArgs e)
{
 
    // url を取得
    string id = "6015";
    string url = "http://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/browse?path=%2F36%2F" + id + "%2F1";
    WebClientEx client = new WebClientEx();
    // cookie を設定
    client.Cookie = new CookieContainer();
    client.Headers.Add("User-Agent", "iTunes/10.6.3 (Windows; Microsoft Windows 7 Ultimate Edition Service Pack 1 (Build 7601)) AppleWebKit/534.57.2");
    client.Headers.Add("X-Apple-Store-Front", "143462-9");
    // client.Headers.Add("Accept-Encoding", "gzip");
    StreamReader sr = new StreamReader(client.OpenRead(url));
    string content = sr.ReadToEnd();
    sr.Close();
 
    Debug.Print("length:{0}", content.Length);
 
    // ファイルに出力
    StreamWriter sw = new StreamWriter("result.xml", false);
    sw.Write(content);
    sw.Close();
    textBox1.Text = string.Format("success: {0}", content.Length);
}

受信する時に gzip のほうが小さくなるのですが、zip 解凍が面倒なので付けていません。つけないと普通の text で取得できます。
ただし、カテゴリによって非常にでかい(ファイナンシャルだと10MBぐらい)なので、注意が必要です。

取得したデータは XML 形式で、objective-c を書いた方であれば、ああなるほどなプロパティリストな構造になっています。
なので、dict タグの下に、key-value という形式なのですが…これがプロパティリストのアクセス手段がない c# では面倒で orz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dict>
  <key>artistId</key><integer>284946266</integer>
  <key>artistName</key><string>e-Agent</string>
  <key>buy-only</key><true/>
  <key>buyParams</key><string>productType=C&amp;salableAdamId=286058381&amp;pricingParameters=STDQ&amp;price=0&amp;ct-id=14</string>
  <key>genre</key><string>ファイナンス</string>
  <key>genreId</key><integer>6015</integer>
  <key>itemId</key><integer>286058381</integer>
  <key>itemName</key><string>3in1 Mortgage Calc</string>
  <key>kind</key><string>software</string>
  <key>playlistName</key><string>3in1 Mortgage Calc</string>
  <key>popularity</key><string>0.0</string>
  <key>price</key><integer>0</integer>
  <key>priceDisplay</key><string>無料</string>
  <key>rating</key>

自前の ExDoc を使ってこんなことをしています(ExDocは、そのうち、XmlDom, HtmlDom になる予定です)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void button2_Click(object sender, EventArgs e)
{
    var doc = new EXDocument();
    doc.Load("result.xml");
 
    var items = doc * "key" == "itemId";
    var lst = new List<App>();
    foreach ( var it in items )
    {
        var pa = it.Parent;
        lst.Add(
            new App
            {
                itemId = pa.ChildNodes[13].Value,
                itemName = pa.ChildNodes[15].Value
            });
    }
    dataGridView1.DataSource = lst;
}

key の値が「itemId」のタグを拾ってきて、親要素を取得。
その子ノードを ChildNodes でピンポイントで拾うという荒業です。まあ、これで用途は足りるかと。

実行結果はこんな感じ。

このデータをローカルファイルに保存しておけば、iTunes を使わなくても高速検索ができますよ、ってな具合ですね。
Web 上に乗せる場合はちょっと工夫が要りますが基本は同じ。一定時間で取得するようにすれば、最新アプリ情報とかも取れるかも。

カテゴリー: C# パーマリンク