プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iTunesのランキングを毎日自動で取得する その1

 iTunesのランキングを毎日自動的に取得したいと思って、方法を調べてみました。欲しいランキングは、iPhone/iPadごとに全てのカテゴリーで、それぞれの無料App・有料App・トップセールスAppです。とりあえずは日本限定にします。
 まず、そもそも人間系で見る時はどうするのか?iTunesを起動してiTunes Storeを開き、iPhoneかiPadを選んだ上でApp Storeのプルダウンからカテゴリを選びます。そして、右メニューの有料/無料/トップセールスappから"全て見る"を押すと上位200件が出てきます。


 動きを見ている限り、限りなくHTTPのリクエストでXMLなりを返しているのだと思います。では、そのURLが判明すれば解決です。パケットキャプチャをしようと思ったのですが、そんな事をしないでもリンクを選択した上で右クリックで"リンクを開く"か"リンクをコピー"の選択肢が出てきます。そこでリンクをコピーすれば、URLがゲットできます。


 喜び勇んで入手したURLをブラウザに貼り付けると、下記のようにiTunesを立ち上げるメッセージが出てきます。残念。


 そこでGoogleさんに聞いてみると、同じようなことを試している人が沢山見つかります。単純にユーザーエージェントの詐称のみで解決するようです。User Agent Switcher等を使って変更しましょう。user agentの部分にiTunes 9.1.1を指定して、後は空文字で大丈夫です。


 変更後試してみると、ブラウザからも一覧が見えました。これで一歩前進です。ここいらで、URLの構造がどうなっている調査してみましょう。例えば、iPadでファイナンスカテゴリの有料appは、次のURLになります。

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=47

 引数には、genreIdとidとpopIdの3つのパラメータがあります。これ一つだけみても解らないので、iPhone/iPad含めて幾つかのURLを収集してみましょう。

ファイナンス 有料iPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=47
ファイナンス 無料iPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=44
ファイナンス トップセールスiPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=46
ファイナンス 有料iPhone
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=30
ファイナンス 無料iPhone
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=27
ファイナンス トップセールスiPhone
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6015&id=25177&popId=38
ビジネス 有料iPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6000&id=25153&popId=47
ビジネス 無料iPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6000&id=25153&popId=44
ビジネス トップセールスiPad
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6000&id=25153&popId=46

 まずpopIdですが、ランキングの種類を指しているので間違いなさそうです。有料iPadが47、無料iPadが44、トップセールスiPadが46。有料iPhoneが30、無料iPhoneが27、トップセールスiPhoneが27のようです。
 次にgenreIdとid。どちらも同一カテゴリだと同じ値なので、カテゴリを指している模様です。しかし、どちらも同じ値なので、どちらで判断しているか悩む所です。しかも、どちらかの値を消しても、ちゃんとそのカテゴリを表示されます。ただ、genreIdをビジネスの6000にして、idをファイナンスの25177を指定すると、ビジネスカテゴリが表示されるので、genreIdが優先されると考えておけばよいでしょう。実際の所、idが何の為の引数かよく解りません。


 さて、ここでランキングをよくよく見てみましょう。日本ではなく、米国のモノが表示されているっぽいですね。でも、国を指定する引数もないですし、どうしたら良いのでしょうか?調べてみたところ、これもブラウザの値を見ている模様です。X-Apple-Store-Frontに日本のコード"143462-9"を設定すれば良いようです。URLの引数にした方が良くない、Appleさんと思わないでもないですが、色々大人の事情があるんでしょう。


 上記の事項をひっつけて取得する方法は、curlでは次のとおりです。

curl -s -A "iTunes/9.0.2 (Macintosh; Intel Mac OS X 10.5.8) AppleWebKit/531.21.8" -H "X-Apple-Store-Front: 143462-9" 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6000&id=25153&popId=47'


 ここまで出来れば、後は全カテゴリを調べてプログラミングするだけです。ちょっと長くなったので、また次回。