// ==UserScript== // @name Weibo Huati Check-in // @description 超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://greasyfork.org/scripts/152 ) // @version 0.1.2017102028 // @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 // @downloadURL none // ==/UserScript== (() => { // * 设置区 // 签到黑名单,括以半角引号,隔以半角逗号,见下 var undoList = ["话题一", "话题二", "话题三"]; // 允许显示的最大行数; var maxLines = 20; // 最大签到数 var maxSign = 9999; // 自动签到 var autoCheckIn = true; // * 功能区 //脚本应用式样 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('/'); } //获取签到话题名单 function jjuds() { document.querySelector('.ficon_checkin').classList.remove('S_ficon'); //签到过程中,高亮签到按钮 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 / pageSize), domid = null) { //获取话题列表 readyDiv.innerHTML = "开始签到准备,正在获取话题列表第" + nn + "页"; var getPage = GM_xmlhttpRequest({ method: 'GET', synchronous: false, headers: { cookie: encodeURIComponent(document.cookie), }, url: 'https://m.weibo.cn/api/container/getIndex?containerid=100803_-_page_my_follow_super&page=''/p/100505' + $CONFIG.uid + '/myfollow?relate=interested&' + (nn != 1 ? domid + '_page=' + nn : ''), onload: function(data) { let text = data.responseText, [_, domid, html] = /(Pl_Official_RelationInterested__\d+)[^<]+(
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].name.reComLength() + ""; if (!todaySign[$CONFIG.nick]) todaySign[$CONFIG.nick] = []; Tds[gg].innerHTML = consNum(gg) + ". " + huatiName; var msg = document.createElement('em'); msg.classList.add('checkInMsg'); Tds[gg].appendChild(msg); if (undoList.indexOf(htIdName[gg].name) != -1) { msg.innerHTML = " 用户指定不签到"; if (gg + 1 < huatiNums && !Tds[gg + 1].innerHTML) { onebyone(gg + 1, "conti"); } } else if (todaySign.date == fulltime && todaySign[$CONFIG.nick].indexOf(htIdName[gg].name) != -1 && goorstop != "stop") { msg.innerHTML = " 已有签到记录"; if (gg + 1 < huatiNums && !Tds[gg + 1].innerHTML) { onebyone(gg + 1, "conti"); } } else { msg.innerHTML = " 访问中......"; 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].hash, onload: function(responseDetails) { var wwdata = JSON.parse(responseDetails.responseText); if (wwdata.code == '100000' || '382004') { if (todaySign[$CONFIG.nick].indexOf(htIdName[gg].name) == -1) { rqq = todaySign[$CONFIG.nick].push(htIdName[gg].name); } 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 = '#'; 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].name + "话题 访问超时!第" + (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 = '#'; 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 = '#'; reSignAn.innerHTML = "重试"; reSignAn.addEventListener('click', function() { onebyone(hii, "stop"); //带"stop"参数,避免递进执行。 }, true); Tds[hii].appendChild(reSignAn); }, true); Tds[gg].appendChild(pauseAc); } } } // 清理旧版数据 ['autoSignbox'].forEach(function(e) { GM_deleteValue(e); }); // 隐藏游戏按钮,替换为超话签到 var checkInBtn = document.createElement("li"); checkInBtn.innerHTML = 's超话签到'; checkInBtn.addEventListener( 'click', function() { jjuds(); }, true ); var addBtn = setInterval(() => { if (document.querySelector('.gn_nav_list li:last-child')) { clearInterval(addBtn); document.querySelector('.gn_nav_list li:last-child').before(checkInBtn); document.querySelector('a[nm="game"]').parentNode.style = 'display: none'; } // 自动签到 if ($CONFIG.islogin) { if (GM_getValue('autoCheckIn', true) && (!todaySign.date || todaySign.date != fulltime || todaySign[$CONFIG.nick] === undefined)) { jjuds(); } } }, 100); // 隔日清空已签记录 var todaySign = JSON.parse(GM_getValue('todaySigned', "{}")); fulltime = parseDate(); if (!todaySign.date || todaySign.date != fulltime) { todaySign = {}; GM_setValue('todaySigned', JSON.stringify(todaySign)); todaySign.date = fulltime; } })();