iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2)
iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1)より。
結果
キャプチャしたパケットを操作順に見ていく。
起動~ランキング表示
まず、アプリケーションを起動した際に以下のGETメソッドを呼んでいる。この後、GUIはランキング一覧を表示することになる。
GET /v2/genre.list?overseas=0&official=0 HTTP/1.1
パラメータはoverseasとofficialの2個。応答として、下記のXMLが返っている。画面表示用のランキング一覧データであることが明白である。
<?xml version="1.0" encoding="utf-8"?>
<nicovideo_genre_response status="ok">
<genre>
<key>all</key>
<tag>総合</tag>
</genre>
<genre>
<key>music</key>
<tag>音楽</tag>
</genre>
(中略)
<genre>
<key>other</key>
<tag>その他</tag>
</genre>
</nicovideo_genre_response>
前回記載が漏れたが、XMLデータは文字コードがUTF-8になっており、Stirlingでは直接表示できない。これについては、XML部をStirlingでコピー&ペーストして新規ファイルを作成し、保存したものをサクラエディタなどのUnicode対応エディタで開けば良い。
ジャンル別ランキング(サムネイル画像つき)表示
次に、ランキング一覧から「総合」リストをクリックした。このときのGETメソッドは下記の通り。GUIは、総合ジャンルの個別ランキング一覧へ遷移した。
GET /v2/video.ranking?genre=all&span=hourly&type=view&limit=30 HTTP/1.1
パラメータは4個。このうち、genreは前回の応答に含まれるgenreのkey、spanは集計期間[1]、limitは何位までのデータを要求するかを表していることが想像できる。応答は以下の通り。
<?xml version="1.0" encoding="utf-8"?>
<nicovideo_video_response status="ok">
<count>29</count>
<video_info>
<video>
<id>sm8131798</id>
<deleted>0</deleted>
<title>ドリームキャストをCore2Duo 3GHz搭載PCに改造し、PS2を動作させてみた (前半)</title>
(中略)
<length_in_seconds>572</length_in_seconds>
<movie_type>mp4</movie_type>
<thumbnail_url>http://tn-skr3.smilevideo.jp/smile?i=8131798</thumbnail_url>(後略)
status=”ok”は要求に対して正しい応答を返していること、countの29は、29位までの動画情報を応答として渡していることを表すのだろう。30個要求して応答が29個になっている理由は不明。
また、上記に続けて以下のようなGETメソッドを何回か呼び出していた。
GET /v2/thumbnail?url=http%3A%2F%2Ftn-skr4%2Esmilevideo%2Ejp%2Fsmile%3Fi%3D8134939 HTTP/1.1
メソッド引数名の通り、サムネイルを要求しているのだと思われる。パラメータurlには、先に実行したGETの応答に含まれるthumbnail_url値をURLエンコードした値を設定しているようだ。順序は上位から、というわけではなさそうだ。また、画面をスクロールさせるたびにGETメソッドが呼ばれているので、おそらく一気に取得要求するのでなく、可視部分について逐次要求しているのだろう。
ログイン
サムネイルをクリックしコンテンツ再生を行おうとした際にsecure.nicovideo.jpとの間でSSL通信が発生していた。今回の方法では通信内容は分からないが、ログイン認証であることが想像できる。
SSL通信終了後、続いて以下のGETメソッドを実行している。
GET /v2/login?ticket=nicoiphone_XXX HTTP/1.1
XXXの部分には、実際には数字列が設定されている。これは前エントリ冒頭で示した高木さんのエントリ「やはり退化していた日本のWeb開発者「ニコニコ動画×iPhone OS」の場合」中の図9で説明されている通信である。nicoiphoneから始まる文字列(ticket)は、私が知らない情報であるため、これがSSL通信の応答で得られた値であろう。
今回通信の応答としてsession_idが得られる。
コンテンツ取得前処理
更に続いて以下のGETメソッドを呼んだ。
GET /v2/videostatus?video_id=sm8120862 HTTP/1.1
パラメータvideo_idは、一覧でクリックしたサムネイルに対応する動画のIDである。応答では”OK”が得られた。該当するコンテンツが取得可能であることを表すのだろう。
この後も自動でGETメソッドを呼んだ。
GET /v2/gate?video_id=sm8120862&sid=XXX HTTP/1.1
XXXの箇所には、先ほどのsession_idを設定している。
応答で得られる情報はバイナリになっているが、Shift_JISに変換すると、version, state, vid, tid, nid, psvrそれぞれの値と、ニコニコ動画モバイル(つまりiPhoneアプリには関連が無いと思われる)に関する日本語文字列やm.nicovideo.jpのURLを取得しているように見える。vidは動画ID(今回の場合はsm8120862)、nidはユーザIDが設定されているようだ。
コンテンツ取得
最後に呼んでいるのが実際のコンテンツ取得のGETメソッドのようだ。これはパラメータを変更しながら複数回呼び出している。
GET /v2/play?transmission_speed=0&sound_quality=16&frame_rate=8&chat_get=0&video_id=sm8120862&sid=XXX&network=wifi&thread_id=XXX&date_time=0&play_server=XXX&initial=1 HTTP/1.1
sidはsession_id, thread_id及びplay_serverには前回GETの応答で得られたtid値, psvr値をそれぞれ設定している。thread_idはコメント機能に関連するデータだろう[2][3]。
その他、transmission_speedはヘッダ[4]を除いた転送速度[5]、chat_getパラメータの有無はヘッダ部要求かどうか、date_timeは要求するコンテンツストリームの位置(単位:秒)、sound_quality, frame_rate, network, initialは、iPod touchのwifi接続では固定に見える(ただしframe_rateはエコノミーかどうかで2値を取り得る)が、動画長(再生時間)などで変わるのかもしれない。
応答で得られるバイナリデータはニコニコ動画モバイルと同形式[4]になっているのではないかと考える。
他にも多くの処理が行われているのだと思うが今回はここまで。推測が多くなっているが、ニコニコ動画サーバの仕様を正確に理解することを目的にはしていないので了承願いたい。
参考:
- [1]genre, spanはそれぞれニコニコ動画で使えるRSSフィードの「動画ランキング」にある”カテゴリ”、”期間”とそれぞれ一致すると思われる。
- [2]戀塚昭彦, ニコニコ動画とFLASH(swfファイル), 4-2.用語:スレッドID
- [3]スマートネットワーク 開発ブログ - ニコニコ動画にコメントを書き込む手順
- [4]杉谷保幸, ニコニコモバイル!(仮)(swfファイル), 動画再生ロジック
- [5]杉谷保幸, ニコニコモバイル!(仮), 可変ビットレート(?)
« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1) »
この記事へのコメントは終了しました。
« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1) »
コメント