通用_自动签到

自动或半自动地签到。

当前为 2023-06-21 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name               通用_自动签到
// @name:zh-CN         通用_自动签到
// @name:en-US         Uni_Auto sign
// @description        自动或半自动地签到。
// @version            3.0.0
// @author             LiuliPack
// @license            WTFPL
// @namespace          https://gitlab.com/LiuliPack/UserScript
// @match              *://*/*
// @supportURL         https://gitlab.com/liulipack/UserScript
// @grant              GM_registerMenuCommand
// @run-at             document-idle
// ==/UserScript==

/* 参数示范 / Config demo
{
    "remark": "备注",
    "url": "网址",
    "check": {
        "mode": ["0:元素属性", "1:元素文本", "2:元素存在"],
        "element": "元素选择器",
        "data": ["元素文本或元素属性键", "元素属性值"]
    },
    "sign": [
        {
            "remark": "备注",
            "data": "元素选择器",
            "data": () => { // 自定义脚本 },
            "delay": "0",
            "last": ["false:不是最后一步", "true:是最后一步"]
        }
    ],
    "refresh": "刷新页面",
    "close": "关闭页面"
},
{
    "remark": "Remarks",
    "url": "URL",
    "check": {
        "mode": ["0:Element Properties", "1:Element Text", "2:Element Existence"],
        "element": "Element Selector",
        "data": ["Element text or element attribute key", "Element attribute value"]
    },
    "sign": [
        {
            "remark": "Remarks",
            "data": "Element Selector",
            "data": () => { // Custom Script },
            "delay": "0",
            "last": ["false: Not the last step", "true: Is the last step"]
        }
    ],
    "refresh": "Refresh page",
    "close": "Close page"
}
*/

'use strict';

// 定义参数(config)和网页链接(URL)变量;快捷元素选择($('元素'))和关闭页面(close())函数。
let config = [
    {
        "remark": "Anime 字幕论坛_签到插件",
        "url": "https://bbs.acgrip.com/dsu_paulsign-sign.html",
        "check": {
            "mode": 2,
            "element": "#shuai_menu + table .tac a"
        },
        "sign": [
            {
                "remark": "选择心情",
                "data": "#yl",
                "delay": 0,
                "last": false
            },
            {
                "remark": "勾选不填写留言",
                "data": "#qiandao > table.tfm > tbody > tr:nth-child(1) > td > label:nth-child(3) > input[type=radio]",
                "delay": 0,
                "last": false
            },
            {
                "remark": "执行签到",
                "data": "#shuai_menu + table .tac a",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": false,
        "close": true
    },
    {
        "remark": "Anime 字幕论坛_Discuz 任务",
        "url": "https://bbs.acgrip.com/home.php?mod=task",
        "check": {
            "mode": 2,
            "element": "#ct a[href='home.php?mod=task&do=apply&id=1']",
        },
        "sign": [
            {
                "remark": "执行签到",
                "data": "#ct a[href='home.php?mod=task&do=apply&id=1']",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": false,
        "close": true
    },
    {
        "remark": "2DFun",
        "url": "https://2dfan.com/",
        "check": {
            "mode": 2,
            "element": "#do_checkin"
        },
        "sign": [
            {
                "remark": "执行签到",
                "data": "#do_checkin",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": true,
        "close": true
    },
    {
        "remark": "南+_接任务",
        "url": "https://www.south-plus.net/plugin.php?H_name-tasks.html.html",
        "check": {
            "mode": 0,
            "element": "#p_15 a",
            "data": ["title", "按这申请此任务"]
        },
        "sign": [
            {
                "remark": "接每日任务",
                "data": "#p_15 a",
                "delay": "0",
                "last": false
            },
            {
                "remark": "接每周任务",
                "data": "#p_14 a",
                "delay": "0",
                "last": false
            },
            {
                "remark": "前往完成任务页面",
                "data": () => { window.open('https://www.south-plus.net/plugin.php?H_name-tasks-actions-newtasks.html.html', "_self") },
                "delay": 3,
                "last": true
            }
        ],
        "refresh": false,
        "close": true
    },
    {
        "remark": "南+_完成任务",
        "url": "https://www.south-plus.net/plugin.php?H_name-tasks-actions-newtasks.html.html",
        "check": {
            "mode": 0,
            "element": "#both_15 a",
            "data": ["title", "领取此奖励"]
        },
        "sign": [
            {
                "remark": "完成每日任务",
                "data": "#both_15 a",
                "delay": "0",
                "last": false
            },
            {
                "remark": "完成每周任务",
                "data": "#both_14 a",
                "delay": "0",
                "last": true
            }
        ],
        "refresh": false,
        "close": true
    },
    {
        "remark": "绯月",
        "url": "https://bbs.kfpromax.com/kf_growup.php",
        "check": {
            "mode": 2,
            "element": ".gro_divhui:nth-child(5) + div a:not(a[href=\"javascript:;\"])"
        },
        "sign": [
            {
                "remark": "执行签到",
                "data": ".gro_divhui:nth-child(5) + div a:not(a[href=\"javascript:;\"])",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": false,
        "close": true
    },
    {
        "remark": "绅士仓库",
        "url": "https://cangku.moe/",
        "check": {
            "mode": 1,
            "element": ".footer li:nth-child(2) a",
            "data": ["签到"]
        },
        "sign": [
            {
                "remark": "执行签到",
                "data": ".footer li:nth-child(2) a",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": false,
        "close": false
    },
    {
        "remark": "紳士の庭",
        "url": "https://gmgard.moe/",
        "check": {
            "mode": 1,
            "element": "#checkw",
            "data": ["点此签到"]
        },
        "sign": [
            {
                "remark": "执行签到",
                "data": "#checkin",
                "delay": 0,
                "last": true
            }
        ],
        "refresh": false,
        "close": false
    }
],
    URL = location.href,
    $ = ele => document.querySelector(ele);
function close() {
    window.close();
};

// 等待 5 秒
setTimeout(() => {

    // 遍历配置信息
    config.forEach(data => {

        // 如果链接匹配且未签到
        if(URL === data.url && data.check.mode === 0 && $(data.check.element)?.getAttribute(data.check.data[0]) === data.check.data[1] ||
           URL === data.url && data.check.mode === 1 && $(data.check.element)?.textContent === data.check.data[0] ||
           URL === data.url && data.check.mode === 2 && $(data.check.element)) {

            // 执行签到
            data.sign.forEach(data => {

                // 等待延时
                setTimeout(() => {

                    // 判断模式并执行对应操作
                    typeof data.data === "string" ? $(data.data)?.click() : data.data() ;

                    // 如果是最后一步
                    if(data.last) {

                        // 根据参数刷新和关闭
                        data.refresh ? location.reload() : 0 ;
                        setTimeout(() => { data.close ? close() : 0 ; }, 500);

                    }

                }, data.delay * 1000);

            });

        }else if(URL === data.url) {

            // 根据参数刷新和关闭
            data.refresh ? location.reload() : 0 ;
            setTimeout(() => { data.close ? close() : 0 ; }, 500);

        }

    });

}, 5000);