[php] PHPでニコニコ動画をダウンロードする方法 その1

perlでニコニコ動画ダウンロードという記事がはやってるので、同じ事をphpでもやってみました。

やってること自体はPerlと同じです。

以下がソースとなります

<?php
/*
 * niconico downloader in php version
 */

$mail     = "your email";
$password = "your password";
$video_id = $argv[1];

$param = array(
		"mail" => $mail,
		"password" => $password,
);

/*
 * videoをget!するまでの手続き!
 *
 * 1. ニコニコにloginする
 * 2. 取得したいvideoのsessionを取得する
 * 3. videoのありかをidを元に取得する
 * 4. videoのファイル情報を元にvideoをgetする
 *
 */

nico_login($param);
login_to_video($video_id);
$video = get_video_position($video_id);
get_video($video, $video_id);



/*
 * とりあえずログインする. session保存のための設定もしておく(しかし、
 * sessionの保存ってtmpファイルなしでできないものなのか(ノ∀`)アチャー))
 */

function nico_login($param)
{
	$fp = fopen("tmp", "w");
	$ch = curl_init("http://www.nicovideo.jp/login");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_POST, TRUE);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
	curl_setopt($ch, CURLOPT_WRITEHEADER, $fp);
	$output = curl_exec($ch);
	fclose($fp);
	curl_close($ch);
}

/*
 * 取得したいvideoのセッションを得るための手続き
 */

function login_to_video($video_id)
{
	$fp = fopen("tmp2", "w");
	$ch = curl_init("http://www.nicovideo.jp/watch/$video_id");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
	curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp");
	curl_setopt($ch, CURLOPT_WRITEHEADER, $fp);
	curl_setopt($ch, CURLOPT_GET, TRUE);
	$output = curl_exec($ch);
	fclose($fp);
	curl_close($ch);
}

/*
 * nicovideoのidを元にvideoの位置をget!する
 */

function get_video_position($video_id)
{
	$ch = curl_init("http://www.nicovideo.jp/api/getflv?v=$video_id");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
	curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp");
	curl_setopt($ch, CURLOPT_GET, TRUE);
	$data = curl_exec($ch);
	curl_close($ch);

	preg_match("'url=(.*?)&link'", urldecode($data), $match);
	return $match[1];
}

/*
 * get_video_positionでget!してきたvideoの位置情報を元にvideoをgetする
 */

function get_video($video, $video_id)
{
	$fp = fopen("$video_id.flv", "wb");
	$ch = curl_init($video);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
	curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp2");
	curl_setopt($ch, CURLOPT_GET, TRUE);
	$output = curl_exec($ch);
	fwrite($fp, $output);

	fclose($fp); 
	curl_close($ch);
}
?>

こんな感じになります。

プログラム上、引っかかりそうな場所はセッションの扱いなのですが、これは2段階で取得する必要があります。

ひとつは、niconico動画へのloginセッションの取得。 もうひとつはgetしたい動画のセッションの取得.

loginセッションは、getしたい動画のセッションの取得および、動画情報を取得するために必要になります。また、getしたい動画のセッションは実際に動画をダウンロードする手続きをする際に必要になります。

とくに2番目のセッションの取り扱いには気をつける必要があります。

私は昔pythonで同様のプログラム(ニコニコ動画ダウンロードするスクリプト)を書いたことがあるのですが、その際にはこのような手続きは必要ありませんでした。なぜかというと、そのプログラムを書いたとき(4月ぐらい?)には動画本体に直接アクセスすることで動画をゲットすることができたからです。どうやらニコニコ動画のセキュリティが強化されているようですね^^

プログラムの使用方法はというと、コマンドライン上で

 php niconico.php id

と実行し、成功した場合はid.flvという名のvideoを取得することが出来ます。

とまぁこんな感じです。次はニコニコ動画取得のスクリプトを書いてみるつもりです。気が向いたらruby版、python版とかも作ってみるつもり..