すがブロ

sugamasaoのhatenablogだよ

ニコニコ動画からコメントを引っこ抜く Greasemokey(未完成)を作ったよ

なんとかコメントを引っこ抜くところまでできた

よく考えると JavaScript でまともにプログラムしたの初めてかもしれない。
グリモン同士で変数の衝突が起きるかよくわかんないんだけど、こういう風に書けば自分の作ったスクリプトで余計な変数を汚さずにすむのかな?かな?
やってることは簡単で、ニコニコ動画の動画ページに入ったときにコメント一覧を取得してHTMLに埋め込むだけ*1。んで、今後の作業としてはHTMLに出力する前に色々加工する作業が残ってる。
あー、ちなみに、 URL とか thead_id を取得する正規表現あたりは id:khiker のソースからパクりました><

(function() {
    /* get thread_id request */
    var getRequest = function() {
	var url = 'http://www.nicovideo.jp/api/getflv?v=' + location.href.replace( /http.*?watch\/(.*)$/g, "$1" );
	GM_xmlhttpRequest({
	    method : "GET",
	    url    : url,
	    onload : getCommentList,
	    onerror : showErrorMessage
	});
    }

    /* comment list request */
    var getCommentList = function(res) {
	var threadId = unescape(/thread_id\=(.*?)\&/.exec(res.responseText)[1]);
	var url =  unescape(/ms\=(.*?)\&/.exec(res.responseText)[1]);

	GM_xmlhttpRequest({
	    method  : "POST",
	    headers : {"Content-type" : "text/xml"}, 
	    url     : url,
	    data    : '<thread res_from="-500" version="20061206" thread="' + threadId + '" />',
	    onload  : function(response){
		createCommentList(response.responseText);
	    },
	    onerror : showErrorMessage
	});
    }

    /* error message */
    var showErrorMessage = function(response) {
	alert("xmlhttpRequest error\n"+"status="+response.status+"\nstatusText="+response.statusText);
    }

// この関数は仮の姿。今後ここをいじくり回す予定
    /* create comment list.  */
    var createCommentList = function(list) {
	var t = document.getElementById('WATCHHEADER');
	var div = document.createElement("div");
	div.style.border = "solid";
	div.innerHTML = list;
	t.getElementsByTagName('table')[0].appendChild(div);
    }

    // start script
    getRequest();
})();

グリモンも xmlhtmlRequest もほぼ初めて使った(hello world くらいしかやったことなかった)んだけど、なんとなくソースを書くのに違和感があった。
なぜかと考えたんだけど、普通メソッドなり関数なりをコールする際にはほとんどの場合において自分から明示的にコールするわけだけど、 xmlhttpRequest を使って書くとコールバック関数を使って通信OKだった場合、NGだった場合の処理を書いていく必要がある。
そのコールバック関数からさらに処理を書く、という感じの流れがなんか主導が自分では無い感じがして違和感に繋がっているのだと思う。や、非同期通信なので当たり前といえば当たり前なのだけど><

いやしかしね

なんというか、とてもダサイ書き方な気がしてならない><
最後の関数呼び出しは無くして、 getRequest 関数自体を関数で作成するのをヤメてベタ書きにした方が見た目は真っ当かな? いやしかし、それはそれでベタ書きなのをなんとかしたくなるだろうし・・・。

それにしてもニコ動・・・恐ろしい子!

前回と同じ轍は踏まないように、違う動画を再生しながらコードを書いていたわけですよ。
気がついたら 男女男男男女男女(゜∀゜)o彡゜フウゥッ♪フウゥッ♪ と繰り返していましたが、幸いにも前回とは違う動画を見ていたおかげで全く中毒性は感じないですね。

2008/2/6 追記

頂いたコメントを参考に、リクエストを一回ですむように修正したました→http://d.hatena.ne.jp/seiunsky/20080206/1202319232

*1:しかも何の加工もしていないので、XML形式をそのまま埋め込んでる形になっている