// ==UserScript== // @name Weibo Huati Check-in // @description 超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://greasyfork.org/scripts/152 ) // @version 0.1.20170911 // @author xyau // @namespace https://greasyfork.org/users/10290 // @match http*://www.weibo.com/* // @match http*://weibo.com/* // @icon https://n.sinaimg.cn/photo/5b5e52aa/20160628/supertopic_top_area_big_icon_default.png // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @run-at document-idle // @downloadURL none // ==/UserScript== //这里指明不签到的话题,话题名不要带最后的“话题”字,用小写的双引号括起来,再用小写的逗号隔开,就象下面一样 var undoList = ["话题一", "话题二", "话题三"]; //此处可修改屏幕允许显示的最大行数; var maxLines = 20; //这里指定最大签到数,9999为默认,即全签。 var maxSign = 9999; //脚本应用式样 function addStyle(css) { document.head.appendChild(document.createElement("style")).textContent = css; } var signCSS = ""; signCSS += "#headTd{border-bottom:1px solid grey; color:blue; padding:0px 0px 5px 0px !important;}"; signCSS += "#footTd{border-top:1px solid grey; color:blue; padding:6px 0px 0px 0px !important;}"; signCSS += ".signbaInfor{white-space:nowrap; padding:0px 6px 0px 6px;}"; signCSS += "#scrollDiv *{font-size:12px !important; line-height:18px !important;} #scrollDiv{max-height:" + (maxLines * 18) + "px; max-width:1200px;}"; signCSS += "#newbutn,#newbutn2,#newbutn3,#zhidaoDiv{float:right;}#useIdDiv,#thDiv{float:left;}"; signCSS += "#timerDiv{z-index:997; position:fixed;left:5px;top:5px;}"; signCSS += "#getDown,#newbutn,#newbutn2,#newbutn3{font-size:12px; background:rgba(228,228,228,0.4); cursor:pointer; margin:0px 1px 0px 0px; padding:0px 3px;color:black; border:2px ridge black;}"; signCSS += "#getDown:active,#newbutn:active,#newbutn3:active{border:2px groove black;}"; signCSS += "#readyDiv,#messageWindow{z-index:9999; padding:6px 10px 8px 10px;background-color:lightGrey;position:fixed;left:5px;bottom:5px;border:1px solid grey}"; addStyle(signCSS); //北京时间 function parseDate(){ e = new Date(28800000 + new Date().getTime()); return [e.getUTCFullYear(), e.getUTCMonth() + 1, e.getUTCDate()].join('/'); } fulltime = parseDate(); //获取签到话题名单 function jjuds() { var newsignCss = document.createElement("style"); newsignCss.id = "newsignCss"; newsignCss.type = "text/css"; newsignCss.innerHTML = "#allsign{display:none}"; document.head.appendChild(newsignCss); //签到过程中,高亮签到按钮 var readyDiv = document.createElement("div"); readyDiv.id = "readyDiv"; readyDiv.innerHTML = "开始签到准备,正在获取话题列表第1页"; document.body.appendChild(readyDiv); var htIdName = []; //话题收集数组 pageSize = 30; //单页话题数量 getHuati(1); function getHuati(nn, lp= Math.ceil(maxSign / 30)) { //获取话题列表 readyDiv.innerHTML = "开始签到准备,正在获取话题列表第" + nn + "页"; var xhr = new XMLHttpRequest(); xhr.open( 'get', '/p/100505'+$CONFIG.uid+'/myfollow?relate=interested&Pl_Official_RelationInterested__95_page=' + nn, 'false' ); xhr.onload = function(e){ var text = xhr.responseText.slice(xhr.responseText.lastIndexOf('Pl_Official_RelationInterested__95'), xhr.responseText.lastIndexOf('"Pl_Official_RelationGroupList__96')); var ww = text.match(/100808([\d\w]+)&belongs=interest&screen_name=[^&]+&/g); for (s = 0; s < ww.length; s++) { if (htIdName.length < maxSign) { htIdName.push([ /100808([\d\w]+)/g.exec(ww[s])[1], // 话题ID /e=([^&]+)&/g.exec(ww[s])[1] //话题名称 ]); } else { break; } } if (nn == 1) //检查是否分页 lp = /95_page/.test(text) ? Math.min(lp, text.match(/95_page/g).length) : 1; if (nn == lp) //最后一页读取完毕,开始执行签到 gowork(htIdName); else //自调用,顺序循环 setTimeout(getHuati(nn + 1, lp), 200); }; xhr.send(); } } //功能函数 function gowork(htIdName) { //以获取的话题数组为参数 document.body.removeChild(document.getElementById("readyDiv")); anotherTime = parseDate(); //当前时间 //创建窗口 if (document.getElementById("messageWindow")) { document.body.removeChild(document.getElementById("messageWindow")); } var newDiv = document.createElement("div"); newDiv.id = "messageWindow"; newDiv.align = "left"; document.body.appendChild(newDiv); var tablee = document.createElement("table"); newDiv.appendChild(tablee); var thh = document.createElement("th"); thh.id = "headTd"; var thDiv = document.createElement("span"); thDiv.id = "thDiv"; thh.appendChild(thDiv); tablee.appendChild(thh); var tr1 = document.createElement("tr"); var tr2 = document.createElement("tr"); tablee.appendChild(tr1); tablee.appendChild(tr2); var td1 = document.createElement("td"); var td2 = document.createElement("td"); td2.id = "footTd"; tr1.appendChild(td1); tr2.appendChild(td2); var huatiNums = htIdName.length; //话题总数量 var Tds = []; //各话题签到信息栏的空白数组 var scrollDiv = document.createElement("div"); scrollDiv.id = "scrollDiv"; newTable = creaseTable(huatiNums); //根据话题数量创建列表 scrollDiv.appendChild(newTable); td1.appendChild(scrollDiv); td2.innerHTML += anotherTime + " 共" + huatiNums + "个话题需要签到  "; onebyone(0, "conti"); //这里开始启动逐一签到动作 var newbutn = document.createElement("span"); //创建关窗按钮 newbutn.id = "newbutn"; newbutn.innerHTML = "关闭窗口"; newbutn.addEventListener("click", function () { document.head.removeChild(document.getElementById("newsignCss")); document.body.removeChild(document.getElementById("messageWindow")); }, false); td2.appendChild(newbutn); var useIdDiv = document.createElement("span"); useIdDiv.id = "useIdDiv"; useIdDiv.innerHTML = "用户ID : " + $CONFIG.nick; thDiv.appendChild(useIdDiv); //列表创建函数 function creaseTable(UrlLength) { var cons = (UrlLength <= maxLines * 2) ? 2 : 3; if (huatiNums > maxLines * cons) { addStyle("#scrollDiv{overflow-x:auto; overflow-y:scroll; padding-right:15px}"); } var tablepp = document.createElement("table"); var trs = []; for (ly = 0; ly < Math.ceil(UrlLength / cons); ly++) { var tr = document.createElement("tr"); mmd = trs.push(tr); tablepp.appendChild(tr); } for (ls = 0; ls < UrlLength; ls++) { var td = document.createElement("td"); td.setAttribute("class", "signbaInfor"); wq = Tds.push(td); trs[Math.floor(ls / cons)].appendChild(td); } return tablepp; } //显示信息序号的函数 function consNum(n){ n += 1; return '0'.repeat(huatiNums.toString().length - n.toString().length) + n; } function onebyone(gg, goorstop) { //这里的gg是从0开始的话题序号,goorstop用于判别是否递进执行。 //话题名缩略显示 String.prototype.reComLength = function () { var yn = 0; var kuu = ""; for (var w in this) { if (w < this.length) { if (/[a-zA-Z0-9]/.exec(this[w])) { yn += 1; } else { yn += 2; } if (yn < 11) { kuu += this[w]; } } } var uui = yn > 13 ? kuu + "..." : this; return uui; }; gg = Number(gg); var timeout = 0; //默认延时 var huatiName = "" + htIdName[gg][1].reComLength() + ""; if (!todaySign[$CONFIG.nick]) todaySign[$CONFIG.nick] = []; if (undoList.indexOf(htIdName[gg][1]) != -1) { Tds[gg].innerHTML = consNum(gg) + ". " + huatiName + " 用户指定不签到"; if (gg + 1 < huatiNums && !Tds[gg + 1].innerHTML) { onebyone(gg + 1, "conti"); } } else if (todaySign.date == fulltime && todaySign[$CONFIG.nick].indexOf(htIdName[gg][1]) != -1 && goorstop!="stop") { Tds[gg].innerHTML = consNum(gg) + ". " + huatiName + " 已有签到记录"; if (gg + 1 < huatiNums && !Tds[gg + 1].innerHTML) { onebyone(gg + 1, "conti"); } } else { Tds[gg].innerHTML = consNum(gg) + ". " + huatiName + " 访问中......".blink(); if (goorstop == "conti") { document.getElementById("scrollDiv").scrollTop = document.getElementById("scrollDiv").scrollHeight; //滚动时总显示最下一行 } var ttss; var myRequest = GM_xmlhttpRequest({ method : 'GET', synchronous : false, headers : { "cookie" : encodeURIComponent(document.cookie), }, url : '/p/aj/general/button?ajwvr=6&api=http://i.huati.weibo.com/aj/super/checkin&texta=签到&textb=已签到&status=0&id=100808' + htIdName[gg][0], onload : function (responseDetails) { var wwdata =JSON.parse( responseDetails.responseText); if (wwdata.code=='100000'||'382004') { if (!todaySign.date || todaySign.date != fulltime) { //日期不对,记录全清零 todaySign = {}; todaySign.date = fulltime; todaySign[$CONFIG.nick] = []; rqq = todaySign[$CONFIG.nick].push(htIdName[gg][1]); } else { if (Object.prototype.toString.call(todaySign[$CONFIG.nick]) == "[object String]") { //清除旧版的不同格式记录 todaySign[$CONFIG.nick] = []; } if (todaySign[$CONFIG.nick].indexOf(htIdName[gg][1]) == -1) { rqq = todaySign[$CONFIG.nick].push(htIdName[gg][1]); }} GM_setValue('todaySigned', JSON.stringify(todaySign)); //成功一个保存一个,以防签到意外中断 if(wwdata.code=='100000'){ // 签到成功 info ='签到第' + /\d+/g.exec(wwdata.data.alert_title)[0] + '名,经验+' + /\d+/g.exec(wwdata.data.alert_subtitle)[0];} else {info = wwdata.msg;} } else { var km = gg; //把gg此时的值记录下来是必须的,因为gg值将发生变化,后面不便调用 var reSignAn = document.createElement("a"); reSignAn.href = 'javascript:void(0);'; reSignAn.innerHTML = "重签"; reSignAn.setAttribute("sentValue", km); reSignAn.addEventListener('click', function (ee) { k = ee.target.getAttribute("sentValue"); onebyone(k, "stop"); //带"stop"参数,避免递进执行。 }, true); Tds[km].appendChild(reSignAn); info = wwdata.msg; } Tds[gg].innerHTML = consNum(gg) + ". " + huatiName + info; if ( goorstop == "conti" && Tds[gg + 1] && !Tds[gg + 1].innerHTML) { //只有当参数为"conti"、下一表格存在且内容为空时,才继续下一个签到动作 setTimeout(function () { onebyone(gg + 1, "conti"); //函数自调用,其实是另一种循环 }, timeout); } }, onreadystatechange : function (responseDe) { //访问超时应对 if (responseDe.readyState == 1 && typeof ttss == 'undefined') { ttss = setTimeout(function () { //添加延时 myRequest.abort(); //中止请求 var delayRetry = GM_getValue("delayRetry", 0); if (delayRetry < 5) { console.log(htIdName[gg][1] + "话题 访问超时!第" + (delayRetry + 1) + "次重试中..."); GM_setValue("delayRetry", delayRetry + 1); onebyone(gg, "conti"); //再请求 } else { Tds[gg].innerHTML = consNum(gg) + ". " + huatiName + " 暂时无法访问 "; Tds[gg].appendChild(pauseAc); GM_deleteValue("delayRetry"); } }, 5000); } else if (responseDe.readyState == 2) { //如顺利,消除延时 clearTimeout(ttss); GM_deleteValue("delayRetry"); } } }); //跳过功能 var hii = gg; var pauseAc = document.createElement("a"); pauseAc.href = 'javascript:void(0);'; pauseAc.innerHTML = " 跳过"; pauseAc.addEventListener('click', function () { myRequest.abort(); //中止请求 clearTimeout(ttss); //取消延时块 GM_deleteValue("delayRetry"); var dnn = hii + 1; if (dnn < huatiNums && !Tds[dnn].innerHTML) { onebyone(dnn, "conti"); //进行下一个话题的签到 } Tds[hii].innerHTML = consNum(hii) + ". " + huatiName + " 已跳过 "; var reSignAn = document.createElement("a"); //添加重试按钮 reSignAn.href = 'javascript:void(0);'; reSignAn.innerHTML = "重试"; reSignAn.addEventListener('click', function () { onebyone(hii, "stop"); //带"stop"参数,避免递进执行。 }, true); Tds[hii].appendChild(reSignAn); }, true); Tds[gg].appendChild(pauseAc); } } } //添加按钮 var checkInBtn = document.createElement("li"); checkInBtn.innerHTML = 's超话签到'; // newEm.id = "allsign"; // newEm.addEventListener('click', jjuds, true); // autoSignbox.checked = GM_getValue('autoSignbox', true); // autoSignbox.addEventListener('click', function () { // GM_setValue('autoSignbox', document.getElementById("autoSign").checked); //}, true); //隐藏游戏按钮,添加签到按钮 document.querySelector('a[nm="game"]').parentNode.style = 'display: none'; document.querySelector('a[nm="name"]').parentNode.before(checkInBtn); //自动签到 var todaySign = JSON.parse(GM_getValue('todaySigned', "{}")); if ($CONFIG.nick) { if (GM_getValue('autoSignbox', true) && (!todaySign.date || todaySign.date != fulltime || todaySign[$CONFIG.nick] === undefined)) { jjuds(); } }