コミケ:『niconico Windows 8アプリの通信を見てみよう』
この記事は、2013年夏のコミックマーケットで、@toriimiyukkiのApplestで頒布した冊子のデジタル版です。
誤字脱字の修正や、それなりに変更を加えています。
第1章 はじめに
この記事では、niconico Windows 8アプリの通信パケットをキャプチャし、通信内容を解析する手順について取り上げます。まず第1章ではパケットキャプチャの前に、各種紹介をします。
niconico
niconico(ニコニコ動画)を説明する必要はないでしょう。ニコニコ動画は株式会社ドワンゴが運営する日本最大の動画共有サイトです。
GIGAZINEによると、日本の20代の約9割の人がアカウントを持っているほど普及しています。
20代の約9割がアカウントを持っている巨大動画サービスniconicoのアニメ戦略 - GIGAZINE
http://gigazine.net/news/20130201-niconico-anime-strategy-anime-business-forum-2013/
ニコニコ動画は、Webサイトだけでなく、スマートフォンのアプリやゲーム機でも視聴できます。2014年4月現在で筆者が把握しているのを挙げると、以下のとおりとなります。
- PC向けWebサイト
- モバイル向けWebサイト
- ニコニコ動画モバイル(docomo/au/softbank)
- iOSアプリ
- Androidアプリ
- Windows 8アプリ
- Wii Uアプリ
- PS Vitaアプリ
- au TV boxアプリ
- 光BOX+アプリ
- Smart TV Boxアプリ
- VIERAシリーズアプリ
- BRAVIAシリーズアプリ
- 3DSアプリ
Webサイトでは、Webページを読み込むことで*1動画を再生することになります。iOSやAndroid、Windows 8アプリなどは、画面のレイアウト自体はアプリが持つため、画面パーツを全てWebサーバから取ってくる必要はありません。そのため、アプリの場合、Web API(Application Programming Interface)に対して通信をし、動画のタイトルや説明文などの画面表示に必要なデータを取得し、動画再生へと遷移します。
第2章では、Windows 8アプリとWeb API間の通信パケットのキャプチャを行い、通信内容の解析を行います。今回、パケットキャプチャの対象をWindows 8アプリとしたのは、Windows PC*2を用意すればいいためです。
niconico Windows 8アプリ
niconico Windows 8アプリは、ドワンゴがWindows Developer Daysにて発表し、2012/10/20にWindows Storeで公開されたアプリです。Microsoft Design Style*3に則り、Windows 8に最適化された形で、niconico*4を楽しめるアプリです。
Wireshark
Wiresharkは有名なパケット解析ソフトウェアです。Wiresharkでキャプチャしたパケットは、どのサーバと通信しているのか、どのポートでどのプロトコルを利用しているのか、といった情報を見れます。このアプリケーションは無料で配布されています。
このWiresharkを使い、Windows 8アプリの通信内容を解析します。
第2章の前に、Windows PCにWiresharkをインストールしてください。
Wiresharkは英語のソフトウェアでWebサイトも英語ですが、ダウンロードページからOSに合わせたインストーラをダウンロードして実行するだけでOKですので、ハードルは高くありません。
Wireshark · Go Deep.
http://www.wireshark.org/
Wireshark · Download
http://www.wireshark.org/download.html
第2章 Wiresharkでパケットキャプチャ、解析
本章では、Wiresharkでパケットキャプチャを行い、Web APIの通信内容をログイン後~動画再生前まで、一つ一つ解析します。 なお、ログインと動画の取得方法はについては記載しません。
手順1: Wiresharkを起動
Wiresharkを起動し、パケットキャプチャを行える状態にします。
Wireshark起動後左側のメニューから、PCが通信に使用するLANを選択し、Startボタンを押します。
ここで表示されるLANの数や種類は、Windows PCが持つ通信モジュールによって変化します。
手順2: niconico Windows 8アプリを起動
スタート画面から、niconico Windows 8アプリを起動します。*5
手順3: Wiresharkでパケットキャプチャを確認
Wiresharkで通信内容が表示されました。
これはアプリが起動後に通信をして、画面表示に必要な情報をWeb APIから取得しています。
アプリは起動をすると、メニューの表示に必要な情報をWeb APIから取得しています。
ここでの通信内容は、以下の7項目あります。
- ログイン
- セッションID取得
- 視聴履歴取得
- オススメ動画取得
- ランキング上位取得
- カテゴリ取得
- ユーザー情報取得
ここで、1. ログインだけ暗号化通信が行われます。これはログインのために、アプリ内に保存されたユーザーのメールアドレスとパスワードをWeb APIに送信するためです。
Wiresharkで6.カテゴリ取得を見てみましょう。
Wiresharkで、
HTTP 526 GET /nicoapi/v1/genre.list?dummy=1374388765 HTTP/1.1
と表示されている行の上で右クリックをし、Follow TCP Streamを選択してください。
これで6.カテゴリ取得の一連の通信内容を見れます。これを見ると、HTTPで通信していることが分かります。
6.カテゴリ取得のHTTPリクエストでは、ヘッダに1. ログインで取得したnicosidという認証情報をセットしています。
それに対するHTTPレスポンスでも、Nicosidという値で認証情報をセットしてきます。HTTPレスポンスでは、ボディに各カテゴリの情報が載っています。このパラメータは以下のフォーマットになっています。
<tag></tag>
に囲まれた箇所が......となっているのは、この箇所が日本語になっており、Wiresharkで表示できないためです。Web APIからUTF-8で送られてきているので、自作プログラムから参照する場合は正しく日本語で受け取ることができます。
niconicoは通信の多くの部分がXML形式かJSON形式、あるいは後述するgetflv APIのような&で連結されたURL形式で送られてきます。
手順4: niconicoアプリで動画再生
次にniconicoアプリで適当な動画を選択して、再生します。
手順5: 動画再生時の通信内容をキャプチャ
動画の再生時は、以下の通信が行われます。
- 動画の詳細情報取得
- 動画投稿者情報の取得
- オススメ動画の取得
- コメントの取得
- 動画の取得
1.動画の詳細情報取得を見てみましょう。
動画の詳細情報取得は、getflvというAPIにアクセスします。niconicoをWebサイトで視聴した際でもこのAPIにアクセスします。
Wiresharkで、
HTTP 523 GET /api/getflv?device=metro&eco=1&v=sm9 HTTP/1.1
と表示された行を右クリックして、Follow TCP Streamを選択します。
getflv APIは他のAPIと異なり、&で連結されたURL形式でレスポンスしてきます。各値はURLエンコードがされているので、URLデコードが必要です。この形式はXMLやJSONと異なり見やすくありませんが、このgetflv APIはniconico初期から使用されて以来、この形式でレスポンスしてきました。
getflvのレスポンスには、以下の情報が入っています。
- thread_id
- l
- url
- link
- ms
- ms_sub
- user_id
- is_premium
- nickname
- time
- done
- ng_rv
- hms
- hmsp
- hmst
- hmstk
この内、メッセージサーバに対するコメントの取得で1. thread_idと5. ms、7. user_idを使用し、3. urlの値を使用して動画サーバに対して動画の取得を行います。
次に、メッセージサーバへのアクセスを見てみましょう。
Wiresharkで、
と書かれた行を右クリックして、Follow TCP Streamで見ます。
これの一つ前までの通信では、GET形式でHTTP通信が行われていましたが、メッセージサーバへの通信はPOST形式で行われます。
ここの部分がPOST形式で、niconicoアプリからメッセージサーバへ送られているデータです。この通信はXML形式で行われます。
大雑把に見ると、リクエストはgetflvで取得した5. msに対して、1. thread_id...(1) 7. user_id...(2)を使い、リクエストは
レスポンスは、
という形式で行われています。
レスポンスの<chat></chat>
に囲まれた...........................
の部分がコメントです。vpos
が画面に表示するタイミング(10ミリ秒単位)を表します。この辺りは、niconicoのWebサイトの通信内容と大差ありません。
通信内容の解析おわり
前述のとおり、動画の取得時の通信内容については記載しません。動画の取得も、getflv APIで取得した情報を元に行っており、Wiresharkに表示されています。
ご自身で、どの通信が動画の取得なのかを確認してみてください。*6
第3章 さいごに
第2章の通り、Wiresharkを使うことでWeb APIへの通信内容を解析するのは容易にできます。
アプリの通信を見ることで、Web APIを設計する際の参考にしたり、そのWeb APIを使用するアプリを自作できます。
今回の記事ではniconicoのログインと、動画の取得は記載しませんでした。動画の取得の通信内容は容易に判別できますが、どうやったら暗号化された通信を見れるのか、といった探求をしてみてください。