ニコニコ動画のダウンロード
現在におけるニコニコ動画のダウンロード方法についてまとめておきます。
- ログイン
- https://secure.nicovideo.jp/secure/login?site=niconico から
- SSLv3でないとだめ
- ログイン時に取得したCookieを用いて目的の動画のURLをGETして、さらにCookieを取得し更新する
- 動画を実際に見たかどうかのチェックをクリアする
- http://flapi.nicovideo.jp/api/getflv から動画データの実際の場所を取得する
- swf形式の動画の場合は クエリの末尾に"?as3=1"と付ける
- レスポンスの url=*** となっている、URLエンコードされた部分をデコードする
- 前段階で取得したCookieを用いて動画データを取得する
以上となります。
以下にこの動作を実装したシェルスクリプトを掲載します。
curl と ruby を使用しています。
#! /bin/sh if [ $# -eq 0 ] then echo "invalid argument" exit 0 fi assert() { if [ $? -ne 0 ] then echo $1 exit 1 fi } EMAIL="sample@sample.com" PASS="password" SAVEDIR=/tmp COOKIE=/tmp/nico_cookie TARGET=$1 FILENAME=`echo $TARGET | ruby -e "print $<.read.chomp.split('/')[-1]"` echo "LOGIN" curl -c $COOKIE -d "mail=$EMAIL" -d "password=$PASS" "https://secure.nicovideo.jp/secure/login?site=niconico" -3 -i > /dev/null assert "couldn't login" echo " success" echo ""; echo "UPDATE COOKIE" curl -b $COOKIE -c $COOKIE $TARGET -i > /dev/null assert "couldn't get the target page" echo " success" echo ""; echo "GET VIDEO INFO" FLAPI_POSTFIX=`echo $FILENAME | ruby -e "print $<.read.chomp[0,2] == \"nm\" ? \"?as3=1\" : \"\""` FLAPI_RES=`curl -b $COOKIE "http://flapi.nicovideo.jp/api/getflv/$FILENAME$FLAPI_POSTFIX"` assert "couldn't get the target video info" echo " success" VIDEO_URL=`echo $FLAPI_RES | ruby -e "require \"cgi\";print CGI.unescape(Hash[*($<.read.chomp.split(\"&\").map{|e| e.split(\"=\")}.flatten)][\"url\"])"` assert "couldn't get the target video url" echo ""; echo "DOWNLOAD:$VIDEO_URL" curl -b $COOKIE $VIDEO_URL > $SAVEDIR/$FILENAME assert "couldn't download the target video" echo " success" echo ""; echo "LOGOUT" curl -b $COOKIE "https://secure.nicovideo.jp/secure/logout" -3 -i > /dev/null assert "couldn't logout" echo " success" exit 0
curl の -b (指定のcookieを利用しクエリを投げる) -c (指定のファイルにcookieを書きこむ) オプションを利用しています。