まめ畑

ゆるゆると書いていきます

ニコニコのイロハ2

さて、今回は認証が必要なニコニコ動画APIについて書きます。
認証不要のお手軽APIニコニコのイロハ1を見てください。
間違いなどありましたら、コメントお願いします。
2/7 メッセージサーバ関連のところに追記と修正があります。

先ずは、ニコニコ動画の認証の仕組みについて説明します。
昨今のニコ動は目的の動画にたどり着くまで2段階の認証を行うようになりました。
このことは様々なサイトで解説されているので知っている人も多いかと思います。
昔は直ぐにたどり着けたのですが、最近の動画たちはガードが固くなりました。
でも、負けないぞ!

2段階の認証というのは、

  1. ニコニコ動画自体へのログイン
  2. 動画本体へアクセスするための内部的な認証

となっています。
2番目のものはログイン状態で動画へ直接アクセスする事を防ぐために行っているものと思われます。

次回にニコ動のAPIを使用してC#での動画のDLやコメントなどを表示するテストぷろぐらむαを晒してみようかと思います。そこで流れをつかんでもらうとして、今回は各APIに対するリクエストとレスポンスをみていこうと思います。

認証の始まりは、ニコニコ動画へログインする事から始まります。
プログラムでWebのフォーム認証を行うのは簡単です。
各プログラムの用法に従って行って下さい。
ここでログイン状態をcookieを使用して管理しますので、cookieを使えるようにして実行してください。
ここでのcookieをクッキー1と言う事にします。

リクエスト先
https://secure.nicovideo.jp/secure/login?site=niconico

ニコニコするために送信するパラメータ
・next_url 値は空
・mail メールアドレス
・password パスワード


これでニコニコする準備が終わりました。
次に動画の本体へアクセスするためのcookieを取得する必要があります。
ログイン時のcookieで動画本体へアクセスすると403エラーを突っ返してきます。
とりあえず、そのcookieを取得するのですが、このcookieは動画毎に発行されるので使い回しがききません。
なので、他の動画でニコニコしたい場合はその動画のcookieを新たに取得します。
ここでのcookieをクッキー2といいます。
クッキー2を発行してくれるアドレスは実はおなじみのアドレスです。
このアドレスへクッキー1を使ってアクセスします。
そうするとクッキー2がやってくるのでこれを保存します。

http://www.nicovideo.jp/watch/smxxx

そうです、いつもの動画を見る時のアドレスです。


さて、これでクッキー1とクッキー2がそろったので動画への道が開かれました。
それでは、動画本体のアドレスやメッセージサーバのアドレスを教えてもらいましょう。

http://www.nicovideo.jp/api/getflv?v=smxxx
このアドレスにクッキー1を使ってアクセスします
そうすると動画に応じて以下の様なレスポンスを返してきます。
例ではsm9にアクセスした結果です。

thread_id=1173108780&l=320&url=http%3A%2F%2Fsmile-com42.nicovideo.jp%2Fsmile%3Fv%3D9.0468&link=http%3A%2F%2Fwww.smilevideo.jp%2Fview%2F9%2F92076&ms=http%3A%2F%2Fmsg.nicovideo.jp%2F10%2Fapi%2F&user_id=xxxxxxx&is_premium=0&nickname=%E3%81%AB%E3%81%A3%E3%81%8F%E3%81%AD%E3%83%BC%E3%82%80&time=1202135794&done=true

これはURLエンコードされているので、デコードします。

thread_id=1173108780&l=320&url=http://smile-com42.nicovideo.jp/smile?v=9.0468&link=http://www.smilevideo.jp/view/9/92076&ms=http://msg.nicovideo.jp/10/api/&user_id=xxxxxxx&is_premium=0&nickname=にっくねーむ&time=1202135504&done=true

・パラメータ

  • thread_id メッセージサーバにアクセスする際に使います

      この動画のメッセージサーバ内での識別番号

  • l これは不明です
  • url こいつが動画本体のアドレスです。

エコノミーモード時はlowが付きます

  • link 出展元
  • ms メッセージサーバのアドレス
  • user_id 自分のID(数字)
  • is_premium プレミア会員か(0 or 1)
  • nickname 自分のニックネーム
  • time 不明
  • done いつもtrueな気が・・・


さて、気になる動画へアクセスする前にメッセージサーバとお話してみます。

アクセス先は先ほど教えてもらったアドレスです。
今回は、http://msg.nicovideo.jp/10/api/
ここへ以下の様なリクエストを投げます。

これはプレミア会員だと、何時から何件と指定出来るようですが、プレミアじゃないので一般会員版という事で。
threadに指定するIDは先ほどのthread_idで取得したものです、今回は1173108780です。
他の値は固定値のようです。
そうすると、100件の返信がやってきます。形式はXMLです。
がコメント分あります

<?xml version="1.0" encoding="UTF-8" ?> 
  <packet>
    <thread last_res="2391080" resultcode="0" revision="6" server_time="1202210120" thread="1173108780" ticket="0xxxxxxxx" /> 
    <view_counter id="sm9" mylist="47720" video="3423865" /> 
      <chat anonymity="1" date="1202201189" mail="purple 184" no="2390981" thread="1173108780" user_id="XH2MTlk-Dx1JPJ9etN_cXndrWkw" vpos="4284>コメント
   </chat> 
  </packet>

chat以外は再生数や動画IDなどです、ticketはなんでしょう?
・属性

  • anonymity 匿名コメントかどうか
  • date コメント時間
  • mail コマンド
  • no コメント番号
  • thread すれ番号
  • user_id コメントしたユーザIDが変換されています
  • vpos コメント表示開始時間

コメント位置(縦座標)

投稿者コメントとニコスクリプトの取得方法をコメントで返信をいただきました。
メッセージサーバに以下のリクエストを投げると両方取得出来るそうです。

となっているのですが、投稿者コメントはどこで受信してるんだろう?それも一緒にやってきてるのかな?あとは、にこスクリプトも。
この受信結果をXMLで整形すれば後は、プレイヤーで指示通りに描画するだけです。
なので、ニコニコ動画を低スペックのPCでみたり弾幕が発動するとカクカクするのはプレイヤーで処理をさせているからです。

さて、残るは動画にアクセスするだけです。
動画にアクセスする鍵はクッキー2を使用します。

動画のアドレスは先ほどのアクセスでGETした、urlパラメータです。
今回の例だと、http://smile-com42.nicovideo.jp/smile?v=9.0468
ここへクッキー2を使用してアクセスすればDL可能です。


これで一通りのAPIと認証の事を書きました。
これで、コメントだろうが動画だろうがアクセス可能です。

ポイントはログイン時のセッションを保持して動画様のセッションを受取るということです。
後は適切なクッキーをセットして各APIに対してアクセスするだけです。

めんどくさいです。
でも、実は動画を全部DL完了した状態だと、ブラウザのキャッシュにflvファイルがいるのでそいつを別のフォルダにコピーすればいいだけです。


ニコ動がバージョンアップしてついた新機能などはまだ良くわからないので調べないといけませんが、これで一通りの事が出来るのではないでしょうか?

公開しちゃえばいいのになぁ。