« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1) »

2009/09/06

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]になっているのではないかと考える。

 

他にも多くの処理が行われているのだと思うが今回はここまで。推測が多くなっているが、ニコニコ動画サーバの仕様を正確に理解することを目的にはしていないので了承願いたい。

参考:

« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2):

« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(1) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1) »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ