noise

計算機科学や各種設定のメモ

ニコニコ動画のダウンロード

現在におけるニコニコ動画のダウンロード方法についてまとめておきます。

  1. ログイン
  2. ログイン時に取得したCookieを用いて目的の動画のURLをGETして、さらにCookieを取得し更新する
    • 動画を実際に見たかどうかのチェックをクリアする
  3. http://flapi.nicovideo.jp/api/getflv から動画データの実際の場所を取得する
    • swf形式の動画の場合は クエリの末尾に"?as3=1"と付ける
    • レスポンスの url=*** となっている、URLエンコードされた部分をデコードする
  4. 前段階で取得したCookieを用いて動画データを取得する

以上となります。
以下にこの動作を実装したシェルスクリプトを掲載します。
curlruby を使用しています。

#! /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を書きこむ) オプションを利用しています。