Weibo Huati Check-in

超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://gf.qytechs.cn/scripts/152 )

目前为 2017-10-20 提交的版本。查看 最新版本

// ==UserScript==
// @name                    Weibo Huati Check-in
// @description           超级话题集中签到,基于 congxz6688 的 tiebaAllsign ( https://gf.qytechs.cn/scripts/152 )
// @version                 0.1.2017102024
// @author                  xyau
// @namespace           https://gf.qytechs.cn/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: '/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);
});

// 隐藏游戏按钮,替换为超话签到
document.querySelector('a[nm="game"]').parentNode.style = 'display: none';
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
);
document.querySelector('.gn_nav_list li:last-child').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();
	}
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址