Greasy Fork is available in English.

Baidu Multiuser Unsafe

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

Ajankohdalta 18.8.2014. Katso uusin versio.

// ==UserScript==
// @name	Baidu Multiuser Unsafe
// @namespace	http://geraldl.ml/
// @author	Gerald <gera2ld@163.com>
// @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();