すがブロ

sugamasaoのhatenablogだよ

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

リクエストを一回だけですませるように修正した

id:sore_0 からこんなコメントをもらいました

Sore_0
まだ未完成ということなので、参考資料置いておきますね。
http://blog.fulltext-search.biz/articles/2007/10/15/nicovideo-hacks

動画ページからであれば、GM_xmlhttpRequestは一回で済みますよー。

というわけで修正した

(function() {
    var flvplayer = unsafeWindow.document.getElementById('flvplayer');
    var flvVariable = decodeURIComponent(flvplayer.GetVariable('o'));

    /* comment list request */
    var getCommentList = function() {
	var threadId = /thread_id\=(.*?)\&/.exec(flvVariable)[1];
	var url = /ms\=(.*?)\&/.exec(flvVariable)[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
    getCommentList();
})();

ワォ! 関数の使用が丸ごと一つ減ってとてもクールだ!

という風になるまでには以外と時間がかかってしまった

コメントで教えてもらった URL で、

$('flvplayer').GetVariable('o'); 

で色々値がとれるよーと書いてある。うん、確かに Firebug で試すと必要な値が取れそうだ。
というわけで、グリモンの方に書いてみたんだけど、うまく取れない。なぜかと考えたんだが*1、$(ID)という記法は prototype.js が用意しているシンタックスシュガーだったのですね。
じゃあこうしよう。

document.getElementById('flvplayer')

と思ったがうまく値が取れていないようだ。
グリモンについて調べていると、 unsafeWindow なるものに行き着いた。
よくわかっていないのだけど、 unsafeWindow を使って取るように修正したらうまく値を取得できるようになった。グリモンでスクリプトが実行された時点では実際の flvplayer の値が取得されていないってことか?

あと気になる点

    var flvVariable = decodeURIComponent(flvplayer.GetVariable('o'));

ここで取得している値は GET で渡すときパラメータのように、 key1=value1&key2=value2 のような形式で作られている。で、本当ならきちんとパースすべきなんだろうけど妥協して*2必要なところだけ抜き出す正規表現で対応している。
しかし、この手のパース処理って結構需要があると思うんだけど、こういうのってデファクトな処理方法って無いのだろうか。
そんなに大変な処理じゃあないと思うけど、何も考えずに書けるかと言うとそこまで簡単処理でもないと思うのだけど><

しかし真に困った事は

コメントで教えてもらった URL(http://blog.fulltext-search.biz/)で公開してるグリモンが自分の作ろうと思っていたグリモンとダダ被りであったこと><
しかも見た目的にもすげえ。おれ涙目ですね\(^o^)/

*1:prototype.js知らないのがモロバレですね!

*2:他人のソースをパクってる自分が言うのもなんだけど