Baidu Multiuser

百度马甲切换

Per 16-12-2014. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name	Baidu Multiuser
// @namespace	http://gera2ld.blog.163.com/
// @author	Gerald <[email protected]>
// @icon	http://ww2.sinaimg.cn/small/a56031a1gw1emwlbe1c8gj2097097wfa.jpg
// @version	2.0
// @description	百度马甲切换
// @homepageURL	http://geraldl.net/userjs/BaiduMultiuser
// @match	*://*.baidu.com/*
// @include	*.baidu.com/*
// @exclude http://developer.baidu.com/*
// @exclude http://web.im.baidu.com/*
// @grant GM_addStyle
// @grant	GM_getValue
// @grant	GM_setValue
// @grant	GM_xmlhttpRequest
// @grant	GM_registerMenuCommand
// ==/UserScript==

var User_Agent='Most handsome in the world',
		url_login='http://wappass.baidu.com/passport/login';
function getValue(k,d){
	var o=GM_getValue(k,'');
	if(o&&typeof o=='string') o=JSON.parse(o);
	return o||d;
}
function setValue(k,v){GM_setValue(k,JSON.stringify(v));}
function checkCookie(name){
	m=document.cookie.match(/BDUSS=(.*?)(;|$)/);
	if(m) {users[name]=m[1];saveUsers();}
	else users=null;
}
function switchUser(s,p){
	var d=new Date();if(s) d.setTime(16094e8); else s='';
	document.cookie='BDUSS='+s+';domain=baidu.com;path=/;expires='+d.toGMTString();
	if(typeof p=='function') p();
	else if(typeof p=='string') location.replace(p);
	else location.reload();
}
function initLoc(){
		gu.right=gu._right=gu.parentNode.offsetWidth-gu.offsetWidth-gu.offsetLeft;
		gu.top=gu._top=gu.offsetTop;
}
function saveUsers(){setValue('ge_users',users);}
function saveLoc(){setValue('ge_users_loc',{right:gu.right,top:gu.top});}
function checkLogIn(res){
	if(res.finalUrl.substr(0,url_login.length)==url_login)
		logIn(res.responseText);
	else GM_xmlhttpRequest({
		method:'GET',
		url:'http://www.baidu.com',
		onload:function(o){
			var m=o.responseText.match(/<span class=user-name>(.*?)<\/span>/);
			if(m) {
				checkCookie(m[1]);
				location.reload();
			} else alert('出错了!我也不知道要怎么办。。');
		},
	});
}
function logIn(src){
	var i=src.indexOf('<div id="error_area"'),j=src.indexOf('</div>',i),
			m=src.substr(i,j-i).match(/<span class="highlight">(.*?)<\/span>/),
			data={},rdata=[],form;
	if(m) alert('登录失败!'+m[1]);
	i=src.indexOf('<form action="/passport/login"');j=src.indexOf('</form>',i);
	form=src.substr(i,j-i);
	form.replace(/<input[^>]*? name="(.*?)"[^>]*? value="(.*?)"[^>]*?>/g,function(m,g1,g2){
		data[g1]=g2;
	});
	if(data['vcodestr']) {
		// 'http://wappass.baidu.com/cgi-bin/genimage?'+data['vcodestr']
		alert('需要验证码,此功能以后再说。。或者你可以休息一下再来~');
		return;
	} else {
		data['username']=i=prompt('请输入手机号/邮箱/用户名:');
		if(i===null) return;
		data['password']=i=prompt('请输入密码(用后即焚):');
		if(i===null) return;
	}
	for(i in data)
		rdata.push(encodeURIComponent(i)+'='+encodeURIComponent(data[i]));
	GM_xmlhttpRequest({
		method:'POST',
		url:'http://wappass.baidu.com/passport/login',
		data:rdata.join('&'),
		headers:{
			'User-Agent':User_Agent,
			'Content-Type':'application/x-www-form-urlencoded',
		},
		onload:checkLogIn,
	});
}
function userManage(e,p,o){
	e.preventDefault();o=e.target;e=o.parentNode;p=e.parentNode;
	if(o.tagName=='A') {
		if(e==p.firstChild) switchUser();
		else if(e==p.lastChild) {
			GM_xmlhttpRequest({
				method:'GET',
				url:url_login+'?type=1',
				headers:{
					'User-Agent':User_Agent,
				},
				onload:function(o){
					if(!o.finalUrl) {
						alert('您的运行环境不支持此脚本,可以尝试Baidu Multiuser Unsafe。');
						return;
					}
					logIn(o.responseText);
				},
			});
		} else switchUser(users[o.innerText||o.textContent]);
	} else if(o.tagName=='SPAN') {
		o=o.previousSibling;delete users[o.innerText||o.textContent];
		setTimeout(saveUsers,0);p.removeChild(e);
	}
}
function locate(l){
	if(l) {
		gu.right=l&&!isNaN(l.right)?l.right:100;
		gu.top=l&&!isNaN(l.top)?l.top:100;
	}
	gu.style.right=gu.right+'px';
	gu.style.top=gu.top+'px';
}
function mousemove(e){
	e.preventDefault();e.stopPropagation();
	var l={right:gu._right+gu.x-e.pageX,top:gu._top+e.pageY-gu.y};
	locate(l);
}
function pinUpdate(){
	if(gu.pin) {
		symbol.classList.add('ge_pin');
		symbol.setAttribute('title','固定在页面上');
		gu.style.position='absolute';
	} else {
		symbol.classList.remove('ge_pin');
		symbol.setAttribute('title','固定在屏幕上');
		gu.style.position='';
	}
}
function pin(){
	initLoc();
	if(gu.pin)	// fixed => absolute
		gu.top+=window.pageYOffset;
	else	// absolute => fixed
		gu.top-=window.pageYOffset;
	pinUpdate();
	locate();
	saveLoc();
}
function init(){
	users=getValue('ge_users',{});
	GM_registerMenuCommand('百度马甲设置',showOptions);
	GM_addStyle('\
#ge_u{display:block;padding:10px;text-align:left;}\
#ge_u .ge_h{display:none;}\
#ge_u{z-index:10006;font:normal normal 400 12px/18px 宋体;position:fixed;}\
#ge_u>span{background:white;color:blue;border-radius:3px;border:1px solid #c0c0c0;padding:2px;cursor:pointer;}\
#ge_u>div{position:relative;margin-top:3px;}\
#ge_u>div>*{position:absolute;}\
.ge_u{background:white;border:1px solid silver;box-shadow:5px 5px 7px #333;}\
.ge_u{width:120px;max-height:400px;overflow-x:hidden;overflow-y:auto;}\
.ge_u>li{position:relative;display:block;padding:2px 20px 4px 6px;}\
.ge_u>li:hover{background:lightgray;}\
.ge_u a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\
.ge_u span{position:absolute;top:0;right:0;color:white;background:#77f;border-radius:3px;margin:2px;cursor:pointer;padding:2px;}\
.ge_u span:hover{background:red;}\
.ge_sym{display:inline-block;width:7px;height:7px;border:1px solid #c0c0c0;border-radius:4px;margin-left:3px;}\
.ge_sym.ge_pin{background:#c0c0c0;}\
.ge_opt{padding:20px;border-radius:5px;}\
.ge_opt fieldset{border:1px solid silver;border-radius:5px;padding:5px;}\
.ge_opt textarea{min-height:100px;width:100%;}\
');
	gu=document.createElement('div');gu.id='ge_u';
	gu.innerHTML='<span>马甲<span class=ge_sym></span></span><div><ul class="ge_u ge_h"></ul></div>';
	gu.style.display=getValue('float','');
	ul=gu.querySelector('ul');ul.onclick=userManage;
	symbol=gu.firstChild.lastChild;
	gu.pin=!!getValue('ge_pin');pinUpdate();
	symbol.onclick=function(){setValue('ge_pin',gu.pin=!gu.pin);pin();};
	gu.onmouseover=function(e){
		if(this.contains(e.relatedTarget)) return;
		ul.classList.remove('ge_h');
		if(gu.offsetLeft+gu.firstChild.offsetLeft+ul.offsetWidth<=document.body.offsetWidth) ul.style.pixelLeft=0;
		else ul.style.pixelLeft=document.body.offsetWidth-gu.offsetLeft-gu.firstChild.offsetLeft-ul.offsetWidth;
	};gu.onmouseout=function(e){if(!this.contains(e.relatedTarget)) ul.classList.add('ge_h');};
	var d=getValue('ge_users_loc',{});if(typeof d=='string') d=JSON.parse(d);
	document.body.appendChild(gu);locate(d);gu.moving=false;
	gu.firstChild.onmousedown=function(e){
		e.preventDefault();e.stopPropagation();
		if(e.target!=gu.firstChild||gu.moving) return;gu.moving=true;
		initLoc();
		gu.x=e.pageX;
		gu.y=e.pageY;
		document.addEventListener('mousemove',mousemove,false);
	};
	gu.onmouseup=function(e){
		if(!gu.moving) return;gu.moving=false;
		e.preventDefault();e.stopPropagation();
		document.removeEventListener('mousemove',mousemove,false);
		saveLoc();
	};
	initMenu();
	popup=document.createElement('div');
	popup.className='ge_popup ge_opt';
	popup.innerHTML='\
<h3>设置 - 百度马甲切换脚本</h3>\
<fieldset><legend>马甲数据 <button id=gu_import>导入</button> <button id=gu_export>导出</button> \
<a title="复制数据到以下文本框然后点击导入即可导入数据。\n点击导出后复制数据文本即可用于导入。">(?)</a></legend>\
<textarea id=gu_data></textarea></fieldset>\
<p align=right><button id=gu_close>关闭</button></p>\
';
	document.body.appendChild(popup);
	popup.addEventListener('click',function(e){e.stopPropagation();},false);
	var t=popup.querySelector('#gu_data');
	t.onclick=function(){this.select();};
	popup.querySelector('#gu_import').onclick=function(o){
		try{o=JSON.parse(t.value);}catch(e){o=null;}
		if(o&&typeof o=='object') {
			for(var i in o) users[i]=o[i];
			saveUsers();initMenu();alert('导入成功!');
		} else alert('导入失败!');
	};
	popup.querySelector('#gu_export').onclick=function(){t.value=JSON.stringify(users);};
	popup.querySelector('#gu_close').addEventListener('click',function(){popup.style.display='';},false);
}
function initMenu(){
	d=[];
	if(users) {
		d.push('<li><a href=#>未登录状态</a></li>');
		for(var i in users) {
			if(!i) {delete users[i];continue;}
			d.push('<li><a href=#>'+i.replace(/&/g,'&amp;').replace(/</g,'&lt;')+'</a><span>删</span></li>');
		}
	} else
		d.push('<li title="请添加马甲。" style="color:gray">未检测到Cookie</li>');
	d.push('<li><a href=#>添加马甲</a></li>');
	ul.innerHTML=d.join('');
}
function showOptions(){
	popup.style.display='block';
	popup.style.top=(innerHeight-popup.offsetHeight)/2+'px';
	popup.style.left=(innerWidth-popup.offsetWidth)/2+'px';
}
var menu,gu,ul,symbol,options,users,popup;
if(window.top===window&&document.head) init();