んだろうね。解説する気が全く起きねえ。

この度ありがたいことに、ニコニコ静画に投稿している「クソ妄想垂れ流し」が10万再生突破しました。

そんでもってコレを期に今までいただいたコメント全部に返信しようと思ったわけであります。

で、コメントを一括取得するプログラムを作りました。
とは言ってもニコニコ静画のAPIを使うだけのものだからプログラムと言えるのかね?

以下、ソース
function getInsComData() {

// 1.ログイン
$data = array(‘mail_tel’ => ‘xxx@xxx.xxx’, ‘password’ => ‘xxxxxx’);
$data = http_build_query($data);
$context = stream_context_create(array(
‘http’ => array(
‘method’ => ‘POST’,
‘header’ => implode(“\r\n”, array(
‘Content-Type: application/x-www-form-urlencoded’,
‘Content-Length: ‘ . strlen($data)
)
),
‘content’ => $data
)));
$res = file_get_contents(‘https://secure.nicovideo.jp/secure/login?site=niconico’, false, $context);

// 2.ログインの結果からセッションを取得
$cookies = array();
foreach ($http_response_header as $v) {
@list($key, $value) = explode(“:”, $v);
if ($key == “Set-Cookie”) $cookies[] = $value;
}

$sessionInfo = preg_replace(“/(user_session=user_session_[a-z0-9_]+;)/”,”$1 Max-Age=-1″,$cookies[2]);
$header = array(
‘Content-Type: application/x-www-form-urlencoded’,
‘Cookie: ‘.$sessionInfo
);
$context = stream_context_create(array(
‘http’=>array(
‘method’ => ‘GET’,
‘header’ => implode(“\r\n”,$header),
‘content’ => $data
)));

// 3.エピソード一覧を取得
$xpath = $this->getXPath(‘http://seiga.nicovideo.jp/api/manga/episodes?id=xxxxx’, $context);
$episodeInfoList = $xpath->query(“//episode”);

foreach ($episodeInfoList as $wk) {

// エピソード名とtheme_id
$title = $wk->getElementsByTagName(“title”)->item(0)->nodeValue;
$theme_id = $wk->getElementsByTagName(“theme_id”)->item(0)->nodeValue;

// 4.threadIDを取得
$xpath = $this->getXPath(‘http://seiga.nicovideo.jp/api/theme/data?theme_id=’.$theme_id, $context);
$thread_id = $xpath->query(“//thread”)->item(0)->nodeValue;

// 5.コメントを取得
$xpath = $this->getXPath(‘http://msg01.seiga.nicovideo.jp/api/thread?version=20090904&res_from=-1000&thread=’.$thread_id, $context);
$chats = $xpath->query(“//chat”);

foreach ($chats as $chat) {
$date = date(“Y-m-d H:i:s”,(int)$chat->getAttribute(“date”));
$comment = $chat->nodeValue;
printf(“%s,%s,%s,%s
“, $title, $date, $comment);
}
}

// 6.ログアウト
file_get_contents(‘http://seiga.nicovideo.jp/logout’, false, $context);

}
PHPで書いてるけど当然の如く他の言語で書き直せば使えますぜ
詳しくは後日書く(書ければ書く)けれど、フローは

1.ログインする。
2.1の結果からセッション情報を取り出す。
3.API使って漫画エピソード一覧を取得
4.API使って各エピソードのthreadID取り出す
5.API使ってコメントを抜き出す
6.ログアウト

こんな感じ。汚いソースよな

言い訳をするけど、API調査で色々コピペしたままリファクタリングしなかったのと、この記事を書くように見せられない部分を消したりとか編集した結果やねん。

まあ所詮100行に満たないコードよ。読めばわかる。

途中にある$this->getXPathはfile_get_contentsしてxpathに変えるだけの関数だから、適当に補完しといて