通用_自动签到

自动或半自动地签到。

目前為 2023-06-21 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);