帮助百度读中文

By tomchen1989 Last update Jul 15, 2009 — Installed 1,642 times.

There are 19 previous versions of this script.

// ==UserScript==
// @name           帮助百度读中文
// @namespace      http://emule-fans.com/
// @author         tomchen1989
// @homepage       http://emule-fans.com/baidu-chinese-helper/
// @description    帮助百度读中文,消灭链接显示乱码,消灭所有百度广告和竞价排名结果,添加其他搜索引擎链接
// @include        http://www.baidu.com/s*
// @include        http://www.baidu.com/baidu*
// @version        0.7.1
// ==/UserScript==

/*
This userscript(/Greasemonkey Script) is for the chinese search engine Baidu.com.

本脚本能够帮助百度读中文,消灭链接显示乱码,消灭所有百度广告和竞价排名结果,添加其他搜索引擎链接

具体介绍、使用方法、功能、注意事项、截图等等请见:http://emule-fans.com/baidu-chinese-helper/

更新:
ver 0.1 @ 2009-6-26
初始版本。
ver 0.2 @ 2009-6-27
缩减代码,修正一些bug,兼容BaiduMonkey脚本,兼容其他浏览器。
ver 0.3 @ 2009-6-29
兼容baidu++、baidu_ad等脚本,恢复无须隐藏的一些文字信息。
ver 0.4 @ 2009-6-30
乱码变中文和隐藏广告两功能分离,修正进行某些搜索时误隐藏搜索框或链接decode错误的bug。
ver 0.5 @ 2009-7-2
修正与BaiduMonkey、baidu++三者同时使用的bug,修正GBK等编码的URL误decode的bug,新增其他搜索引擎链接功能。
ver 0.6.1 @ 2009-7-3
修正搜狗搜索中文字词的bug,搜索引擎增至14个。
ver 0.7.1 @ 2009-7-8
无关键词时链接变普通文字,兼容新版baidu++1.0.0。
*/

(function () {

//设置。本脚本为轻型脚本,不打算使用GM setValue或cookies,请手动在这里修改搜索引擎链接设置
//想将其他搜索引擎设为默认显示的话,请将“,isdefault:true”移到那个搜索引擎的项的大括号结尾;另外您也可增/删项目,但要注意格式
var searchengines = {
	google:{name:"Google英文",url:"http://www.google.com/search?hl=en&q={searchterm}",isdefault:true},
	googlecn:{name:"谷歌中文",url:"http://www.google.cn/search?hl=zh-CN&q={searchterm}"},
	wikipedia:{name:"Wikipedia英文",url:"http://en.wikipedia.org/wiki/Special:Search?search={searchterm}"},
	wikipediazh:{name:"中文维基百科",url:"http://zh.wikipedia.org/w/index.php?title=Special:Search&search={searchterm}"},
	twitter:{name:"Twitter",url:"http://search.twitter.com/search?q={searchterm}"},
	fanfou:{name:"饭否",url:"http://fanfou.com/q/{searchterm}"},
	yahoo:{name:"Yahoo英文",url:"http://search.yahoo.com/search?p={searchterm}"},
	yahoocn:{name:"雅虎中文",url:"http://one.cn.yahoo.com/s?p={searchterm}"},
	bing:{name:"Bing英文",url:"http://www.bing.com/search?mkt=en-US&q={searchterm}"},
	bingcn:{name:"必应中文",url:"http://cn.bing.com/search?q={searchterm}"},
	flickr:{name:"Flickr",url:"http://www.flickr.com/search/?q={searchterm}"},
	dictcn:{name:"Dict.cn海词",url:"http://dict.cn/{searchterm}.htm"},
//	baidu:{name:"百度",url:"http://www.baidu.com/s?ie=utf-8&word={searchterm}"},
	sogou:{name:"搜狗",url:"http://www.sogou.com/web?query={searchterm}",noencode:true},
	youdao:{name:"有道",url:"http://www.youdao.com/search?q={searchterm}"}
};

//==函数==
//隐藏广告和竞价排名
function removeAdds() {
	try {
		if (!baidupp) {
			var tabless = document.getElementsByTagName("table");
			var len = tabless.length;
			var firstResultOcc = false;
			for (var i=0; i<len; i++) {
				var thistable = tabless[i];
				if (thistable.align=="right"){//右栏
					thistable.id = "sidebar";
					if (thistable.innerHTML!==""){
						var innertd = thistable.getElementsByTagName("td")[0];
						if (findEva(innertd,"a","a.href.substr(0,23)==\"http:\/\/tieba.baidu.com\/\"")) {
							var tiebatb = findEva(innertd,"a","a.href.substr(0,23)==\"http:\/\/tieba.baidu.com\/\"").parentNode.parentNode.parentNode.parentNode;//贴吧链接所在table
							tiebatb.id = "tiebatable";
						}
						var children = innertd.childNodes;
						for(var t=0; t<children.length; t++) {
							var dell = children[t];
							if(dell.style&&dell.id!="tiebatable"){
								dell.style.display="none";
							}
						}
					}
				} else
					if (findEva(thistable,"a","a.innerHTML==\""+unescape("%u767E%u5EA6%u5FEB%u7167")+"\"")){//真正搜索结果,“百度快照”escape防止编码问题
						if (!firstResultOcc) {//第一个
							firstResultOcc = true;
							var start = thistable;
							if (baidumonkey){
								start = thistable.parentNode;//BaiduMonkey的真正搜索结果被div包裹,取得那个div
							}
							for (var del=start.previousSibling; del.id!="sidebar"; del=del.previousSibling) {
							}
							for (del=start.previousSibling; del.id!="sidebar"; del=del.previousSibling) {
								if(del.style&&del.tagName.toLowerCase()!="ol"&&del.tagName.toLowerCase()!="p"){//隐藏右栏与第一个真正搜索结果之间所有可以隐藏的元素,保留ol(百度计算器)、p(文字信息)
									del.style.display="none";
								}
							}
						}
					}
			}
		}
	} catch (e) {
//		alert("removeAdds bug: " + e);
	}
}

//乱码变中文
function changeToZh(){
	try {
		var tdss = document.getElementsByTagName("td");
		for (var d=0; d<tdss.length; d++) {
			var thistd = tdss[d];
			if (thistd.className=="f"&&findEva(thistd,"a","a.innerHTML==\""+unescape("%u767E%u5EA6%u5FEB%u7167")+"\"")) {
				var font = findEva(thistd,"font","font.size==-1");
				var urllinefont = findEva(font,"font","font.color==\"#008000\"");
				var urlline = urllinefont.innerHTML;
				var kpos = urlline.lastIndexOf("K");
				var spacepos = urlline.lastIndexOf(" ",kpos);
				var orurl = thistd.getElementsByTagName("a")[0].href;
				var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, "");
				if (rslt !== null && Number(rslt[1]) <= 6.0) {
					orurl = escape(orurl);
				}
				try {
					orurl = decodeURIComponent(orurl);//这里如果对URL进行decode时throw出malform错误的话,可能是GBK等URL编码,百度已转换,所以不向下执行
					var pos = orurl.indexOf(":\/\/")+3;
					orurl = orurl.substr(pos);//把链接删去前缀“xxxx://”
					if (orurl.length>41) {
						orurl = orurl.substring(0,41)+" ...";//获得长度大于41的话截取前41并加上省略号,41似乎是百度默认
					}
					var niceurl = orurl;
					var niceurlline = niceurl+urlline.substr(spacepos);
					urllinefont.innerHTML = niceurlline;
				} catch (e1) {
//					alert("decodeURI malform: " + e1);
				}
			}
		}
	} catch (e) {
//		alert("changeToZh bug: " + e);
	}
}

//添加其他搜索引擎链接
function addOtherSEs() {
	try {
		var keywordinput = document.getElementsByName("wd")[0];
		var initkeyword = keywordinput.value;
		var oseoptions = "";
		for (var se in searchengines) {
			if (searchengines.hasOwnProperty(se)) {
				oseoptions += "<option value=\""+searchengines[se].url+"\"";
				if (searchengines[se].isdefault) {
					oseoptions += " selected=\"selected\"";
				}
				if (searchengines[se].noencode) {
					oseoptions += " class=\"noencode\"";
				}
				oseoptions += ">"+searchengines[se].name+"</option>";
			}
		}
		var changeSeLink = function() {
			var keyword = document.getElementsByName("wd")[0].value;
			var osesel = document.getElementById("ose_sel");
			var thisoption = osesel.options[osesel.selectedIndex];
			var url;
			if (thisoption.className=="noencode") {
				url = thisoption.value.replace(/\{searchterm\}/, keyword);
			} else {
				url = thisoption.value.replace(/\{searchterm\}/, encodeURIComponent(keyword));
			}
			var osea = document.getElementById("ose_a");
			if (keyword==="") {
				osea.removeAttribute("href");
			} else {
				osea.href = url;
			}
			document.getElementById("ose_kw").innerHTML = keyword;
		};
		var ht = "<label for=\"ose_sel\" id=\"ose_lb\">使用</label><select id=\"ose_sel\" style=\"height:18px;font-size:12px;\">"+oseoptions+"</select><a id=\"ose_a\" href=\"\" target=\"_blank\"> 搜索【<span id=\"ose_kw\" style=\"color:red;\">"+initkeyword+"<\/span>】 <\/a>";
		var bdhomea = findEva(document,"a","a.innerHTML==\"把百度设为主页\"");
		var ose = document.createElement("span");
		ose.id = "ose_span";
		ose.innerHTML=ht;
		bdhomea.parentNode.insertBefore(ose, bdhomea);
		bdhomea.style.display="none";
		addEventSimple(keywordinput, "keyup", changeSeLink);
		addEventSimple(window, "load", changeSeLink);
        window.setTimeout(function(){
			addEventSimple(document.getElementById("ose_sel"), "change", changeSeLink);
        }, 100);
	} catch (e) {
//		alert("addOtherSEs bug: " + e);
	}
}

//返回元素el中第一个标签为tag且满足条件evaStr的节点,如果找不到即返回false
function findEva(el,tag,evaStr){
	var tags = el.getElementsByTagName(tag);
	var has = false;
	var len = tags.length;
		for (var i=0; i<len; i++) {
			eval("var "+tag+"=tags[i]");
			if (eval(evaStr)){
				has = true;
				return eval(tag);
			}
		}
	if (has === false) {
		return false;
	}
}

//跨浏览器的绑定事件
function addEventSimple(obj, evt, fn){
	if (obj.addEventListener) {
		obj.addEventListener(evt, fn, false);
	}
	else
		if (obj.attachEvent) {
			obj.attachEvent('on' + evt, fn);
		}
}

//==运行==
changeToZh();
addOtherSEs();
addEventSimple(window, "load", function() {
	baidupp = findEva(document,"a","a.innerHTML==\""+unescape("%5B%u8BBE%u7F6Ebaidu++%5D")+"\"") ? true : false;//检查是否使用baidu++
	baidumonkey = findEva(document,"div","div.className==\"bm_MultiColDiv\"") ? true : false;//检查是否使用BaiduMonkey
	removeAdds();
});

})();