Baidu Multiuser Unsafe

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

当前为 2014-09-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Baidu Multiuser Unsafe
  3. // @namespace http://geraldl.ml/
  4. // @author Gerald <gera2ld@163.com>
  5. // @icon https://s.gravatar.com/avatar/a0ad718d86d21262ccd6ff271ece08a3?s=80
  6. // @version 1.1
  7. // @description 百度马甲切换不安全版(将保存用户名和密码,请慎用!)
  8. // @homepageURL http://geraldl.ml/userjs/BaiduMultiuserUnsafe
  9. // @match *://*.baidu.com/*
  10. // @include *.baidu.com/*
  11. // @exclude http://developer.baidu.com/*
  12. // @exclude http://web.im.baidu.com/*
  13. // @run-at document-start
  14. // @grant GM_getValue
  15. // @grant GM_setValue
  16. // @grant GM_addStyle
  17. // ==/UserScript==
  18.  
  19. function safeText(t){
  20. return t.replace(/&/g,'&amp;').replace(/</g,'&lt;');
  21. }
  22. function getValue(key,def){
  23. var v=GM_getValue(key)||'';
  24. try{v=JSON.parse(v);}catch(e){v=def;}
  25. return v;
  26. }
  27. function setValue(key,val){
  28. GM_setValue(key,JSON.stringify(val));
  29. }
  30. function switchUser(user){
  31. setValue('ge_login',user);
  32. location.href=loginUrl+encodeURIComponent(location.href);
  33. }
  34. function initLoc(){
  35. gu.right=gu._right=gu.parentNode.offsetWidth-gu.offsetWidth-gu.offsetLeft;
  36. gu.top=gu._top=gu.offsetTop;
  37. }
  38. function saveAndUpdate(){
  39. setValue('ge_users',users);initMenu();
  40. }
  41. function saveLoc(){
  42. setValue('ge_users_loc',{right:gu.right,top:gu.top});
  43. }
  44. function userSwitch(e){
  45. var o=e.target,c=o.parentNode,p=c.parentNode;
  46. if(o.tagName=='A') {
  47. var d=o.getAttribute('data');
  48. if(d=='manage') { // 管理马甲
  49. showOptions();
  50. } else if(d=='logout') { // 登出
  51. location.href='https://passport.baidu.com/?logout&u='+encodeURIComponent(location.href);
  52. } else // 切换
  53. switchUser(o.innerText||o.textContent);
  54. }
  55. e.preventDefault();
  56. }
  57. function locate(l){
  58. if(l) {
  59. gu.right=l&&!isNaN(l.right)?l.right:100;
  60. gu.top=l&&!isNaN(l.top)?l.top:100;
  61. }
  62. gu.style.right=gu.right+'px';
  63. gu.style.top=gu.top+'px';
  64. }
  65. function mousemove(e){
  66. e.preventDefault();e.stopPropagation();
  67. var l={right:gu._right+gu.x-e.pageX,top:gu._top+e.pageY-gu.y};
  68. locate(l);
  69. }
  70. function pinUpdate(){
  71. if(gu.pin) {
  72. symbol.classList.add('ge_pin');
  73. symbol.setAttribute('title','固定在页面上');
  74. gu.style.position='absolute';
  75. } else {
  76. symbol.classList.remove('ge_pin');
  77. symbol.setAttribute('title','固定在屏幕上');
  78. gu.style.position='';
  79. }
  80. }
  81. function pin(){
  82. initLoc();
  83. if(gu.pin) // fixed => absolute
  84. gu.top+=window.pageYOffset;
  85. else // absolute => fixed
  86. gu.top-=window.pageYOffset;
  87. pinUpdate();
  88. locate();
  89. saveLoc();
  90. }
  91. function buildMenu(){
  92. GM_addStyle('\
  93. #ge_uu{display:block;padding:10px;text-align:left;}\
  94. #ge_uu .ge_h{display:none;}\
  95. #ge_uu{z-index:10006;font:normal normal 400 12px/18px 宋体;position:fixed;}\
  96. #ge_uu>span{background:white;color:blue;border-radius:3px;border:1px solid #c0c0c0;padding:3px;cursor:pointer;vertical-align:middle;}\
  97. #ge_uu>div{position:relative;margin-top:3px;}\
  98. #ge_uu>div>*{position:absolute;}\
  99. .ge_uu{background:white;border:1px solid silver;box-shadow:5px 5px 7px #333;}\
  100. .ge_uu{width:120px;max-height:400px;overflow-x:hidden;overflow-y:auto;}\
  101. .ge_uu>li{position:relative;display:block;padding:2px 20px 4px 6px;}\
  102. .ge_uu>li:hover,#gu_users .ge_user:hover{background:lightgray;}\
  103. .ge_uu>li:last-child:hover{background:white;}\
  104. .ge_uu span{position:absolute;top:0;right:0;color:white;background:#77f;border-radius:3px;margin:2px;cursor:pointer;padding:2px;}\
  105. .ge_uu span:hover{background:red;}\
  106. .ge_uu a,#gu_users span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:100%;}\
  107. .ge_uu>li:last-child a{display:inline;}\
  108. #gu_users{width:340px;height:100px;overflow:auto;border:1px solid;}\
  109. #gu_users .ge_user{position:relative;color:dodgerblue;}\
  110. #gu_users .ge_name{display:block;margin-right:100px;padding:3px 5px;}\
  111. #gu_users .ge_control{position:absolute;top:0;right:0;text-align:right;}\
  112. .ge_sym{display:inline-block;width:7px;height:7px;border:1px solid #c0c0c0;border-radius:4px;margin-left:3px;}\
  113. .ge_sym.ge_pin{background:#c0c0c0;}\
  114. ');
  115. if(!document.querySelector('#ge_css')) GM_addStyle('\
  116. .ge_popup{display:none;z-index:10006;font:normal normal 400 12px/18px 宋体;position:fixed;background:white;border:1px solid silver;box-shadow:5px 5px 7px #333;text-align:left;}\
  117. .ge_opt{padding:20px;border-radius:5px;}\
  118. .ge_opt fieldset{border:1px solid silver;border-radius:5px;padding:5px;}\
  119. .ge_opt textarea{min-height:100px;width:100%;}\
  120. ');
  121. gu=document.createElement('div');gu.id='ge_uu';
  122. gu.innerHTML='<span>马甲<span class=ge_sym></span></span><div><ul class="ge_uu ge_h"></ul></div>';
  123. gu.style.display=getValue('float','');
  124. ul=gu.querySelector('ul');
  125. ul.addEventListener('click',userSwitch,false);
  126. symbol=gu.querySelector('.ge_sym');
  127. gu.pin=!!getValue('ge_pin');pinUpdate();
  128. symbol.addEventListener('click',function(){setValue('ge_pin',gu.pin=!gu.pin);pin();},false);
  129. gu.addEventListener('mouseover',function(e){
  130. if(this.contains(e.relatedTarget)) return;
  131. ul.classList.remove('ge_h');
  132. if(gu.offsetLeft+gu.firstChild.offsetLeft+ul.offsetWidth<=document.body.offsetWidth) ul.style.pixelLeft=0;
  133. else ul.style.pixelLeft=document.body.offsetWidth-gu.offsetLeft-gu.firstChild.offsetLeft-ul.offsetWidth;
  134. },false);
  135. gu.addEventListener('mouseout',function(e){if(!this.contains(e.relatedTarget)) ul.classList.add('ge_h');},false);
  136. document.body.appendChild(gu);gu.moving=false;locate(getValue('ge_users_loc',{}));
  137. gu.firstChild.addEventListener('mousedown',function(e){
  138. e.preventDefault();e.stopPropagation();
  139. if(e.target!=gu.firstChild||gu.moving) return;gu.moving=true;
  140. initLoc();
  141. gu.x=e.pageX;
  142. gu.y=e.pageY;
  143. document.addEventListener('mousemove',mousemove,false);
  144. },false);
  145. gu.addEventListener('mouseup',function(e){
  146. if(!gu.moving) return;gu.moving=false;
  147. e.preventDefault();e.stopPropagation();
  148. document.removeEventListener('mousemove',mousemove,false);
  149. saveLoc();
  150. },false);
  151. initMenu();
  152. }
  153. function initMenu(){
  154. var d=[],i;
  155. for(i in users) d.push('<li><a href=#>'+safeText(i)+'</a></li>');
  156. d.push('<li><a href=# data=manage>管理马甲</a> | <a href=# data=logout>登出</a></li>');
  157. ul.innerHTML=d.join('');
  158. }
  159. function initManage() {
  160. function addItem(i) {
  161. var d=document.createElement('div');d.className='ge_user';
  162. d.innerHTML='<div class=ge_name>'+safeText(i)+'</div><div class=ge_control><button data=mod>修改</button><button data=del>删除</button></div>';
  163. dusers.appendChild(d);
  164. }
  165. popup=document.createElement('div');
  166. popup.className='ge_popup ge_opt';
  167. popup.innerHTML='\
  168. <h3>百度马甲切换<font color=red>不安全版</font></h3>\
  169. <fieldset><legend>马甲管理 <button id=gu_add>添加</button></legend>\
  170. <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>\
  171. <div id=gu_users></div>\
  172. </fieldset>\
  173. <fieldset><legend>马甲数据 <button id=gu_import>导入</button> <button id=gu_export>导出</button> \
  174. <a title="复制数据到以下文本框然后点击导入即可导入数据。\n点击导出后复制数据文本即可用于导入。">(?)</a></legend>\
  175. <textarea id=gu_data></textarea></fieldset>\
  176. <p align=right><button id=gu_close>关闭</button></p>\
  177. ';
  178. document.body.appendChild(popup);
  179. popup.addEventListener('click',function(e){e.stopPropagation();},false);
  180. var dmod=popup.querySelector('#gu_modify'),tdata=popup.querySelector('#gu_data'),
  181. tuser=popup.querySelector('#gu_user'),tpwd=popup.querySelector('#gu_pwd'),cur,
  182. dusers=popup.querySelector('#gu_users');
  183. popup.querySelector('#gu_add').addEventListener('click',function(){
  184. tuser.value=tpwd.value='';tuser.disabled=false;
  185. dmod.style.display='block';cur=null;tuser.focus();
  186. },false);
  187. dusers.addEventListener('click',function(e){
  188. var t=e.target,d,u;
  189. if(t.tagName!='BUTTON') return;
  190. d=t.getAttribute('data');cur=t.parentNode.parentNode;
  191. u=cur.firstChild;u=u.innerText||u.textContent;
  192. if(d=='del') {
  193. delete users[u];
  194. cur.parentNode.removeChild(cur);
  195. cur=null;saveAndUpdate();
  196. } else if(d=='mod') {
  197. tuser.value=u;tuser.disabled=true;tpwd.value=users[u];
  198. dmod.style.display='block';tpwd.focus();tpwd.select();
  199. }
  200. },false);
  201. dmod.addEventListener('submit',function(e){
  202. e.preventDefault();
  203. var u=tuser.value,p=tpwd.value;
  204. if(!u||!p) return;
  205. if(cur) cur.firstChild.innerHTML=safeText(u);
  206. else addItem(u);
  207. users[u]=p;saveAndUpdate();
  208. dmod.style.display='none';cur=null;
  209. },false);
  210. popup.querySelector('#gu_cancel').addEventListener('click',function(e){
  211. e.preventDefault();
  212. dmod.style.display='none';
  213. },false);
  214. tdata.addEventListener('click',function(){this.select();},false);
  215. popup.querySelector('#gu_import').addEventListener('click',function(o){
  216. try{
  217. o=JSON.parse(unescape(window.atob(tdata.value)));
  218. }catch(e){o=null;}
  219. if(o&&o.version=='unsafe'&&o.users) {
  220. for(var i in o.users) users[i]=o.users[i];
  221. saveAndUpdate();alert('导入成功!');showOptions();
  222. } else alert('导入失败!');
  223. },false);
  224. popup.querySelector('#gu_export').addEventListener('click',function(){
  225. var data={version:'unsafe',users:users};
  226. tdata.value=window.btoa(escape(JSON.stringify(data)));
  227. },false);
  228. popup.querySelector('#gu_close').addEventListener('click',function(){popup.style.display='';},false);
  229. showOptions=function(){
  230. popup.style.display='block';
  231. popup.style.top=(innerHeight-popup.offsetHeight)/2+'px';
  232. popup.style.left=(innerWidth-popup.offsetWidth)/2+'px';
  233. dusers.innerHTML='';
  234. for(var i in users) addItem(i);
  235. };
  236. }
  237. function init(){
  238. var user=getValue('ge_login'),pwd=null;
  239. users=getValue('ge_users',{});
  240. if(typeof users!='object') try{users=JSON.parse(users);}catch(e){users={}}
  241. if(location.href.substr(0,loginUrl.length)==loginUrl) {
  242. pwd=users[user];
  243. if(pwd) { // TODO add mask
  244. }
  245. }
  246. if(user) setValue('ge_login','');
  247. if(pwd) window.addEventListener('load',function(){
  248. document.querySelector('#TANGRAM__PSP_3__userName').value=user;
  249. document.querySelector('#TANGRAM__PSP_3__password').value=pwd;
  250. document.querySelector('#TANGRAM__PSP_3__submit').click();
  251. },false); else window.addEventListener('DOMContentLoaded',function(){
  252. if(window.top===window&&document.head) {
  253. initManage();buildMenu();
  254. }
  255. },false);
  256. }
  257. var gu,ul,symbol,users,popup,showOptions,loginUrl='https://passport.baidu.com/v2/?login&u=';
  258. init();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址