Greasy Fork

Greasy Fork is available in English.

Weibo Huati Check-in

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

当前为 2017-10-22 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name		Weibo Huati Check-in
// @description	超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( http://greasyfork.icu/scripts/152 )
// @version		0.1.2017102028
// @author		xyau
// @namespace	http://greasyfork.icu/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 / 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+)[^<]+(<div class=\\"WB_cardwrap(?:(?![^\\]")[^"]*\\")+(?![^\\]")[^"]+")/g.exec(text),
					dom = new DOMParser().parseFromString(html.replace(/\\["rnt]/g, ''), 'text/html'),
					lists = dom.querySelectorAll('.member_li');

				for (let i = 0; i < Math.min(lp * pageSize - htIdName.length, lists.length); i++) {
					let [_, hash, name] = /:100808([\w\d]+)&.*name=([^&]+)&/.exec(lists[i].getAttribute('action-data'));
					htIdName.push({
						hash,
						name
					});
				}

				if (nn === 1) //检查是否分页
					lp = Math.max(1, Math.min(lp, dom.querySelectorAll('a.page[href]').length));
				if (nn === lp) { //最后一页读取完毕,开始执行签到
					gowork(htIdName);
				} else //自调用,顺序循环
					setTimeout(getHuati(nn + 1, lp, domid), 200);
			},
		});
	}
}

//功能函数
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 + "个话题需要签到&nbsp;&nbsp;";

	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 = "昵称&nbsp;:&nbsp;" + $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].hash + "' title='" + htIdName[gg].name + "' target='_blank'><font color='blue'>" + htIdName[gg].name.reComLength() + "</font></a>";
		if (!todaySign[$CONFIG.nick])
			todaySign[$CONFIG.nick] = [];
		Tds[gg].innerHTML = consNum(gg) + ".&nbsp;" + 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) + ".&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(htIdName[gg].name + "话题 访问超时!第" + (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 = '#';
			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) + ".&nbsp;" + 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 = '<a  href="#"><em class="W_ficon ficon_checkin S_ficon">s</em><em class="S_txt1 signBtn">超话签到</em></a>';
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;
}
})();