Googleに仕様変更があったみたいなので、Googleの検索結果に他の検索エンジンへのリンクを追加するユーザスクリプトを修正した

[追記1-1 2012 Mar. 03rd 04:00ごろ]
ありえないミスを発見したので修正。
ついでにこれとは関係ない別のスクリプトにダメだし食らったので、反省がてら色々修正。

それとコメントに応えるために記述追加。
[/追記1-1]

久々の依頼

Googleの仕様変更があったようで公開してたスクリプトが動かなくなっていたようですね。
修正の依頼が来ました。
こんな微妙な出来のものでも使ってくれている人が居て喜ばしいので頑張って修正してみました。

使い方

基本的なことは以前のものと同じなので当時の記事を読んでください。
今回は Sleipnir 2.9.9(+IE9)、Chrome 18.0.1025.45 beta-m、Firefox 10.0.2、Firefox 3.6.27 で動作確認しました。*1


[追記1-2 2012 Mar. 03rd 04:00ごろ]
設定の部分の表記が少し変わっていますが、下のコードの例を見れば大体分かるかと。
[/追記1-2]
設定も基本的に変わっていませんが、faviconのところは今まで通りにfaviconのパスを直接記述以外に、関数での指定も出来るようになりました。*2
GoogleFavicon APIを使っています。

getFavicon("twitter.com")
  • 前回と違い検索結果ページから別のワードで検索した場合には対応できてるはず。相変わらずGoogleトップページからの検索の場合には対応してないですが大抵検索バーから使うだろうし気にしない。
    • そして想定どおりに動かなくても気にしないw


[追記1-3 2012 Mar. 03rd 04:00ごろ]
コメントに応えてみた。
コード中の以下の記述の箇所の文頭の"//"を消せばおkなはず。

//q_elem = d[gebi]("resultStats");
//q_elem.style.borderTop = "none";
//d[gebi]("ab_ctls").style.marginTop="-32px";

q_elem = d[gebi]("resultStats");
q_elem.style.borderTop = "none";
d[gebi]("ab_ctls").style.marginTop="-32px";

例示された画像で検索結果の総件数と秒数が違う場所にあるのは他のスクリプトのせいなのか、画像作成時のミスなのか。
後者だということを前提に書いたので、もし前者だと希望通りに動かないかも。

[/追記1-3]

// ==UserScript==
// @name          Other Search Engine Link on Google+
// @namespace     http://d.hatena.ne.jp/barrackdo/
// @include       http*://*google.co*/search?*q=*
// @include       http*://www.google.com/webhp?*#*q=*
// @include       http*://www.google.co.jp/*#*q=*
// @include       http*://www.google.co.jp/hws/search?
// ==/UserScript==

(function(d, gebi, gebt, ni) {

//d.addEventListener('DOMContentLoaded', function(){

	var array = [
		[1, "Twitter", getFavicon("twitter.com"), "http://search.twitter.com/search?q=\{searchTerms\}", true],
		[1, "Yahoo!J", getFavicon("www.yahoo.co.jp"), "http://search.yahoo.co.jp/search?ei=UTF-8&fr=yjdnqp&p=\{searchTerms\}", true],
		[1, "bing", getFavicon("www.bing.com"), "http://www.bing.com/search?q=\{searchTerms\}&go=&form=QBLH&qs=n&sk=", true],
		[1, "Wikipedia", getFavicon("ja.wikipedia.org"), "http://ja.wikipedia.org/w/wiki.phtml?search=\{searchTerms\}", true],
		[1, "amazon", getFavicon("www.amazon.co.jp"), "http://www.amazon.co.jp/exec/obidos/external-search/250-0880593-9671458?mode=blended&tag=sleipnir0a-22&field-keywords=\{searchTerms\}", true],
		[1, "YouTube", getFavicon("www.youtube.com"), "http://www.youtube.com/results?search_query=\{searchTerms\}&search_sort=video_date_uploaded", true],
		[1, "ニコ動", getFavicon("www.nicovideo.jp"), "http://www.nicovideo.jp/search/\{searchTerms\}", true]
	];



var timer = setInterval(function(){
	if(!d[gebi]("oselogd")) {
		if(d[gebi]("gfn")) {
			setLink();
			//clearInterval(timer);
		}else if(d[gebi]("pnirRight")) {
			setLink();
			//clearInterval(timer);
		}
	}
	changeLink();
}, 1000);

function setLink() {
	var f = d.forms;
	if(f[ni]("gs") || f[ni]("f")) {
		var dv = d.createElement("div");
		dv.id = "oselogd";
		
		var q, q_elem;
		if(f[ni]("gs")) {
			q = f[ni]("gs").elements[ni]("q").value;
			
			dv.style.padding = "0.5em 0 0.5em 0em";
			dv.style.borderTop = dv.style.borderBottom = "1px solid #dedede";
			dv.style.marginBottom = "0.25em";
		}else if(f[ni]("f")) {
			q = f[ni]("f").elements[ni]("q").value;
			d[gebi]("gbqfq").style.height = "20px";
			
			dv.style.padding = "0.5em 0 0.5em " + LinksPos();
			dv.style.margin = "0";
		}
		if(location.pathname === "/hws/search") {
			q_elem = d[gebi]("pnirRight");
		}else {
			if(d[gebi]("appbar")){
				q_elem = d[gebi]("appbar");
				q_elem.style.borderTop = "1px solid #dedede";
			}else if(d[gebi]("resultStats")){
				q_elem = d[gebi]("resultStats");
			}
			//q_elem = d[gebi]("resultStats");
			//q_elem.style.borderTop = "none";
			//d[gebi]("ab_ctls").style.marginTop="-32px";
		}
		
		var oselog = [];
		
		for(var i = 0; i < array.length; i++) {
			
			if(array[i][0] > 0) {
				oselog[i] = d.createElement("a");
				if(array[i][4]) {
					oselog[i].href = array[i][3].replace("\{searchTerms\}", encodeURIComponent(q));
				}else {
					oselog[i].href = array[i][3].replace("\{searchTerms\}", q);
				}
				var tmp_link = "";
				if(array[i][0] % 2 === 1) {
					tmp_link += "<img src=\"" + array[i][2] + "\" width=\"16\" height=\"16\" style=\"border:none;\">";
				}
				if(array[i][0] / 2 >= 1) {
					tmp_link += array[i][1];
				}
				oselog[i].innerHTML = tmp_link;
				oselog[i].target = "_blank";
				oselog[i].style.marginLeft = "0.5em";
				oselog[i].style.outline = "none";
				dv.appendChild(oselog[i]);
			}
		}
		q_elem.parentNode.insertBefore(dv, q_elem);
	}
	
}

//}, false);

function changeLink() {
	var q = d[gebi]("gbqfq").value;
	for(var i = 0; i < q.length; i++) {
		if(q[i].split("=")[0] === "q"){
			q = q[i].split("=")[1].replace(/\+/g, " ");
			break;
		}
	}
	
	var o = d[gebi]("oselogd");
	var a = o[gebt]("a");
	for(var i = 0; i < array.length; i++) {
		if(array[i][4]) {
			a[i].href = array[i][3].replace("\{searchTerms\}", encodeURIComponent(q));
		}else {
			a[i].href = array[i][3].replace("\{searchTerms\}", q);
		}
	}
	o.style.padding = "0.5em 0 0.5em " + LinksPos();
}

function LinksPos() {
	var lft = "10em";
	var tbl = d[gebt]("table");
	for(var i = 0; i < tbl.length; i++) {
		if(tbl[i].className === "gssb_c") {
			lft = tbl[i].style.left;
			break;
		}
	}
	return lft;
}

function getFavicon(uri) {
	return "http://www.google.com/s2/favicons?domain=" + encodeURIComponent(uri);
}

})(document, "getElementById", "getElementsByTagName", "namedItem");

*1:Firefox 3.6.27 の調子がちょっと悪くて更新版のテスト出来なかった。問題ないはずだけど

*2:正確に言えば前のバージョンの時だって使えたんですけどね。そこまで頭が回らなかったから書いてなかったw