// ==UserScript==
// @name 自研 - 多个站点 - 自动签到
// @name:en_US Self-made - Multi-site - Auto Check-in
// @description 自动完成周期性签到。目前已适配中图网、阿里云开发者社区和母带吧音乐论坛。
// @description:en_US Automatically complete periodic check-ins. Currently compatible with options BooksChina, Alibaba Cloud Developer BBS, and MuDaiBa MUSIC BBS.
// @version 1.0.3
// @author CPlayerCHN
// @license MulanPSL-2.0
// @namespace https://www.gitlink.org.cn/CPlayerCHN
// @match https://www.bookschina.com/vieworder/default.aspx
// @match https://link.bilibili.com/p/center/index
// @match https://live.bilibili.com/*
// @match https://developer.aliyun.com/
// @match https://developer.aliyun.com/?accounttraceid=*
// @match https://developer.aliyun.com/live/251214
// @match https://developer.aliyun.com/score
// @match https://mudaiba.com/
// @exclude https://mudaiba.com/user-login.htm
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant GM_openInTab
// @grant window.close
// @run-at document-idle
// @noframes
// ==/UserScript==
/*
{
"name": "[站点名称]( - 签到项)",
"enable": ["true 启用", "false 禁用"],
"url": /页面正则/,
"checks": {
"login": { // 登录状态检测
"enable": ["true 启用", "false 禁用"],
"mode": ["elm 元素存在", "text 元素内文本", "attribute 元素属性"],
"elm": "元素选择器",
"data": ["元素内文本或元素属性键", "元素属性值"]
},
"signIn": { // 签到检测
"mode": ["elm 元素存在", "text 元素内文本", "attribute 元素属性"],
"elm": "元素选择器",
"data": ["元素内文本或元素属性键", "元素属性值"]
},
},
"actions": {
"signIn": [
{
"name": "行动名称",
"mode": ["click 点击元素", "open 新建页面", "openSelf 当前页面跳转", "reload 重载页面", "close 关闭页面", "script 脚本"],
"data": "元素选择器或页面链接",
"sleep": "执行前等待(单位为秒)"
}
],
"unLogin": [],
"hasSignIn": [
{
"name": "关闭页面",
"mode": "close",
"data": "",
"sleep": 1
}
]
}
},
*/
(function() {
'use strict';
// 定义「配置信息」「网页标题」变量和「元素选择器」「操作执行」函数
const config = [
{
"name": "中图网",
"enable": true,
"url": /https:\/\/www.bookschina.com\/vieworder\/default.aspx/,
"checks": {
"login": {
"enable": true,
"mode": "",
"elm": "",
"data": [""]
},
"signIn": {
"mode": "text",
"elm": ".signBtn a",
"data": ["签到送书币"]
},
},
"actions": {
"signIn": [
{
"name": "打开签到弹框",
"mode": "click",
"data": ".signBtn a",
"sleep": 2
},
{
"name": "点击签到按钮",
"mode": "click",
"data": ".flopCon #cover1",
"sleep": 2
},
{
"name": "关闭页面",
"mode": "close",
"data": "",
"sleep": 6
}
],
"unLogin": [],
"hasSignIn": [
{
"name": "关闭页面",
"mode": "close",
"data": "",
"sleep": 1
}
]
}
},
{
"name": "阿里云开发者社区 - 签到",
"enable": true,
"url": /https:\/\/developer.aliyun.com\/(\?accounttraceid=\w+)?$/,
"checks": {
"login": {
"enable": true,
"mode": "text",
"elm": ".aliyun-register",
"data": ["登录/注册"]
},
"signIn": {
"mode": "elm",
"elm": ".user-sign-day-box.active .user-sign-day-box-num",
"data": [""]
},
},
"actions": {
"signIn": [
{
"name": "点击签到按钮",
"mode": "click",
"data": ".user-sign-day-box.active .user-sign-day-box-num",
"sleep": .5
},
{
"name": "打开视频任务页面",
"mode": "openSelf",
"data": "https://developer.aliyun.com/live/251214",
"sleep": .5
}
],
"unLogin": [
{
"name": "访问登录页面",
"mode": "click",
"data": ".aliyun-register",
"sleep": 0
}
],
"hasSignIn": [
{
"name": "关闭页面",
"mode": "close",
"data": "",
"sleep": 1
}
]
}
},
{
"name": "阿里云开发者社区 - 视频任务",
"enable": true,
"url": /https:\/\/developer.aliyun.com\/live\/251214/,
"checks": {
"login": {
"enable": true,
"mode": "text",
"elm": ".aliyun-register",
"data": ["登录/注册"]
},
"signIn": {
"mode": "elm",
"elm": "114514",
"data": [""]
},
},
"actions": {
"signIn": [
{
"name": "将视频静音",
"mode": "script",
"data": () => {
function waitForElm(selector) {
// https://stackoverflow.com/questions/5525071/how-to-wait-until-an-element-exists
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
observer.disconnect();
resolve(document.querySelector(selector));
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
};
waitForElm('video').then((vid) => {
document.querySelector('video').muted = true;
})
},
"sleep": 0
},
{
"name": "打开积分领取页面",
"mode": "openSelf",
"data": "https://developer.aliyun.com/score",
"sleep": 120
}
],
"unLogin": [
{
"name": "访问登录页面",
"mode": "click",
"data": ".aliyun-register",
"sleep": 0
}
],
"hasSignIn": [
{
"name": "关闭页面",
"mode": "close",
"data": "",
"sleep": 1
}
]
}
},
{
"name": "阿里云开发者社区 - 积分领取",
"enable": true,
"url": /https:\/\/developer.aliyun.com\/score/,
"checks": {
"login": {
"enable": true,
"mode": "text",
"elm": ".aliyun-register",
"data": ["登录/注册"]
},
"signIn": {
"mode": "elm",
"elm": ".user-level-bottom-box-wrapper-button",
"data": [""]
},
},
"actions": {
"signIn": [
{
"name": "点击签到按钮",
"mode": "click",
"data": ".user-level-bottom-box-wrapper-button",
"sleep": 3
},
],
"unLogin": [
{
"name": "访问登录页面",
"mode": "click",
"data": ".aliyun-register",
"sleep": 0
}
],
"hasSignIn": []
}
},
{
"name": "母带吧音乐论坛",
"enable": true,
"url": /https:\/\/mudaiba.com\//,
"checks": {
"login": {
"enable": true,
"mode": "elm",
"elm": ".nav-link[href=\"user-login.htm\"]",
"data": [""]
},
"signIn": {
"mode": "text",
"elm": "#header .navbar-nav:nth-child(2) li:nth-child(5) a",
"data": [" 签到"]
},
},
"actions": {
"signIn": [
{
"name": "点击签到按钮",
"mode": "click",
"data": "#header .navbar-nav:nth-child(2) li:nth-child(5) a",
"sleep": 0
},
],
"unLogin": [
{
"name": "访问登录页面",
"mode": "click",
"data": ".nav-link[href=\"user-login.htm\"]",
"sleep": 0
}
],
"hasSignIn": []
}
}
],
title = document.title;
function $(elm, node = 0) {
try {
return document.querySelectorAll(elm)[node]
}catch (e) {
return true
}
}
function action(data) {
document.title = `[正在执行「${data.name}」中]${title}`
// 等待指定时间加噪音时间后,正式执行对应操作
setTimeout(() => {
if(data.mode === "click" && $(data.data)) {
$(data.data).click();
}else if(data.mode === "open") {
GM_openInTab(data.data, {"active": true})
}else if(data.mode === "openSelf") {
window.open(data.data,"_self")
}else if(data.mode === "reload") {
location.reload()
}else if(data.mode === "close") {
window.close()
}else if(data.mode === "script") {
data.data()
}
}, (data.sleep + Math.random()) * 1000);
}
// 等待 3 秒
setTimeout(() => {
// 遍历「配置信息」
config.forEach((datas) => {
// 如果匹配且配置启用
if(datas.url.test(location.href) && datas.enable) {
document.title = `[已匹配规则「${datas.name}」]${title}`
// 判断是否登录,如果未登录就执行对应操作
if(datas.checks.login.enable && datas.checks.login.mode === "elm" && $(datas.checks.login.elm) || datas.checks.login.enable && datas.checks.login.mode === "text" && $(datas.checks.login.elm) && $(datas.checks.login.elm).textContent === datas.checks.login.data[0] || datas.checks.login.enable && datas.checks.login.mode === "attribute" && $(datas.checks.login.elm) && $(datas.checks.login.elm).getAttribute(datas.checks.login.data[0]) === datas.checks.login.data[1]) {
document.title = `[未登录]${title}`
datas.actions.unLogin.forEach((data) => {
action(data)
})
// 判断是否签到,如果未签到就执行对应操作
}else if(datas.checks.signIn.mode === "elm" && $(datas.checks.signIn.elm) || datas.checks.signIn.mode === "text" && $(datas.checks.signIn.elm) && $(datas.checks.signIn.elm).textContent === datas.checks.signIn.data[0] || datas.checks.signIn.mode === "attribute" && $(datas.checks.signIn.elm) && $(datas.checks.signIn.elm).getAttribute(datas.checks.signIn.data[0]) === datas.checks.signIn.data[1]) {
document.title = `[签到中]${title}`
datas.actions.signIn.forEach((data) => {
action(data)
})
// 否则就执行已签到对应操作
}else {
document.title = `[已签到]${title}`
datas.actions.hasSignIn.forEach((data) => {
action(data)
});
}
}
});
}, 3000);
})();