ニコニコ動画の flv ファイルとコメントを取ってみました
やってみたはいいが, 月曜から始まる有料サービスで大きく様変わりする予感.
まあいいか.
調べる手法は, 同じで大丈夫だろうし.
flv ファイルを取得してみる
かなり前に作った. 色々問題がある関数であることは間違いないけど, 公開しちまおう.
これは, emacs-w3m の関数を利用して, ニコニコ動画の flv ファイルを取得するもの.
(defun w3m-get-nicovideo-flv (url) "ニコニコ動画の flv ファイルをダウンロードする関数. emacs-w3m 必須. また, 事前に, emacs-w3m を使い, ニコニコ動画にログインしておく必要がある. flv ファイルの URL に直接アクセスして, ダウンロードする限りだと, w3m は必要ない. しかし, その flv ファイルが置いてある URL を知るために必要となる. やっつけ仕事なので, URL が上手くマッチしなかったときのこととかは, 考えてない." (let ((buf "*nicovideo*") (regex "url=\\([^&]*\\)&link=") nico-flv-url) (setq url (format "%s%s" "http://www.nicovideo.jp/getflv?v=" (progn (string-match "http.*?watch\/\\(.*\\)$" url) (match-string 1 url)))) (with-current-buffer (get-buffer-create buf) (erase-buffer) (w3m-process-with-wait-handler (w3m-retrieve url)) (re-search-backward regex nil t) (setq nico-flv-url (match-string 1)) ;; テスト用 ;; (message "%s" (w3m-url-decode-string nico-flv-url)) (w3m-download (w3m-url-decode-string nico-flv-url))))) ;; 使用例 (w3m-get-nicovideo-flv "http://www.nicovideo.jp/watch/sm296667")
動画は, アクエリオンだった思う.
別にログインしてなくても取れる.
間違えた. この関数は元URLからやってるからニコニコに emacs-w3m で事前にログインしておく必要がある.
コメントを取得してみる
text-translator のソースを元に作った.
かなりのやっつけ.
(let* ((buf "*niconico_test*") (proc (open-network-stream "Web Connection" buf "msg22.nicovideo.jp" 80)) (enc-str "<thread thread=\"1181906758\" version=\"20061206\" res_from=\"0\" />") (post-str "/api/ HTTP/1.1") (post "msg22.nicovideo.jp")) (with-current-buffer (get-buffer-create buf) (erase-buffer) (set-process-coding-system proc 'utf-8 'binary) (set-process-sentinel proc (lambda (proc state) nil)) (process-send-string proc (format "%s%s%s%s%s%s%s%s%s%s%s%s%s" "POST " post-str "\r\n" "HOST: " post "\r\n" "Content-Length: " (string-bytes enc-str) "\r\n" "\r\n" enc-str "\r\n" "\r\n"))))
これを評価すると, *niconico_test* というバッファが作成され,
その中に動画のコメントが格納されてる.
XML 形式なんだねぇ.
動画は, たしか・・・, ハル☆スタだったかなあ.
これも別にログインしてなくても取れる.
取り方
基本的にググるのと Firefox 拡張機能の Live HTTP headers や Firebug を使って調べるだけ.
まあ, 細かく解説をば.
flv, コメントの取り方.
2. ニコニコ動画の URL をまず変換する.
http://www.nicovideo.jp/watch/sm458434 ならば, http://www.nicovideo.jp/getflv?v=sm458434 のようにする.
http://www.nicovideo.jp/watch/sm458434 http://www.nicovideo.jp/getflv?v=sm458434
この http://www.nicovideo.jp/getflv?v=sm458434 にアクセスする.
よーわからん文字列が表示されただけやと思う.
3. 文字列の意味
文字列は, 「&」で区切られている.
- thread_id : コメントを取るときに重要
- l : よーわからん.
- cms : たぶん使ってる動画サイト.
ニコニコなら, SMILEVIDEO. Ameba なら AmebaVision になる. - url : flv ファイルのある場所.
こんな感じ. http%3A%2F%2Fs-clb5.smilevideo.jp%2Fsmile%3Fv%3D458434.10464 - link : 動画情報のページ. 最後に自分の ID が付加されている.
- ms : コメントのあるサーバ.
こんな感じ. http%3A%2F%2Fmsg22.nicovideo.jp%2Fapi%2F& - user_id : 自分の ID
- nickname : 自分のニックネーム.
- done : よーわからん.
これを利用して, flv, コメントを取得する.
4. flv を取得
文字列の中の次の一文に注目する.
url=http%3A%2F%2Fs-clb5.smilevideo.jp%2Fsmile%3Fv%3D458434.10464
これをデコードする.
こことか利用してみるとお手軽.
Emacs なら, w3m の関数, w3m-url-decode-string を利用する.
すると, 次の URL を取得できる.
http://s-clb5.smilevideo.jp/smile?v=458434.10464
ここにアクセスすれば, 動画の flv ファイルが取れる.
5. コメントを取得
ms=...& と thread_id=...& の2つの値を利用して取得する.
ms=の値は, URL デコードする.
こんな感じ. 上がデコード前, 下がデコード後.
http%3A%2F%2Fmsg22.nicovideo.jp%2Fapi%2F http://msg22.nicovideo.jp/api/
msg** の ** の値が動画ごとに違うのかな?
あとは, ここ向けに POST を使うだけ.
送る内容は, こんな感じ.
<thread thread="1181906758" version="20061206" res_from="0" />
thread= の値を thread_id の値にする.
これは, Live HTTP Headers や Firebug を使って調べてみると楽.
SWF ファイルを直接指定.
まとめ.
flv ファイルや, 動画のコメントが置いてある鯖には別にログインしてなくてもアクセスできて,
コメントや flv ファイルが取得できる.
でも, その flv ファイルを取得するための鯖の位置を知るためには, ログインしている必要がある.
つまり, 次の変換がログインしてないとできない.
http://www.nicovideo.jp/getflv?v=sm458434 http://s-clb5.smilevideo.jp/smile?v=458434.10464
疲れた. まとめ書いてて途中であきてきた.
どっか間違ってるかも.
明日というか, 今日の有料化で変わるんだろうなあ.
せっかくまとめたのにw
更新時刻
2007年, 6月18日, 00:30