気まぐれラボラトリィ

自分の日常とへんてこなコードと大好きなニコニコ動画と
適当すぎるWebページと・・・
neco-labo.co.cc

2009年 08月22日(土)

PHPでニコニコ動画のコメント取得

いまさらな話題だが、他のブログの情報を参考にして作ってみた。

意味不明・無駄な部分があるかもしれないが適当に脳内補完してくれ。


以下他ブログからパクった引用

$mail="";  //ニコニコのメールアドレス

$passwd=""; //ニコニコのパスワード

$mov_id=""; //動画ID sm500873など

Class nico_login{

var $user_session; //ユーザーセッションを格納

var $res_arr; //ログイン時のレスポンスを格納

function __construct($mail,$passwd){ //コンストラクタ

$url = "https://secure.nicovideo.jp/secure/login?site=niconico";

$data = array("next_url" => '',"mail" => $mail,"password" => $passwd,"submit" => "",); //POSTの設定

$data = http_build_query($data);

$option = array('http' => array('method' => 'POST','content' => $data));

$context = stream_context_create($option); //contextの作成

$fp = @fopen($url, 'rb', false, $context); //streamを開く

$response = @stream_get_meta_data($fp); //streamからmetaデータの取得

preg_match('(user_session=[a-z0-9_]+)',$response[wrapper_data][8],$a);

$this->res_arr=$response;

$this->user_session=$a[0];

}

function get_video_url($video_id){

$context = stream_context_create(array('http'=>array('method'=>'POST','header'=>"Content-type: text/xml\r\nCookie:".$this->user_session.";")));

$res = split("&",urldecode(file_get_contents('http://www.nicovideo.jp/api/getflv?v=’.$video_id,false,$context)));

$res[2] = ereg_replace('url=(.*)','\1',$res[2]);

return $res[2];

}

}


$login = new nico_login($mail,$passwd);

//レスポンスを表示ここから

print"

";
print_r($login->res_arr);
print"
";

//レスポンスを表示ここまで

//URL表示

print $login->get_video_url($mov_id);

?>

PHPでニコニコ動画の動画URLを取得する。 - PHPに惚れました。

このコードを、いろいろ改変してみて

コメントを取得するメソッドを追加してみた。

<?php

$mov_id="sm500873";   //動画ID sm500873など

$mail="@xxx.com";     //ニコニコのメールアドレス
$passwd="pass";   //ニコニコのパスワード

Class nico_login{
  var $user_session;   //ユーザーセッションを格納
  var $res_arr;        //ログイン時のレスポンスを格納

  function __construct($mail,$passwd){    //コンストラクタ
    $url = "https://secure.nicovideo.jp/secure/login?site=niconico";
    $data = array("next_url" => '',"mail" => $mail,"password" => $passwd,"submit" => "",); //POSTの設定
    $data = http_build_query($data);
	
    $option = array('http' => array('method' => 'POST','content' => $data));
    $context = stream_context_create($option); //contextの作成
    $fp = @fopen($url, 'rb', false, $context); //streamを開く
    $response = @stream_get_meta_data($fp); //streamからmetaデータの取得

    preg_match('(user_session=[a-z0-9_]+)',$response[wrapper_data][8],$a);

    $this->res_arr=$response;		
    $this->user_session=$a[0];
  }
	
  function get_video_url($video_id){
	
    $context = stream_context_create(array('http'=>array('method'=>'POST','header'=>"Content-type: text/xml\r\nCookie:".$this->user_session.";"))); 
    $res = split("&",urldecode(file_get_contents('http://www.nicovideo.jp/api/getflv?v='.$video_id,false,$context))); 
		
    $res[2] = ereg_replace('url=(.*)','\1',$res[2]);
	$res[3] = ereg_replace('url=(.*)','\1',$res[3]);
	$res[4] = ereg_replace('url=(.*)','\1',$res[4]);
	
	
    return $res;
  }
  
    function access_video_url($video_id){
	
    $context = stream_context_create(array('http'=>array('method'=>'GET','header'=>"Content-type: text/xml\r\nCookie:".$this->user_session.";"))); 
    $res = split("&",urldecode(file_get_contents('http://www.nicovideo.jp/watch/'.$video_id,false,$context))); 
		

  }
  
  
  function get_comment($ms,$user_id,$threadID){
	
	echo $ms,"\n";
	echo $user_id,"\n";
	echo $threadID,"\n";
	
	$postdata = "<thread user_id=\"";
	$postdata .=  $user_id . "\" res_from=\"-1000\" version=\"20061206\" thread=\"";
	$postdata .= $threadID . "\" />";
	
	
	echo $postdata,"\n\n\n";
	
	$context = stream_context_create(array('http'=>array('method'=>'POST','header'=>"Content-type: text/xml\r\nCookie:".$this->user_session
	.";\r\n"."Content-Length: " . strlen($postdata) . "\r\n\r\n".$postdata."\r\n")));
	
	print_r($context);
	
    $res = file_get_contents($ms,false,$context);
		
    return $res;
  }
}


$login = new nico_login($mail,$passwd);

//レスポンスを表示ここから
print"<pre>";
print_r($login->res_arr);
print"</pre>";
//レスポンスを表示ここまで

$login->access_video_url($mov_id);


//表示
$items = $login->get_video_url($mov_id);
echo $items , "<br /><br />\n\n";

foreach ($items as $item) {

	echo $item , "<br />\n";
}
echo "--------------------<br />";


$items[4] = split('=', $items[4]);
$items[5] = split('=', $items[5]);
$items[0] = split('=', $items[0]);

$comments = $login->get_comment($items[4][1],$items[5][1],$items[0][1]);

print_r($comments);

?>

テキトーに書きすぎて読みにくいソースだが勘弁してくれ。

このプログラムは再ログインしない限りセッションが維持できるので連続してコメントを取得できる。


つかれた。(早っ)今日はこの辺で。

もっといい方法があったら教えてください。(ソースください)

php勉強中php勉強中 2010/03/24 00:57 google先生から「php ニコニコ動画 コメント取得」でたどり着きました。

ちょうどphpでのコメント取得方法を探していたので、
ご参考にさせていただきたいとおもったのですが、
公開しているソースを実行したところ、下記エラーがでました。
原因わかりますでしょうか?

68行目:Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in 〜

お時間あるときでよいので、教えていただければ幸いです。

AnitanAnitan 2010/10/26 17:07 こんにちは
php勉強中さんのと同じエラーが出てます。
ソースの修正お願いできるのでしょうか?

追記:ローカル環境でテストしましたが、こういったエラーが出ませんでした、どうやら鯖側限定のようである。
一応仮定なのですが、これは外部ツールの使用を防ぐため、ニコ側の対策なのでしょうか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証