Hatena::Groupgeneration1991

gigi-net@G91

2009-05-11

[][]ニコニコ動画のランキングにそれっぽくはてブを付加するGreasemonkeyスクリプト書いてみた 13:49

http://gyazo.com/b12fd3eb3ff9a2b791869e3a47c7e4ee.png

こんな風になる。パっと見どこが変わっているかわかりにくいかも。

以前書いた物のリメイクです。

ニコニコ動画のランキングにはてなブックマーク数を付加するGreasemonkeyスクリプト - 5.1さらうどん


以前は技術不足で画像を取って来ることぐらいしかできなかったけど、今回ははてブAPIを使ってJSON形式で取得して付加してみた。

全てのランキングで使用できます。

たまたま朝早く起きて、思い立って作ってみただけなので全然手間はかかっていません。


インストール

userscript.orgからどうぞ。

Add Hatebu on NicoRank for Greasemonkey


技術的なおはなし

GM_xmlhttpRequestを使ってはてブAPIから取得したJSONをevalでオブジェクト化するのが上手く行かずに詰んだ。

どうやら、引数にコールバック関数を指定していたのが敗因らしい。


最初はfor文でまとめて読み込んでいたのですが、読み込み完了までの時間が物によって異なり、読み込まれた順に上から配置されてしまうので、ブクマ数と該当動画がずれるという現象が起こったw

しかたないから、前の動画のはてブ情報をロードするまで次の物をロードしないようにしてみた。

このため、下の方にはてブが表示されるのが若干時間がかかるみたいです。


ソースコード

// ==UserScript==
// @name           Add Hatebu on NicoRank
// @namespace      http://gigi-net.net
// @description    ニコニコ動画のランキング上に被はてブ数を表示
// @include        http://www.nicovideo.jp/ranking/view/*
// @include        http://www.nicovideo.jp/ranking/res/*
// @include        http://www.nicovideo.jp/ranking/mylist/*
// ==/UserScript==
//Xpath取得関数
function GetXpath(query) {
    var results = document.evaluate(query, document, null, 7, null);
    var nodes = new Array();
    for(var i=0; i<results.snapshotLength; i++){
        nodes.push(results.snapshotItem(i));
    }
    return nodes;
}
var api_url ="http://b.hatena.ne.jp/entry/json/?url=";
var i=0;
//はてブ数出力関数
ShowHB = function(x){
	try{
		count = eval(x.responseText).count;
		url =eval(x.responseText).entry_url;
	}catch(e){
		count = 0;
		url ="";
	}
	xpath = "/html/body/div/div/div/div/table/tbody/tr/td[2]/p/a/strong";
	res = GetXpath(xpath);
	title = document.getElementsByTagName("h3");
	if(count>0){
		res[i].parentNode.parentNode.innerHTML +=" はてブ:<a href='"+url+"'>"+"<b>"+count+"</b></a>";
	}else{
		res[i].parentNode.parentNode.innerHTML +=" はてブ:<u><b>"+count+"</b></u>";
	}
	i++;
	if(i<res.length){
		LoadHB();
	}
};
var xpath = "/html/body/div/div/div/div/table/tbody/tr/td[2]/p/a/strong";
var res = document.evaluate(xpath, document, null, 7, null); 
var title = document.getElementsByTagName("h3");
//ブックマーク数ロード関数
function LoadHB(){
	var json_url = api_url + encodeURIComponent(title[i].firstChild.href);
	GM_xmlhttpRequest({
  		method:"GET", 
  		url:json_url,
  		onload:function(x){x.onload=ShowHB(x)}
	});
}
LoadHB();