您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://greasyfork.org/scripts/152 )
当前为
- // ==UserScript==
- // @name Weibo Huati Check-in
- // @description 超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://greasyfork.org/scripts/152 )
- // @version 0.1.2017091118
- // @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
- // ==/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/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.indexOf('Pl_Official_RelationQuietuser__97'), xhr.responseText.lastIndexOf('"Pl_Official_RelationGroupList__96'));
- var ww = text.match(/100808([\d\w]+)&belongs=interest&screen_name=[^&]+&/g);debugger;
- 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.querySelector('.ficon_checkin').classList.add('S_ficon');
- document.body.removeChild(document.getElementById("messageWindow"));
- }, false);
- td2.appendChild(newbutn);
- var useIdDiv = document.createElement("span");
- useIdDiv.id = "useIdDiv";
- useIdDiv.innerHTML = "昵称 : " + $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 = "<a href='/p/100808" + htIdName[gg][0] + "' title='" + htIdName[gg][1] + "' target='_blank'><font color='blue'>" + htIdName[gg][1].reComLength() + "</font></a>";
- 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][1]) != -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][1]) != -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][0],
- onload : function (responseDetails) {
- var wwdata =JSON.parse( responseDetails.responseText);
- if (wwdata.code=='100000'||'382004') {
- 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);
- }
- }
- }
- // 清理旧版数据
- ['autoSignbox'].forEach(function(e) {
- GM_deleteValue(e);
- });
- // 隐藏游戏按钮,替换为超话签到
- document.querySelector('a[nm="game"]').parentNode.style = 'display: none';
- var checkInBtn = document.createElement("li");
- checkInBtn.innerHTML = '<a href="javascript:void;"><em class="W_ficon ficon_checkin S_ficon">s</em><em class="S_txt1 signBtn">超话签到</em></a>';
- checkInBtn.addEventListener(
- 'click',
- function () {
- jjuds();
- },
- true
- );
- document.querySelector('a[nm="name"]').parentNode.before(checkInBtn);
- // 隔日清空已签记录
- 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;
- }
- // 自动签到
- if ($CONFIG.islogin) {
- if (GM_getValue('autoCheckIn', true) && (!todaySign.date || todaySign.date != fulltime || todaySign[$CONFIG.nick] === undefined)) {
- jjuds();
- }
- }