Baidu Multiuser Unsafe

百度马甲切换不安全版(将保存用户名和密码,请慎用!)

Versión del día 18/08/2014. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name	Baidu Multiuser Unsafe
// @namespace	http://geraldl.ml/
// @author	Gerald <[email protected]>
// @icon	https://s.gravatar.com/avatar/a0ad718d86d21262ccd6ff271ece08a3?s=80
// @version	1.0
// @description	百度马甲切换不安全版(将保存用户名和密码,请慎用!)
// @homepageURL	http://geraldl.ml/userjs/BaiduMultiuserUnsafe
// @match	*://*.baidu.com/*
// @include	*.baidu.com/*
// @exclude http://developer.baidu.com/*
// @exclude http://web.im.baidu.com/*
// @run-at document-start
// @grant	GM_getValue
// @grant	GM_setValue
// @grant GM_addStyle
// ==/UserScript==

function safeText(t){
	return t.replace(/&/g,'&amp;').replace(/</g,'&lt;');
}
function switchUser(user){
	GM_setValue('ge_login',user);
	location.href=loginUrl+encodeURIComponent(location.href);
}
function initLoc(){
		gu.right=gu._right=gu.parentNode.offsetWidth-gu.offsetWidth-gu.offsetLeft;
		gu.top=gu._top=gu.offsetTop;
}
function saveAndUpdate(){
	GM_setValue('ge_users',users);initMenu();
}
function saveLoc(){GM_setValue('ge_users_loc',{right:gu.right,top:gu.top});}
function userSwitch(e){
	var o=e.target,c=o.parentNode,p=c.parentNode;
	if(o.tagName=='A') {
		var d=o.getAttribute('data');
		if(d=='manage') {	// 管理马甲
			showOptions();
		} else if(d=='logout') {	// 登出
			location.href='https://passport.baidu.com/?logout&u='+encodeURIComponent(location.href);
		} else	// 切换
			switchUser(o.innerText||o.textContent);
	}
	e.preventDefault();
}
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(){
	symbol.innerHTML=gu.pin?'●':'○';
	symbol.setAttribute('title',gu.pin?'固定在页面上':'固定在屏幕上');
	gu.style.position=gu.pin?'absolute':'';
}
function pin(){
	initLoc();
	if(gu.pin)	// fixed => absolute
		gu.top+=window.pageYOffset;
	else	// absolute => fixed
		gu.top-=window.pageYOffset;
	pinUpdate();
	locate();
	saveLoc();
}
function buildMenu(){
	GM_addStyle('\
#ge_uu{display:block;padding:10px;text-align:left;}\
#ge_uu .ge_h{display:none;}\
#ge_uu{z-index:10006;font:normal normal 400 12px/18px 宋体;position:fixed;}\
#ge_uu>span{background:white;color:blue;border-radius:3px;border:1px solid #c0c0c0;padding:2px;cursor:pointer;}\
#ge_uu>div{position:relative;margin-top:3px;}\
#ge_uu>div>*{position:absolute;}\
.ge_uu{background:white;border:1px solid silver;box-shadow:5px 5px 7px #333;}\
.ge_uu{width:120px;max-height:400px;overflow-x:hidden;overflow-y:auto;}\
.ge_uu>li{position:relative;display:block;padding:2px 20px 4px 6px;}\
.ge_uu>li:hover,#gu_users .ge_user:hover{background:lightgray;}\
.ge_uu>li:last-child:hover{background:white;}\
.ge_uu span{position:absolute;top:0;right:0;color:white;background:#77f;border-radius:3px;margin:2px;cursor:pointer;padding:2px;}\
.ge_uu span:hover{background:red;}\
.ge_uu a,#gu_users span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%;}\
#gu_users{width:340px;height:100px;overflow:auto;border:1px solid;}\
#gu_users .ge_user{position:relative;color:dodgerblue;}\
#gu_users .ge_name{display:block;margin-right:100px;padding:3px 5px;}\
#gu_users .ge_control{position:absolute;top:0;right:0;text-align:right;}\
');
	gu=document.createElement('div');gu.id='ge_uu';
	gu.innerHTML='<span>马甲<span></span></span><div><ul class="ge_uu ge_h"></ul></div>';
	gu.style.display=GM_getValue('float','');
	ul=gu.querySelector('ul');
	ul.addEventListener('click',userSwitch,false);
	symbol=gu.firstChild.lastChild;
	gu.pin=!!GM_getValue('ge_pin');pinUpdate();
	symbol.onclick=function(){GM_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=GM_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();
}
function initMenu(){
	var d=[],i;
	for(i in users) d.push('<li><a href=#>'+safeText(i)+'</a></li>');
	d.push('<li><a href=# data=manage>管理马甲</a> | <a href=# data=logout>登出</a></li>');
	ul.innerHTML=d.join('');
}
function initManage() {
	function addItem(i) {
		var d=document.createElement('div');d.className='ge_user';
		d.innerHTML='<div class=ge_name>'+safeText(i)+'</div><div class=ge_control><button data=mod>修改</button><button data=del>删除</button></div>';
		dusers.appendChild(d);
	}
	popup=document.createElement('div');
	popup.className='ge_popup ge_opt';
	popup.innerHTML='\
<h3>百度马甲切换<font color=red>不安全版</font></h3>\
<fieldset><legend>马甲管理 <button id=gu_add>添加</button></legend>\
<form id=gu_modify style="display:none;"><input type=text id=gu_user placeholder="用户名"><input type=password id=gu_pwd placeholder="密码"><input type=submit value="确认"><input type=button id=gu_cancel value="取消"></form>\
<div id=gu_users></div>\
</fieldset>\
<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 dmod=popup.querySelector('#gu_modify'),tdata=popup.querySelector('#gu_data'),
			tuser=popup.querySelector('#gu_user'),tpwd=popup.querySelector('#gu_pwd'),cur,
			dusers=popup.querySelector('#gu_users');
	popup.querySelector('#gu_add').onclick=function(){
		tuser.value=tpwd.value='';tuser.disabled=false;
		dmod.style.display='block';cur=null;
	};
	dusers.onclick=function(e){
		var t=e.target,d,u;
		if(t.tagName!='BUTTON') return;
		d=t.getAttribute('data');cur=t.parentNode.parentNode;
		u=cur.firstChild;u=u.innerText||u.textContent;
		if(d=='del') {
			delete users[u];
			cur.parentNode.removeChild(cur);
			cur=null;saveAndUpdate();
		} else if(d=='mod') {
			tuser.value=u;tuser.disabled=true;
			tpwd.value=users[u];dmod.style.display='block';
		}
	};
	dmod.onsubmit=function(e){
		e.preventDefault();
		var u=tuser.value,p=tpwd.value;
		if(!u||!p) return;
		if(cur) cur.firstChild.innerHTML=safeText(u);
		else addItem(u);
		users[u]=p;saveAndUpdate();
		dmod.style.display='none';cur=null;
	};
	popup.querySelector('#gu_cancel').onclick=function(e){
		e.preventDefault();
		dmod.style.display='none';
	}
	tdata.onclick=function(){this.select();};
	popup.querySelector('#gu_import').onclick=function(o){
		try{
			o=JSON.parse(unescape(window.atob(tdata.value)));
		}catch(e){o=null;}
		if(o&&o.version=='unsafe'&&o.users) {
			for(var i in o.users) users[i]=o.users[i];
			saveAndUpdate();alert('导入成功!');
		} else alert('导入失败!');
	};
	popup.querySelector('#gu_export').onclick=function(){
		var data={version:'unsafe',users:users};
		tdata.value=window.btoa(escape(JSON.stringify(data)));
	};
	popup.querySelector('#gu_close').onclick=function(){popup.style.display='';};
	showOptions=function(){
		popup.style.display='block';
		popup.style.top=(innerHeight-popup.offsetHeight)/2+'px';
		popup.style.left=(innerWidth-popup.offsetWidth)/2+'px';
		dusers.innerHTML='';
		for(var i in users) addItem(i);
	};
}
function init(){
	var user=GM_getValue('ge_login'),pwd=null;
	users=GM_getValue('ge_users',{});
	if(typeof users!='object') try{users=JSON.parse(users);}catch(e){users={}}
	if(location.href.substr(0,loginUrl.length)==loginUrl) {
		pwd=users[user];
		if(pwd) {	// TODO add mask
		}
	}
	if(user) GM_setValue('ge_login','');
	if(pwd) window.addEventListener('load',function(){
		document.querySelector('#TANGRAM__3__userName').value=user;
		document.querySelector('#TANGRAM__3__password').value=pwd;
		document.querySelector('#TANGRAM__3__submit').click();
	},false); else window.addEventListener('DOMContentLoaded',function(){
		if(window.top===window&&document.head) {
			initManage();buildMenu();
		}
	},false);
}
var gu,ul,symbol,users,popup,showOptions,loginUrl='https://passport.baidu.com/v2/?login&u=';
init();