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&salableAdamId=286058381&pricingParameters=STDQ&price=0&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 上に乗せる場合はちょっと工夫が要りますが基本は同じ。一定時間で取得するようにすれば、最新アプリ情報とかも取れるかも。