Greasy Fork

来自缓存

Greasy Fork is available in English.

weiboAllsign

超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( http://greasyfork.icu/scripts/152 )

当前为 2017-08-09 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           weiboAllsign
// @description    超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( http://greasyfork.icu/scripts/152 )
// @match        http://*.weibo.com/*
// @match        http://weibo.com/*
// @icon           http://www.weibo.com/favicon.ico
// @author       xyau
// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_deleteValue
// @grant          GM_xmlhttpRequest
// @version        2017.8.8.0
// @namespace http://greasyfork.icu/users/10290
// ==/UserScript==


//这里指明不签到的话题,话题名不要带最后的“话题”字,用小写的双引号括起来,再用小写的逗号隔开,就象下面一样
var undoList = ["话题一", "话题二", "话题三"];

//此处可修改屏幕允许显示的最大行数;
var maxLines = 20;

//这里指定最大签到数,9999为默认,即全签。
var maxSign = 9999;

/************************以下不要随便动****************************/

//脚本应用式样
function addStyle(css) {
    document.head.appendChild(document.createElement("style")).textContent = css;
}
var signCSS = "";
signCSS += ".s-mod-nav{margin-right:10px}";
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,#allsign,#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,#allsign: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);

//北京时间
var yuy = new Date();
re = yuy.getTime() + 28800000;
yuy.setTime(re);
var fulltime = yuy.getUTCFullYear() + "/" + (yuy.getUTCMonth() + 1) + "/" + yuy.getUTCDate();

//添加按钮
var newEm = document.createElement("span");
newEm.innerHTML = "话题签到";
newEm.id = "allsign";
newEm.addEventListener('click', jjuds, true);
var autoSignbox = document.createElement("input");
autoSignbox.type = "checkbox";
autoSignbox.id = "autoSign";
autoSignbox.title = "选中此项,启动自动签到,否则,关闭自动签到";
autoSignbox.checked = GM_getValue('autoSignbox', true);
autoSignbox.addEventListener('click', function () {
    GM_setValue('autoSignbox', document.getElementById("autoSign").checked);
}, true);
if (window.location.href.indexOf("weibo.com/") != -1) {
    //添加按钮
    document.getElementsByClassName('gn_nav_list')[0].appendChild(newEm);
    document.getElementsByClassName('gn_nav_list')[0].appendChild(autoSignbox);
    addStyle("#autoSign{margin:9px 0 0 0;} #allsign{margin:2px 0 0 30px}");
}

//自动签到
var todaySign = JSON.parse(GM_getValue('todaySigned', "{}"));
if ($CONFIG.nick) {
    if (yuy.getUTCHours() > 0 && document.getElementById("autoSign").checked && (!todaySign.date || todaySign.date != fulltime || todaySign[$CONFIG.nick] === undefined)) {
        jjuds();
    }
}

//获取签到话题名单
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 allAncs = []; //地址收集数组
    var htNameF = []; //话题名收集数组
    var heer = new Date();
    sed = heer.getTime() - 600000;

    function getHuati(nn, lp) { //获取第2-第n页的话题列表
        var urll = 'http://www.weibo.com/p/100505'+$CONFIG.uid+'/myfollow?relate=interested&Pl_Official_RelationInterested__95_page=' + nn;
        setTimeout(function () { //延时操作以免度娘误会
            readyDiv.innerHTML = "开始签到准备,正在获取话题列表第" + nn + "页";
            GM_xmlhttpRequest({
                method : 'GET',
                synchronous : false,
                headers : { //添加http头信息,希望有用
                    "cookie" : encodeURIComponent(document.cookie)
                },
                url : urll,
                onload : function (reText) {
                    var ww = reText.responseText.replace(/[\r\n]\s?/g,'').replace(/\s+/g,' ').match(/100808([\d\w]+)&belongs=interest&screen_name=[^&]+&/g);
                    for (s = 0; s < ww.length; s++) {
                        if (allAncs.length < maxSign) {
                            qq = allAncs.push(/100808[\d\w]+/g.exec(ww[s])[0]);
                            dd = htNameF.push(/e=([^&]+)&/g.exec(ww[s])[1]);
                        } else {
                            break;
                        }
                    }
                    if (nn == lp) { //最后一页取完,开始执行签到
                        gowork(allAncs, htNameF);
                    } else {
                        ns = nn + 1;
                        getHuati(ns, lp); //自调用,顺序循环
                    }
                }
            });
        }, 1000);
    }

    GM_xmlhttpRequest({ //从“我的话题”第1页获取列表
        method : 'GET',
        synchronous : false,
        url :  'http://www.weibo.com/p/100505'+$CONFIG.uid+'/myfollow?relate=interested',
        headers : { //添加http头信息,希望有用
            "cookie" : encodeURIComponent(document.cookie)
        },
        onload : function (reDetails) {
            var simTxt = reDetails.responseText.replace(/[\r\n]\s?/g,'').replace(/\s+/g,' ');
            var ww = simTxt.match(/100808([\d\w]+)&belongs=interest&screen_name=[^&]+&/g);
            for (s = 0; s < ww.length; s++) {
                if (allAncs.length < maxSign) {
                    qq = allAncs.push(/100808[\d\w]+/g.exec(ww[s])[0]);
                    dd = htNameF.push(/e=([^&]+)&/g.exec(ww[s])[1]);
                } else {
                    break;
                }
            }
            var qqee = simTxt.match(/\"page S_txt1/g);
            if (qqee) { //检查是否分页,分页则继续获取话题名单
                var deho = qqee.length;
                if (Math.ceil(maxSign / 30) < deho) {
                    deho = Math.ceil(maxSign / 30);
                }
                if (deho == 1) {
                    gowork(allAncs, htNameF);
                } else {
                    getHuati(2, deho);
                }
            } else { //不分页则直接开始签到
                gowork(allAncs, htNameF);
            }
        }
    });
}

//功能函数
function gowork(allAncs, htNameF) { //以获取的地址数组和话题名数组为参数
    document.body.removeChild(document.getElementById("readyDiv"));

    var yuye = new Date();
    ree = yuye.getTime() + 28800000;
    yuye.setTime(ree);
    var anotherTime = yuye.getUTCFullYear() + "/" + (yuye.getUTCMonth() + 1) + "/" + yuye.getUTCDate(); //当前时间

    //创建窗口
    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 tibeNums = allAncs.length; //话题总数量
    var Tds = []; //各话题签到信息栏的空白数组

    var scrollDiv = document.createElement("div");
    scrollDiv.id = "scrollDiv";
    newTable = creaseTable(tibeNums); //根据话题数量创建列表
    scrollDiv.appendChild(newTable);
    td1.appendChild(scrollDiv);
    td2.innerHTML += anotherTime + " 共" + tibeNums + "个话题需要签到&nbsp;&nbsp;";

    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&nbsp;:&nbsp;" + $CONFIG.nick;
    thDiv.appendChild(useIdDiv);

    //列表创建函数
    function creaseTable(UrlLength) {
        var cons = (UrlLength <= maxLines * 2) ? 2 : 3;
        if (tibeNums > 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) {
        if (tibeNums < 10) {
            var indexN = (n + 1).toString();
        } else if (tibeNums > 9 && tibeNums < 100) {
            if (n < 9) {
                var indexN = "0" + (n + 1);
            } else {
                var indexN = (n + 1).toString();
            }
        } else if (tibeNums > 99 && tibeNums < 1000) {
            if (n < 9) {
                var indexN = "00" + (n + 1);
            } else if (n >= 9 && n < 99) {
                var indexN = "0" + (n + 1);
            } else {
                var indexN = (n + 1).toString();
            }
        } else {
            if (n < 9) {
                var indexN = "000" + (n + 1);
            } else if (n >= 9 && n < 99) {
                var indexN = "00" + (n + 1);
            } else if (n >= 99 && n < 999) {
                var indexN = "0" + (n + 1);
            } else {
                var indexN = (n + 1).toString();
            }
        }
        return indexN;
    }

    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='http://www.weibo.com/p/" + allAncs[gg] + "' title='" + htNameF[gg] + "' target='_blank'><font color='blue'>" + htNameF[gg].reComLength() + "</font></a>";
        if (!todaySign[$CONFIG.nick])
            todaySign[$CONFIG.nick] = [];
        if (undoList.indexOf(htNameF[gg]) != -1) {
            Tds[gg].innerHTML = consNum(gg) + ".&nbsp;" + huatiName + " 用户指定不签到";
            if (gg + 1 < tibeNums && !Tds[gg + 1].innerHTML) {
                onebyone(gg + 1, "conti");
            }
        } else if (todaySign.date == fulltime && todaySign[$CONFIG.nick].indexOf(htNameF[gg]) != -1 && goorstop!="stop") {
            Tds[gg].innerHTML = consNum(gg) + ".&nbsp;" + huatiName + " 已有签到记录";
            if (gg + 1 < tibeNums && !Tds[gg + 1].innerHTML) {
                onebyone(gg + 1, "conti");
            }
        } else {
            Tds[gg].innerHTML = consNum(gg) + ".&nbsp;" + 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 : 'http://www.weibo.com/p/aj/general/button?ajwvr=6&api=http://i.huati.weibo.com/aj/super/checkin&texta=签到&textb=已签到&status=0&id=' + allAncs[gg],
                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(htNameF[gg]);
                        } else {
                            if (Object.prototype.toString.call(todaySign[$CONFIG.nick]) == "[object String]") { //清除旧版的不同格式记录
                                todaySign[$CONFIG.nick] = [];
                            }
                            if (todaySign[$CONFIG.nick].indexOf(htNameF[gg]) == -1) {
                                rqq = todaySign[$CONFIG.nick].push(htNameF[gg]);
                            }}
                            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) + ".&nbsp;" + 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(htNameF[gg] + "话题 访问超时!第" + (delayRetry + 1) + "次重试中...");
                                GM_setValue("delayRetry", delayRetry + 1);
                                onebyone(gg, "conti"); //再请求
                            } else {
                                Tds[gg].innerHTML = consNum(gg) + ".&nbsp;" + 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 < tibeNums && !Tds[dnn].innerHTML) {
                    onebyone(dnn, "conti"); //进行下一个话题的签到
                }
                Tds[hii].innerHTML = consNum(hii) + ".&nbsp;" + 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);
        }
    }
}