51NB Asst

51助手,黑名单,自动签到

  1. // ==UserScript==
  2. // @name 51NB Asst
  3. // @description 51助手,黑名单,自动签到
  4. // @namespace by 51nb.com-FlyToSky
  5. // @version 3.1.3
  6. // @grant GM_setValue
  7. // @grant GM_getValue
  8. // @grant GM_addStyle
  9. // @include *forum.51nb.com/*
  10. // @include *.51nb.com/forum/*
  11. // ==/UserScript==
  12.  
  13. // 3.1.3 -- 修复提交BUG--重要
  14. // 3.1.2 -- 修复小尾巴BUG
  15. // 3.1.1 -- 修复回复引用帖子时添加小尾巴(需要Greasemonkey3.0以上支持)功能;调整界面。
  16. // 3.1.0 -- 支持论坛新改版,修复一些BUG
  17. // 3.0.0 -- 增加支持GreaseMonkey2.0以上,Firefox30以上
  18.  
  19. var bid_Settings;
  20. var bid_BlackLists;
  21. var bid_blacklistStr;
  22. var bid_signed;
  23. var bid_formhash;
  24. var bid_uid;
  25. var bid_fid;
  26. var bid_keywords;
  27. var bid_Key_lastTid;
  28. var bid_VIEWTHREAD = window.location.href.indexOf('/thread-') >= 0 || (window.location.href.indexOf('/forum.php?') >= 0 && window.location.href.indexOf('mod=viewthread') >= 0);
  29. var bid_FORUMDISPLAY = window.location.href.indexOf('/forum-') >= 0 || (window.location.href.indexOf('/forum.php?') >= 0 && window.location.href.indexOf('mod=forumdisplay') >= 0);
  30.  
  31. if (!this.GM_getValue) {
  32. this.GM_getValue = function (key,def) {
  33. return localStorage.getItem(key) || def;
  34. }
  35. this.GM_setValue = function (key,value) {
  36. return localStorage.setItem(key, value);
  37. }
  38. this.GM_deleteValue = function (key) {
  39. return localStorage.removeItem(key);
  40. }
  41. }
  42.  
  43. if (!this.GM_addStyle) {
  44. this.GM_addStyle = function(css) {
  45. var head, style;
  46. head = document.getElementsByTagName('head')[0];
  47. if (!head) { return; }
  48. style = document.createElement('style');
  49. style.type = 'text/css';
  50. style.innerHTML = css;
  51. head.appendChild(style);
  52. }
  53. }
  54.  
  55. function bid_xpath(q) {
  56. return document.evaluate(q, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  57. }
  58.  
  59. //读取设置
  60. function bid_readConfig(){
  61. var s=GM_getValue('51Asst_Settings_' + bid_uid,'');
  62. if (s) {
  63. bid_Settings = JSON.parse(s);
  64. bid_signed = (bid_Settings.lastSignDate == (new Date()).toDateString()) ? true : false;
  65. } else {
  66. bid_Settings = new Object();
  67. }
  68. s=GM_getValue('51Asst_BlackLists_' + bid_uid,'');
  69. bid_blacklistStr = ',';
  70. if (s) {
  71. bid_BlackLists = JSON.parse(s);
  72. for (i=0;i<bid_BlackLists.blacklist.length;i++) {
  73. bid_blacklistStr += bid_BlackLists.blacklist[i].id + '=' + bid_BlackLists.blacklist[i].name + ',';
  74. }
  75. } else {
  76. bid_BlackLists= new Object();
  77. bid_BlackLists.blacklist = new Array();
  78. }
  79.  
  80. s=GM_getValue('51Asst_keywords_' + bid_uid,'');
  81. if (s) {
  82. bid_keywords = JSON.parse(s);
  83. } else {
  84. bid_keywords = new Object();
  85. bid_keywords.key = new Array();
  86. }
  87. }
  88.  
  89. var bid_BtnID;
  90. function bid_AddBlockBtn(){ // 添加屏蔽按钮
  91. s = bid_xpath('//div[starts-with(@id,"favatar")]/div[@class="pi"]/div/a');
  92. for (i = 0; i < s.snapshotLength; ++i) {
  93. var a = s.snapshotItem(i);
  94. if( a != undefined){
  95. a.addEventListener('mouseenter', function(e){clearTimeout(bid_BtnID);var p=bid_GetPos(e.target);var d=document.getElementById('_51nbbl_div');e.target.parentNode.parentNode.appendChild(d);d.style.left=parseInt(p.left)+'px';d.style.top=parseInt(p.top)+24+'px';d.style.display='';},false);
  96. a.addEventListener('mouseleave', function(e){bid_BtnID=setTimeout("document.getElementById('_51nbbl_div').style.display='none';",500)},false);
  97. }
  98. }
  99. }
  100.  
  101. function bid_GetPos(obj) { //获取元素的绝对坐标
  102. var curleft=0;
  103. var curtop=0;
  104. var curwidth=0;
  105. var curheight=0;
  106.  
  107. if (obj.offsetParent) { //返回父元素
  108. curwidth = obj.offsetWidth;
  109. curheight = obj.offsetHeight;
  110. while (obj.offsetParent) { //遍历所有父元素
  111. curleft += obj.offsetLeft;
  112. curtop += obj.offsetTop;
  113. obj = obj.offsetParent;
  114. }
  115. } else if (obj.x) {
  116. curleft += obj.x;
  117. curtop += obj.y;
  118. }
  119. return {left:curleft,top:curtop,right:curleft+curwidth,bottom:curtop+curheight};
  120. }
  121.  
  122. function bid_BlockUser(e){ //点击屏蔽按钮
  123. var a = e.target.parentNode.parentNode.getElementsByClassName('authi')[0].getElementsByTagName('a')[0];
  124. var nm= a.text.replace(/[\r\n]/g,'');
  125. var id= a.href.substring(a.href.indexOf('uid-')+4,a.href.indexOf('.html'));
  126. bid_readConfig(); //先读取一下,解决多窗口情况下的同步问题
  127. if (bid_blacklistStr.indexOf(','+id+'=') < 0) { //检查黑名单是否已存在
  128. bid_blacklistStr += id + '=' + nm;
  129. bid_addBidlist(id,nm);
  130. bid_SaveConfig(2)
  131. }
  132. bid_BlockList();
  133. }
  134.  
  135. function bid_BlockList(){ // 屏蔽黑名单
  136. switch (bid_fid) {
  137. case '88':
  138. if (!bid_Settings.blockForum88) return;
  139. break;
  140. case '41':
  141. if (!bid_Settings.blockForum41) return;
  142. break;
  143. default:
  144. if (!bid_Settings.blockForumother) return;
  145. }
  146. if(bid_VIEWTHREAD){ // 帖子
  147. //屏蔽回复
  148. var s = bid_xpath('//div[starts-with(@id,"favatar")]/div[@class="pi"]/div/a');
  149. for (i = 0; i < s.snapshotLength; ++i) {
  150. var a = s.snapshotItem(i);
  151. if( a != undefined){
  152. var id= a.href.substring(a.href.indexOf('uid-')+4,a.href.indexOf('.html'));
  153. if (bid_blacklistStr.indexOf(','+id+'=')>=0)
  154. a.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.style.display='none';
  155. }
  156. }
  157. // 屏蔽被引用内容
  158. var s = bid_xpath('//div[@class="msgbody"]/div[@class="msgborder"]/font[1]');
  159. for (i = 0; i < s.snapshotLength; ++i) {
  160. var a = s.snapshotItem(i);
  161. var n = a.textContent.substring(0,a.textContent.indexOf(' '));
  162. if (bid_blacklistStr.indexOf('='+n+',')>=0)
  163. a.parentNode.parentNode.style.display = 'none';
  164. }
  165.  
  166. // 屏蔽点评内容
  167. var s = bid_xpath('//div[starts-with(@id,"comment_")]/div[@class="pstl xs1 cl"]/div[@class="psta vm"]/a[starts-with(@href,"space-uid")]');
  168. for (i = 0; i < s.snapshotLength; ++i) {
  169. var a = s.snapshotItem(i);
  170. var id = a.href.substring(a.href.indexOf('-uid-')+5,a.href.indexOf('.html'));
  171. if (bid_blacklistStr.indexOf(','+id+'=')>=0)
  172. a.parentNode.parentNode.style.display = 'none';
  173. }
  174. //重新设置背景色
  175. var s = bid_xpath('//div["postlist"]/div[starts-with(@id,"post_") and starts-with(@class,"bbs")]');
  176. var j=0;
  177. for (i = 0; i < s.snapshotLength; ++i) {
  178. var a = s.snapshotItem(i);
  179. if( a != undefined){
  180. if (a.style.display != 'none') {
  181. a.className = (j%2)==0?"bbs2":"bbs1";
  182. ++j;
  183. }
  184. }
  185. }
  186.  
  187. } else if(bid_FORUMDISPLAY){ // 论坛列表
  188. // 屏蔽主题帖
  189. var s = bid_xpath('//table["threadlisttableid"]/tbody/tr/td[@class="author"]/cite/a[starts-with(@href,"space-uid")]');
  190. for (i = 0; i < s.snapshotLength; ++i) {
  191. var a = s.snapshotItem(i);
  192. if( a != undefined){
  193. var id= a.href.substring(a.href.indexOf('uid-')+4,a.href.indexOf('.html'));
  194. if (bid_blacklistStr.indexOf(','+id+'=')>=0)
  195. a.parentNode.parentNode.parentNode.parentNode.style.display='none';
  196. }
  197. }
  198.  
  199. //重新设置背景色
  200. var s = bid_xpath('//table["threadlisttableid"]/tbody[starts-with(@id,"normalthread_")]');
  201. var j=0;
  202. for (i = 0; i < s.snapshotLength; ++i) {
  203. var a = s.snapshotItem(i);
  204. if( a != undefined){
  205. if (a.style.display != 'none') {
  206. if (a.id == 'forumnewshow') {
  207. j=0;
  208. } else {
  209. a.childNodes[1].bgColor = (j % 2)==0?"#E3E3E3":"#F7F7F7";
  210. }
  211. ++j;
  212. }
  213. }
  214. }
  215. // 隐藏最后回复位置的显示
  216. var s = bid_xpath('//table["threadlisttableid"]/tbody/tr/td[@class="by"]/cite/a[starts-with(@href,"space-username-")]');
  217. for (i = 0; i < s.snapshotLength; ++i) {
  218. var a = s.snapshotItem(i);
  219. if(a != undefined) {
  220. var n = a.text.replace(/[\r\n]/g,'');
  221. if (bid_blacklistStr.indexOf(('='+n+','))>=0) a.innerHTML='anonymous';
  222. }
  223. }
  224. }
  225. }
  226.  
  227. function bid_menu(m) {
  228. var cur_menu=document.getElementById(m).parentNode;
  229. for (i=0;i<cur_menu.parentNode.childNodes.length;i++) {
  230. if (cur_menu.parentNode.childNodes[i].className=="_c_menu")
  231. cur_menu.parentNode.childNodes[i].className="";
  232. }
  233. cur_menu.className="_c_menu";
  234. document.getElementById("_51nb_setting1").style.display="none";
  235. document.getElementById("_51nb_setting2").style.display="none";
  236. document.getElementById("_51nb_setting3").style.display="none";
  237. switch(m) {
  238. case "_bid_m1":
  239. document.getElementById("_51nb_setting1").style.display="";
  240. break;
  241. case "_bid_m2":
  242. document.getElementById("_51nb_setting2").style.display="";
  243. break;
  244. case "_bid_m3":
  245. document.getElementById("_51nb_setting3").style.display="";
  246. break;
  247. }
  248. }
  249.  
  250. function bid_CreatConfigPanel(){ //创建面板
  251. GM_addStyle(
  252. '#_51nbccp_div {position: fixed;left:50%;bottom:50px;padding:0px 15px;margin-left:-115px; margin-top:-135px;align:center;width:220px;z-index:99;background:#d3d3d3;border:1px solid #bfbfbf;opacity:0.95;text-align:center;font-size:12px}'+
  253. '#_51nbccp_div table,#_51nbccp_div input,#_51nbccp_div select {font-size: 12px;}'+
  254. '#_51nbccp_div input {height: 20px;}'+
  255. '#_51nbccp_div input[type="text"] {height:16px !important;}'+
  256. '#_51nbccp_div input[type="checkbox"] {height:16px !important;}'+
  257. '#_51nbccp_div input[type="button"] {height: 22px !important;}'+
  258. '#_51nb_setting1,#_51nb_setting2,#_51nb_setting3 {padding:5px 0px;border-width: 1px 0px 0px;border-color:#a3a3a3;border-style:solid;height:180px;text-align:left}'+
  259. '#_bid_kw_up,#_bid_kw_down,#_bid_kw_modi,#_bid_kw_del {margin-top:-2px !important;height:18px !important;}'+
  260. '#_bid_menu li {list-style: none outside none;display:inline;}'+
  261. '#_bid_menu li {background:#b3b3b3;margin-left: 2px;}'+
  262. '#_bid_menu li._c_menu a {border-color:#a3a3a3;background:#d3d3d3;font-weight:bold;}'+
  263. '#_bid_menu a {border-width: 1px 1px 0px;border-color:#a3a3a3;border-style:solid;padding:1px 8px;height:25px;line-height:24px;text-decoration:none;color:#000;background:#b3b3b3;outline:none}'+
  264. '#_51nbgdb_div {position: fixed;top:180px;left:50%;margin-left:-75px; align:center;width:150px;padding: 7px;text-align:center;color:#fff;background:#66c;z-index:100;border-radius:5px;font-size:14px;box-shadow: 0px 0px 9px #999999;}'+
  265. '#_51nbsr_div {position: fixed;right:5px;bottom:5px;align:center;padding: 0px;z-index:98;background:#f7f7f7;border:1px solid #b6b6b6;opacity:0.90;text-align:left;}'+
  266. '#_51nbsr_div td{border-bottom:1px solid #c6c6c6;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;padding:2px 2px 2px 5px}'+
  267. '#_51nbbl_div {position:absolute;width:50px;padding:3px 5px;background:#f3f3f3;border:1px solid #e3e3e3;z-index:101;text-align:center;opacity:0.90;}' //background:#b3b3b3;border:1px solid #b6b6b6;
  268. );
  269. if (bid_Settings.autoSign && (!bid_signed) && (bid_formhash)) {
  270. var bid_gdb = document.createElement("div"); //签到提示面板
  271. bid_gdb.id = '_51nbgdb_div';
  272. bid_gdb.style.display = "none";
  273. document.getElementsByTagName('body')[0].appendChild(bid_gdb);
  274. }
  275.  
  276. var bid_sresult = document.createElement("div"); //关键字提示面板
  277. bid_sresult.id = '_51nbsr_div';
  278. bid_sresult.style.display = "none";
  279. bid_sresult.innerHTML='<div style="padding:2px;color:#fff;background:#6666cc;font-weight:bold;text-align:center">感兴趣主题'+
  280. '<a href="javascript:void(0)" id="_bid_close" style="float:right;color:#fff;font-weight:normal;font-size: 10px;">关闭</a></div>'+
  281. '<div style="height:94px;overflow-y:scroll">'+
  282. '<table id="_bid_tbl_sresult" cellspacing="0" style="width:200px;table-layout:fixed"></table>'+
  283. '</div>';
  284. document.getElementsByTagName('body')[0].appendChild(bid_sresult);
  285. document.getElementById('_bid_close').addEventListener('click', function(){document.getElementById('_51nbsr_div').style.display='none';}, false);
  286.  
  287. var bid_div_block = document.createElement("div"); //屏蔽提示面板
  288. bid_div_block.id = '_51nbbl_div';
  289. bid_div_block.style.display = "none";
  290. var a=document.createElement("a");
  291. a.innerHTML='屏蔽';
  292. a.href='javascript:void(0)';
  293. a.addEventListener('click', bid_BlockUser,false);
  294. bid_div_block.appendChild(a);
  295. bid_div_block.addEventListener('mouseenter', function(e){clearTimeout(bid_BtnID);},false);
  296. bid_div_block.addEventListener('mouseleave', function(e){bid_BtnID=setTimeout("document.getElementById('_51nbbl_div').style.display='none';",500)},false);
  297. document.getElementsByTagName('body')[0].appendChild(bid_div_block);
  298. var bid_ccp = document.createElement("div"); //设置面板
  299. bid_ccp.id = "_51nbccp_div";
  300. bid_ccp.style.display = "none";
  301. bid_ccp.innerHTML =
  302. '<div style="position:relative;margin:0px auto;width:90%;height:55px;padding:10px 0px 0px;"><font size=3>51助手'+/*<sub><font color=#e7e7e7>&nbsp;&nbsp;ver 2.0</font></sub>*/'</font>'+
  303. '<div id="_bid_menu" style="position:absolute;bottom:0px;padding:10px 0px 0px;height:20px"><ul>'+
  304. '<li class="_c_menu"><a id="_bid_m1" hidefocus="true" href="javascript:void(0)">黑名单</a></li>'+
  305. '<li><a id="_bid_m2" hidefocus="true" href="javascript:void(0)">关键字</a></li>'+
  306. '<li><a id="_bid_m3" hidefocus="true" href="javascript:void(0)">其它</a></li>'+
  307. '</ul></div></div>'+
  308. '<div id="_51nb_setting1">'+
  309. '<table id="_bid_cc1">'+
  310. '<tr><td>屏蔽版块:</td></tr>'+
  311. '<tr><td>'+
  312. '<input id="_bid_blockForum88" type="checkbox" />联谊区'+
  313. '<input id="_bid_blockForum41" type="checkbox" />交易区'+
  314. '<input id="_bid_blockForumother" type="checkbox" />其它版块'+
  315. '</td></tr>'+
  316. '<tr><td>黑名单:</td></tr>'+
  317. '<tr><td>'+
  318. '<select size="4" id="_bid_blacklist" multiple style="width:155px">'+
  319. '</select>'+
  320. '<div style="float:right;padding-left:2px;">'+
  321. '<input type="button" id="_bid_del" value="删除" onclick="javascript:void(0)"/>'+
  322. '</div>'+
  323. '</td></tr>'+
  324. '</table></div>'+
  325. '<div id="_51nb_setting2">'+
  326. '<table id="_bid_cc2">'+
  327. '<tr><td>版块:</td>'+
  328. '<td>'+
  329. '<select id="_bid_forum_list" style="height:17px;width:100px;padding:0px 0px">'+
  330. '<option value="1">技术区</option>'+
  331. '<option value="2">智能手机</option>'+
  332. '<option value="41">交易区</option>'+
  333. '<option value="88">联谊区</option>'+
  334. '<option value="113">推荐区</option>'+
  335. '</select>'+
  336. '</td></tr>'+
  337. '<tr><td>关键字:</td>'+
  338. '<td>'+
  339. '<input type="text" id="_bid_key" value="" style="width:100px;background:#fff"/>'+
  340. '&nbsp;<input type="button" id="_bid_kw_add" value="添加" onclick="javascript:void(0)"/>'+
  341. '</td></tr>'+
  342. '<tr><td></td><td>(多个关键字用"|"隔开)</td></tr>'+
  343. '<tr><td colspan="2">关键字列表:</td></tr>'+
  344. '<tr><td colspan="2">'+
  345. '<select size="4" id="_bid_keyslist" multiple style="width:155px"></select>'+
  346. '<div style="float:right;padding-left:2px;">'+
  347. '<input type="button" id="_bid_kw_up" value="上移" onclick="javascript:void(0)"/></br>'+
  348. '<input type="button" id="_bid_kw_down" value="下移" onclick="javascript:void(0)"/></br>'+
  349. '<input type="button" id="_bid_kw_modi" value="编辑" onclick="javascript:void(0)"/></br>'+
  350. '<input type="button" id="_bid_kw_del" value="删除" onclick="javascript:void(0)"/>'+
  351. '</div>'+
  352. '</td></tr>'+
  353. '</table></div>'+
  354. '<div id="_51nb_setting3">'+
  355. '<table id="_bid_cc3">'+
  356. '<tr><td>'+'发贴小尾巴:'+'</td></tr>'+
  357. '<tr><td>'+'&nbsp;&nbsp;&nbsp;文字&nbsp;&nbsp;'+'<input type="text" id="_bid_wb_text" value="" style="width:120px;background:#fff"/>'+'</td></tr>'+
  358. '<tr><td>'+'&nbsp;&nbsp;&nbsp;链接&nbsp;&nbsp;'+'<input type="text" id="_bid_wb_link" value="" style="width:120px;background:#fff"/>'+'</td></tr>'+
  359. '<tr><td>'+'<input id="_bid_autoSign" type="checkbox" />自动签到'+'</td></tr>'+
  360. '</table></div>'+
  361. '<div style="padding:0px 0px 15px;">'+
  362. '<input type="button" id="_bid_ok" value="确 定" onclick="javascript:void(0)"/>'+
  363. '&nbsp;&nbsp;&nbsp;'+
  364. '<input type="button" id="_bid_cancel" value="取 消" onclick="javascript:void(0)"/>'+
  365. '</div>'
  366. ;
  367. document.getElementsByTagName('body')[0].appendChild(bid_ccp);
  368. document.getElementById('_51nb_setting2').style.display='none';
  369. document.getElementById('_51nb_setting3').style.display='none';
  370. document.getElementById('_bid_ok').addEventListener('click', function(){bid_SaveConfig(99);bid_SaveConfig(0);}, false);
  371. document.getElementById('_bid_cancel').addEventListener('click', function(){bid_SaveConfig(0);}, false);
  372. document.getElementById('_bid_del').addEventListener('click', function(){bid_delBidlist();}, false);
  373. document.getElementById('_bid_m1').addEventListener('click', function(){bid_menu(this.id);}, false);
  374. document.getElementById('_bid_m2').addEventListener('click', function(){bid_menu(this.id);}, false);
  375. document.getElementById('_bid_m3').addEventListener('click', function(){bid_menu(this.id);}, false);
  376. document.getElementById('_bid_kw_add').addEventListener('click', function(){bid_key_add();}, false);
  377. document.getElementById('_bid_kw_del').addEventListener('click', function(){bid_key_del();}, false);
  378. document.getElementById('_bid_kw_modi').addEventListener('click', function(){bid_key_modi();}, false);
  379. document.getElementById('_bid_kw_up').addEventListener('click', function(){bid_key_move(-1);}, false);
  380. document.getElementById('_bid_kw_down').addEventListener('click', function(){bid_key_move(1);}, false);
  381. document.addEventListener('keydown', bid_keyHandle, false);
  382. bid_refreshCfgdiv();
  383. }
  384.  
  385. function bid_key_add() {
  386. var key=document.getElementById("_bid_key");
  387. if (key.value) {
  388. var fl = document.getElementById("_bid_forum_list");
  389. var kl = document.getElementById("_bid_keyslist");
  390. for (i=0;i<kl.options.length;i++){
  391. if (kl[i].value==fl[fl.selectedIndex].value) {
  392. kl[i].text='['+fl[fl.selectedIndex].text+']'+key.value;
  393. document.getElementById("_bid_kw_add").value='添加';
  394. key.value='';
  395. return;
  396. }
  397. }
  398. var o = document.createElement('option');
  399. o.value = fl[fl.selectedIndex].value;
  400. o.text = '['+fl[fl.selectedIndex].text+']'+key.value;
  401. o.title=o.text;
  402. kl.options[kl.options.length] = o;
  403. key.value='';
  404. }
  405. }
  406.  
  407. function bid_key_modi() {
  408. var kl = document.getElementById("_bid_keyslist");
  409. if (kl.selectedIndex<0) return;
  410. var key=document.getElementById("_bid_key");
  411. var fl = document.getElementById("_bid_forum_list");
  412. for (i=0;i<fl.options.length;i++){
  413. if (fl[i].value==kl[kl.selectedIndex].value) {
  414. fl.selectedIndex=i;
  415. key.value=kl[kl.selectedIndex].text.substring(kl[kl.selectedIndex].text.indexOf(']')+1);
  416. document.getElementById("_bid_kw_add").value='修改';
  417. break;
  418. }
  419. }
  420. }
  421.  
  422. function bid_key_del() {
  423. var kl = document.getElementById("_bid_keyslist");
  424. for (i=0;i<kl.options.length;i++) {
  425. if (kl.options[i].selected) {
  426. kl.options.remove(i--);
  427. }
  428. }
  429. }
  430.  
  431. function bid_key_move(d) {
  432. function moveitem(k,d){
  433. var o=k.options[k.selectedIndex];
  434. k.add(o,k.options[k.selectedIndex+d]);
  435. }
  436. var kl = document.getElementById("_bid_keyslist");
  437. if (kl.selectedIndex<0) return;
  438. if ((d == -1) && (kl.selectedIndex>0)) {
  439. moveitem(kl,d);
  440. } else if ((d == 1) && (kl.selectedIndex>-1 && kl.selectedIndex<kl.length-1)) {
  441. moveitem(kl,d+1);
  442. }
  443. }
  444.  
  445. function bid_SaveConfig(s) { //保存
  446. if (s>0) {
  447. if (s==1 || s==99) { //保存设置
  448. bid_Settings.blockForum88 = document.getElementById('_bid_blockForum88').checked;
  449. bid_Settings.blockForum41 = document.getElementById('_bid_blockForum41').checked;
  450. bid_Settings.blockForumother = document.getElementById('_bid_blockForumother').checked;
  451.  
  452. bid_Settings.autoSign = document.getElementById('_bid_autoSign').checked;
  453. bid_Settings.wb_text = document.getElementById('_bid_wb_text').value;
  454. bid_Settings.wb_link = document.getElementById('_bid_wb_link').value;
  455.  
  456. GM_setValue('51Asst_Settings_' + bid_uid, JSON.stringify(bid_Settings));
  457. }
  458. if (s==2 || s==99) { //保存黑名单
  459. bid_BlackLists.blacklist.length = 0;
  460. var bl = document.getElementById("_bid_blacklist");
  461. for ( i = 0; i<bl.options.length; i++) {
  462. bid_BlackLists.blacklist[i]=new Object();
  463. bid_BlackLists.blacklist[i].id=bl.options[i].value;
  464. bid_BlackLists.blacklist[i].name=bl.options[i].text;
  465. }
  466. GM_setValue('51Asst_BlackLists_' + bid_uid,JSON.stringify(bid_BlackLists));
  467. }
  468. if (s==3 || s==99) { //保存关键字
  469. var bl = document.getElementById("_bid_keyslist");
  470. for (j=0;j<bid_keywords.key.length;j++) {
  471. var keyexist=false;
  472. for (i = 0; i<bl.options.length; i++) {
  473. if (bid_keywords.key[j].fid==bl.options[i].value) {
  474. keyexist=true;
  475. break;
  476. }
  477. }
  478. if (!keyexist) {
  479. bid_keywords.key.splice(j--,1);
  480. }
  481. }
  482. for (i = 0; i<bl.options.length; i++) {
  483. var keyexist=false;
  484. for (j=0;j<bid_keywords.key.length;j++) {
  485. if (bid_keywords.key[j].fid==bl.options[i].value) {
  486. bid_keywords.key[j].keyword=bl.options[i].text;
  487. keyexist=true;
  488. if (i!=j) {
  489. var o=bid_keywords.key[i];
  490. bid_keywords.key[i]=bid_keywords.key[j];
  491. bid_keywords.key[j]=o;
  492. }
  493. break;
  494. }
  495. }
  496. if (!keyexist) {
  497. bid_keywords.key[bid_keywords.key.length]=new Object();
  498. bid_keywords.key[bid_keywords.key.length-1].fid=parseInt(bl.options[i].value);
  499. bid_keywords.key[bid_keywords.key.length-1].keyword=bl.options[i].text;
  500. bid_keywords.key[bid_keywords.key.length-1].chktime=0;
  501. bid_keywords.key[bid_keywords.key.length-1].lastTid=0;
  502. }
  503. }
  504. GM_setValue('51Asst_keywords_' + bid_uid,JSON.stringify(bid_keywords));
  505. }
  506. if (s==1 || s==2) {
  507. bid_BlockList();
  508. }
  509. } else {
  510. document.getElementById('_51nbccp_div').style.display = (document.getElementById('_51nbccp_div').style.display == '')?'none':'';
  511. if (document.getElementById('_51nbccp_div').style.display == 'none') bid_refreshCfgdiv(); //刷新设置界面
  512. }
  513. }
  514.  
  515. function bid_refreshCfgdiv() { //刷新设置界面
  516. if (document.getElementById("_bid_blacklist").options.length != bid_BlackLists.blacklist.length) bid_addBidlist();
  517.  
  518. document.getElementById('_bid_blockForum88').checked = bid_Settings.blockForum88;
  519. document.getElementById('_bid_blockForum41').checked = bid_Settings.blockForum41;
  520. document.getElementById('_bid_blockForumother').checked = bid_Settings.blockForumother;
  521. document.getElementById('_bid_wb_text').value = bid_Settings.wb_text?bid_Settings.wb_text:'';
  522. document.getElementById('_bid_wb_link').value = bid_Settings.wb_link!=undefined?bid_Settings.wb_link:'http://forum.51nb.com/thread-1459523-1-1.html';
  523. if (bid_uid) {
  524. document.getElementById('_bid_autoSign').checked = bid_Settings.autoSign;
  525. document.getElementById('_bid_autoSign').disabled = false;
  526. } else {
  527. document.getElementById('_bid_autoSign').checked = false;
  528. document.getElementById('_bid_autoSign').disabled = true;
  529. }
  530. var kl = document.getElementById("_bid_keyslist");
  531. for (i=0;i<bid_keywords.key.length;i++) {
  532. var o=document.createElement('option');
  533. o.value=bid_keywords.key[i].fid;
  534. o.text=bid_keywords.key[i].keyword;
  535. o.title=o.text;
  536. kl.options[i]=o;
  537. }
  538. }
  539.  
  540. function bid_addBidlist(id,nm) { //刷新新黑名单列表
  541. var bl = document.getElementById("_bid_blacklist");
  542. if (id !=undefined) { //id非空时增加一个名单
  543. var o = document.createElement('option');
  544. o.value = id;
  545. o.text = nm;
  546. bl.options[bl.options.length] = o;
  547. } else { //id为空时刷新列表
  548. bl.options.length = 0;
  549. for ( i = 0; i<bid_BlackLists.blacklist.length; i++) {
  550. var o = document.createElement('option');
  551. o.value = bid_BlackLists.blacklist[i].id;
  552. o.text = bid_BlackLists.blacklist[i].name;
  553. bl.options[bl.options.length] = o;
  554. }
  555. }
  556. }
  557.  
  558. function bid_delBidlist() { //删除黑名单列表选中的名单
  559. var bl = document.getElementById("_bid_blacklist");
  560. for (i=0;i<bl.options.length;i++) {
  561. if (bl.options[i].selected) {
  562. bl.options.remove(i--);
  563. }
  564. }
  565. }
  566.  
  567. function bid_keyHandle(e) { //热键回调函数
  568. if (/^(?:input|textarea)$/i.test(e.target.localName)) return;
  569. var keycom = e.ctrlKey? '1':'0';
  570. keycom += (e.metaKey || e.altKey)? '1':'0';
  571. keycom += e.shiftKey? '1':'0';
  572. keycom += String.fromCharCode(e.which);
  573. if (keycom=='010N') {
  574. e.preventDefault();e.stopPropagation();bid_SaveConfig(0);
  575. }
  576. }
  577.  
  578. function bid_sign() {
  579. if (bid_Settings.autoSign && (!bid_signed) && (bid_formhash)) {
  580. var d = new Date();
  581. if ((d.getHours()*60 + d.getMinutes()) < 10) return; //0点10分以后才开始签到
  582. var http = new XMLHttpRequest();
  583. var url = 'plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&&referer=http%3A//forum.51nb.com/forum.php&inajax=1';
  584. var data = 'formhash=' + bid_formhash + '&qdxq=kx';
  585. http.onreadystatechange=function() {
  586. if (http.readyState==4 && http.status==200) { // 200 = http OK
  587. bid_signed = true;
  588. bid_Settings.lastSignDate = d.toDateString();
  589. bid_SaveConfig(1);
  590. var reg=/^<div class="c">[\s\S]* (\d+) nb\. <\/div>.*/gm;
  591. if (reg.test(http.responseText)) {
  592. document.getElementById('_51nbgdb_div').innerHTML = '今日签到:+'+RegExp.$1+' NB';
  593. document.getElementById('_51nbgdb_div').style.display = '';
  594. setTimeout(function(){document.getElementById('_51nbgdb_div').style.display = 'none';}, 3000);
  595. }
  596. }
  597. }
  598. http.open('POST', url, true);
  599. http.setRequestHeader("Referer","http://forum.51nb.com/forum.php");
  600. http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=gbk");
  601. http.overrideMimeType("text/html;charset=gbk");
  602. http.send(data);
  603. }
  604. }
  605.  
  606. function bid_search(i,p) {
  607. if (i >= bid_keywords.key.length) return;
  608. var gt=parseInt((new Date()).getTime()/1000);
  609. var dt=gt - bid_keywords.key[i].chktime;
  610. dt=dt>259200?259200:dt; //只检测最近三天内的新主题
  611. if (dt > 30*60) { //两次检测间隔30分钟
  612. dt += 60;
  613. var http = new XMLHttpRequest();
  614. var url = 'forum.php?mod=forumdisplay&fid='+bid_keywords.key[i].fid+'&orderby=dateline&filter=dateline&dateline='+dt+'&page='+p;
  615. http.onreadystatechange=function() {
  616. if (http.readyState==4 && http.status==200) { // 200 = http OK
  617. var regstr='<input type="text" name="custompage"[^>]*><span [^>]*> \\/ ([\\d])+ .*';
  618. var reg=RegExp(regstr,'mi');
  619. var MaxPage=reg.test(http.responseText)?parseInt(RegExp.$1):0;
  620. MaxPage=MaxPage>3?3:MaxPage; //最大读取3页
  621.  
  622. if (bid_keywords.key[i].fid==113) //处理推荐区
  623. var regstr='<div[^>]* class="[^"]* noBg"><a.*href="forum\\.php\\?mod=viewthread&amp;tid=(\\d+)&[^>]*>([^<]*(?:' + bid_keywords.key[i].keyword.substring(bid_keywords.key[i].keyword.indexOf(']')+1) + ')[^<]*)<[\\s\\S]*?<span>发布者:\\s*(.*?)\\s*<\\/span>';
  624. else
  625. var regstr='<a[^>]*href="forum\\.php\\?mod=viewthread&amp;tid=(\\d+)&[^>]*>([^<]*(?:'+bid_keywords.key[i].keyword.substring(bid_keywords.key[i].keyword.indexOf(']')+1)+')[^<]*)</a>[\\s\\S]*?<a.*href="space-uid-\\d+\\.html"[^>]*>([^<]*)</a>';
  626. var reg=RegExp(regstr,'gi');
  627. if (p==1) bid_Key_lastTid=bid_keywords.key[i].lastTid;
  628. while ((reg.exec(http.responseText)) != null) {
  629. //RegExp.$1 TID
  630. //RegExp.$2 标题
  631. //RegExp.$3 作者
  632. //console.log(RegExp.$1,RegExp.$2,RegExp.$3);
  633. if (bid_Key_lastTid < parseInt(RegExp.$1)) {
  634. if (bid_blacklistStr.indexOf('='+RegExp.$3+',')<0) {
  635. var tr=document.createElement('tr');
  636. var td=document.createElement('td');
  637. var a=document.createElement('a');
  638. a.title='〖'+bid_keywords.key[i].keyword.substring(1,bid_keywords.key[i].keyword.indexOf(']'))+'〗'+RegExp.$2+'『'+RegExp.$3+'』';
  639. a.href='thread-' + RegExp.$1 + '-1-1.html';
  640. a.target='_blank';
  641. a.innerHTML=RegExp.$2;
  642. td.appendChild(a);
  643. tr.appendChild(td);
  644. document.getElementById('_bid_tbl_sresult').appendChild(tr);
  645. document.getElementById('_51nbsr_div').style.display='';
  646. }
  647. if (bid_keywords.key[i].lastTid < parseInt(RegExp.$1))
  648. bid_keywords.key[i].lastTid=parseInt(RegExp.$1);
  649. }
  650. }
  651. if (p<MaxPage) {
  652. setTimeout(function(){bid_search(i,++p);},0);
  653. } else {
  654. bid_keywords.key[i].chktime=gt;
  655. if (i==bid_keywords.key.length-1) {
  656. GM_setValue('51Asst_keywords_' + bid_uid,JSON.stringify(bid_keywords));
  657. }
  658. setTimeout(function(){bid_search(++i,1);},0);
  659. }
  660. }
  661. }
  662. http.open('GET', url, true);
  663. http.setRequestHeader("Referer","http://forum.51nb.com/index.php");
  664. http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=gbk");
  665. http.overrideMimeType("text/html;charset=gbk");
  666. http.send(null);
  667. } else {
  668. setTimeout(function(){bid_search(++i,1);},0);
  669. }
  670. }
  671.  
  672. function bid_getFormhash() {
  673. var s = bid_xpath('//a[starts-with(@href,"member.php?")]');
  674. for (i = 0; i < s.snapshotLength; ++i) {
  675. var a = s.snapshotItem(i);
  676. if( a != undefined && a.href.indexOf('action=logout') >= 0) {
  677. bid_formhash = a.href.substring(a.href.indexOf('formhash')+9, a.href.indexOf('formhash')+9+8);
  678. }
  679. }
  680. if (bid_formhash) {
  681. var s = bid_xpath('//div[@id="hd"]/div[@class="wp"]/div/div[@id="um"]/p/strong/a[starts-with(@href,"space-uid-")]');
  682. for (i = 0; i < s.snapshotLength; ++i) {
  683. var a = s.snapshotItem(i);
  684. if( a != undefined) {
  685. bid_uid = a.href.substring(a.href.indexOf('uid')+4,a.href.indexOf('.html'));
  686. }
  687. }
  688. }
  689. if (!bid_uid) bid_uid = '';
  690. var s = bid_xpath('//div[@id="wp"]/div[@id="pt"]/div/a[starts-with(@href,"forum-")]');
  691. for (i = 0; i < s.snapshotLength; ++i) {
  692. var a = s.snapshotItem(i);
  693. if( a != undefined) {
  694. bid_fid = a.href.substring(a.href.indexOf('forum-')+6,a.href.indexOf('.html'));
  695. bid_fid = bid_fid.substring(0,bid_fid.indexOf('-'));
  696. }
  697. }
  698. }
  699.  
  700. function bid_addMessage() {
  701. var m='';
  702. if (bid_Settings.wb_text) {
  703. m='[size=1]'+bid_Settings.wb_text+'[/size]';
  704. m=/^(?:https{0,1}:\/\/|www\.).+/i.test(bid_Settings.wb_link)?'[url='+bid_Settings.wb_link+']'+m+'[/url]':m;
  705. }
  706. return m;
  707. }
  708.  
  709. function bid_addCustom_post() {
  710. var f = document.forms['postform'];
  711. var v = f.message.value;
  712. var m=bid_addMessage();
  713. if (m && v.indexOf(m)<0)
  714. f.message.value = v + "\n\n" + m;
  715. f._submit();
  716. }
  717.  
  718. function bid_addCustom_fastpost() {
  719. var f = document.forms['fastpostform'];
  720. var v = f.message.value;
  721. var m=bid_addMessage();
  722. if (m && v.indexOf(m)<0)
  723. f.message.value = v + "\n\n" + m;
  724. f._submit();
  725. }
  726.  
  727. function bid_addCustom_vfastpost() {
  728. var f = document.forms['vfastpostform'];
  729. var v = f.message.value;
  730. var m=bid_addMessage();
  731. if (m && v.indexOf(m)<0)
  732. f.message.value = v + ' ' + m;
  733. f._submit();
  734. }
  735.  
  736. function bid_addCustom() {
  737. if (this.id && (this.id=='postform' || this.id=='fastpostform' || this.id=='vfastpostform')) {
  738. var v = this.message.value;
  739. var m=bid_addMessage();
  740. if (m && v.indexOf(m)<0) {
  741. if (this.id=='vfastpostform')
  742. this.message.value = v + ' ' + m;
  743. else
  744. this.message.value = v + "\n\n" + m;
  745. }
  746. }
  747. this._submit();
  748. }
  749.  
  750. bid_getFormhash();
  751. bid_readConfig(); //读取设置参数
  752. if (window.self === window.top)
  753. bid_CreatConfigPanel(); //生成设置面板
  754.  
  755. if (bid_VIEWTHREAD) {
  756. bid_AddBlockBtn(); //添加屏蔽按钮
  757. }
  758.  
  759. if(bid_FORUMDISPLAY || bid_VIEWTHREAD) {
  760. bid_BlockList(); //屏蔽黑名单
  761. }
  762. if (bid_Settings.autoSign) {
  763. window.onload = setTimeout(function(){bid_sign();},500); //自动签到
  764. }
  765.  
  766. bid_search(0,1); //关键字提醒
  767.  
  768. if (bid_Settings.wb_text) { //添加发贴小尾巴
  769. ver = parseFloat(GM_info.version);
  770. if (ver >= 2 && ver < 3) {
  771. if (document.forms['postform']) {
  772. var f = document.forms['postform'];
  773. f._submit = f.submit;
  774. unsafeWindow.document.forms['postform'].submit = this.exportFunction?exportFunction(bid_addCustom_post, unsafeWindow):bid_addCustom_post;
  775. }
  776. if (document.forms['fastpostform']) {
  777. var f = document.forms['fastpostform'];
  778. f._submit = f.submit;
  779. unsafeWindow.document.forms['fastpostform'].submit = this.exportFunction?exportFunction(bid_addCustom_fastpost, unsafeWindow):bid_addCustom_fastpost;
  780. }
  781. if (document.forms['vfastpostform']) {
  782. var f = document.forms['vfastpostform'];
  783. f._submit = f.submit;
  784. unsafeWindow.document.forms['vfastpostform'].submit = this.exportFunction?exportFunction(bid_addCustom_vfastpost, unsafeWindow):bid_addCustom_vfastpost;
  785. }
  786. } else {
  787. HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit;
  788. unsafeWindow.HTMLFormElement.prototype.submit = this.exportFunction?exportFunction(bid_addCustom, unsafeWindow):bid_addCustom;
  789. }
  790. }