2010年6月6日日曜日
[PHP][cURL] ニコニコ生放送のコメント取得
・デバックを取りながらやるとわかりやすいと思います。
・ソースはコピーペースとでメモ帳などに貼り付けてみたほうがみやすいです。
・ proxy接続の場合はCURLOPT_PROXY等でGoogleに投げてみてください。
・ソースコードの悪い部分があったら指摘していただけると助かります。
========================================
<html>
<head>
<!-- <meta http-equiv="Refresh" content="0"> -->
</head>
<?php
$CookieFile = "cookie.txt";
$lv = ""; // lv*********
$login_url = "https://secure.nicovideo.jp/secure/login?site=niconico";
$getflv_url = "http://live.nicovideo.jp/api/getplayerstatus?v=".$lv;
// mail address and password
$param = Array("mail"=>"", "password"=>"");
// Login
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, $CookieFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_exec($ch);
curl_close($ch);
// GetFlv
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $getflv_url);
curl_setopt($ch, CURLOPT_COOKIEFILE, $CookieFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($ch);
curl_close($ch);
if(preg_match("/(<end_time>)/", $output)){
print("この放送は終了しています!<br>\n");
}
else if(preg_match("@(<code>closed</code>)@", $output)){
print("この放送は終了しています。<br>\n");
}
else if(preg_match("@(<code>comingsoon</code>)@", $output)){
print("この放送はまだ始まっていません。<br>\n");
}
else if(preg_match("@(<code>notfound</code>)@", $output)){
print("not found<br>\n");
}
preg_match("/(<thread>)([0-9]+)/", $output, $thread);
preg_match("/(<addr>)([^<]+)/", $output, $ms);
preg_match("/(<port>)([0-9]+)/", $output, $port);
$MXML = "<thread thread=\"{$thread[2]}\" version=\"20061206\" res_form=\"-1\">\0";
$fp = fsockopen($ms[2], $port[2], $errno, $errstr, 1);
$comment = "";
$StartTime = time();
$flag = FALSE;
if($fp){
fwrite($fp, $MXML);
while (TRUE){
$buf = fread($fp, 65535);
$comment .= $buf;
if($comment && !$flag){
$flag = TRUE;
$EndTime = time();
}
if(time() - $EndTime >= 5){break;}
// Time Outが60secなので55sec以上立つとループから抜ける
else if(time() - $StartTime >= 55){break;}
}
}
fclose($fp);
// $commentの中に文字列が入っているので、これを使用用途によって変える
print($comment);
?>
</html>
========================================
以上のソースコードはBSDライセンスです。
Copyright (C) 2010 raisana
・参考サイト
PHP-CLIでニコ生コメントビューア
ニコニコ動画API: getflvとコメントの取得
登録:
コメントの投稿 (Atom)
初めまして。
返信削除ニコニコのコメントを取得したくて
こちらの記事を使わせて頂きました。
どうもありがとうございます。
色々試したのですが
$buf = fread($fp, 65535);
この部分で取得に時間がかかって、毎回504Errorとなってしまいつまずいてしまいました。
いきなりのご質問で大変恐縮ですが、ご回答頂ければ幸いです。
初心者でこちらの情報の何を提示すれば良いかも把握しておりませんので、
情報が足りなかったら済みません。