// ==UserScript==
// @name         广东省国家工作人员学法考试系统自动刷课&&2025年自动考试
// @namespace    http://tampermonkey.net/
// @version      2025.11.11
// @description  广东省专用
// @author       yygdz1921&hzqim
// @match        http*://xfks-study.gdsf.gov.cn/study/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=gdsf.gov.cn
// @require      https://fastly.jsdelivr.net/npm/sweetalert2@11
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
    var log = console.log;
    log("load...");
    function main() {
        log("main...");
        study();
    }
    // 考试
    function exam() {
        log("exam...");
        var answers = [
            //2025年题库
    {"q": "习近平总书记在中国共产党第二十次全国代表大会上的报告中指出", "a": "B"},
    {"q": "习近平总书记2020年11月16日在中央全面依法治国工作会议上的讲话指出", "a": "A"},
    {"q": "习近平总书记在中国共产党第二十次全国代表大会上的报告中指出", "a": "B"},
    {"q": "作出关于全面推进依法治国若干重大问题的决定", "a": "C"},
    {"q": "执行全国代表大会的决议,领导党的全部工作,对外代表中国共产党", "a": "C"},
    {"q": "对于党员因不服纪委或者其他党组织给予本人的处理", "a": "C"},
    {"q": "党政领导干部选拔任用工作条例", "a": "C"},
    {"q": "政法工作条例", "a": "A"},
    {"q": "信访工作条例", "a": "D"},
    {"q": "政治协商工作条例", "a": "A"},
    {"q": "党政机关厉行节约反对浪费条例", "a": "C"},
    {"q": "落实全面从严治党主体责任规定", "a": "B"},
    {"q": "统一战线工作条例", "a": "D"},
    {"q": "全国人民代表大会会议每年举行一次", "a": "D"},
    {"q": "反间谍法", "a": "B"},
    {"q": "反恐怖主义法", "a": "B"},
    {"q": "保守国家秘密法", "a": "C"},
    {"q": "国家坚持经济建设和国防建设", "a": "A"},
    {"q": "科学技术进步法", "a": "A"},
    {"q": "优化营商环境条例", "a": "A"},
    {"q": "张三和李四是邻居", "a": "C"},
    {"q": "国内国际双循环相互促进的新发展格局", "a": "C"},
    {"q": "未成年人网络保护条例", "a": "C"},
    {"q": "古树名木保护条例", "a": "D"},
    {"q": "政务数据共享条例", "a": "C"},
    {"q": "住房租赁条例", "a": "A"},
    {"q": "反不正当竞争法", "a": "C"},
    {"q": "监察法", "a": "B"},
    {"q": "能源法", "a": "D"},
    {"q": "治安管理处罚法", "a": "C"},
    {"q": "法治宣传教育法", "a": "A"},
    {"q": "公职人员政务处分法", "a": "A"},
    {"q": "行政处罚法", "a": "A"},
    {"q": "行政诉讼法", "a": "B"},
    {"q": "重大行政决策程序暂行条例", "a": "C"},
    {"q": "立法法", "a": "A"},
    {"q": "公司法", "a": "C"},
    {"q": "统计法", "a": "B"},
    {"q": "刑法", "a": "D"},
    {"q": "全国人民代表大会和地方各级人民代表大会代表法", "a": "D"},
    {"q": "中共中央关于进一步全面深化改革推进中国式现代化的决定", "a": "ACD"},
    {"q": "坚持党的领导,是社会主义法治的根本要求,是党和国家的", "a": "AB"},
    {"q": "党章规定,国有企业党委", "a": "BCD"},
    {"q": "推进领导干部能上能下规定", "a": "ABC"},
    {"q": "重大事项请示报告条例", "a": "AB"},
    {"q": "机构编制工作情况和纪律要求执行情况应当纳入", "a": "ABCD"},
    {"q": "中国共产党问责条例", "a": "ABD"},
    {"q": "国家保护和改善", "a": "AB"},
    {"q": "突发事件应对法", "a": "ABC"},
    {"q": "国家安全法", "a": "ABCD"},
    {"q": "赵某在下班途中看到一位老人摔倒在地", "a": "ACD"},
    {"q": "中华人民共和国国防教育法", "a": "BC"},
    {"q": "增值税法", "a": "ABCD"},
    {"q": "国家实行公民终身法治教育制度", "a": "ABC"},
    {"q": "公务员法", "a": "AB"},
    {"q": "行政强制法", "a": "ABC"},
    {"q": "循环经济促进法", "a": "BCD"},
    {"q": "未成年人保护法", "a": "ABCD"},
    {"q": "预防未成年人犯罪法", "a": "BD"},
    {"q": "负有法治宣传教育职责的部门", "a": "ABD"},
    {"q": "中国共产党纪律检查委员会工作条例", "a": "对"},
    {"q": "部门规章和规范性文件不得就机构编制事项作出具体规定", "a": "对"},
    {"q": "中国共产党纪律处分条例", "a": "错"},
    {"q": "中国共产党党内监督条例", "a": "错"},
    {"q": "中国共产党党组工作条例", "a": "错"},
    {"q": "中小企业促进法", "a": "对"},
    {"q": "金融机构违反与民营经济组织借款人的约定", "a": "对"},
    {"q": "保障中小企业款项支付条例", "a": "错"},
    {"q": "中华人民共和国国防动员法", "a": "对"},
    {"q": "农村公路条例", "a": "对"},
    {"q": "农村集体经济组织法", "a": "错"},
    {"q": "县级以上人民政府司法行政部门应当建立法治文化场所名录", "a": "错"},
    {"q": "行政复议法", "a": "对"},
    {"q": "行政许可法", "a": "错"},
    {"q": "反垄断法", "a": "错"},
    {"q": "中华人民共和国国家安全法", "a": "错"},
    {"q": "网络安全法", "a": "错"},
    {"q": "外商投资法", "a": "对"},
    {"q": "公共安全视频图像信息系统管理条例", "a": "对"},
    {"q": "国家赔偿法", "a": "错"},
    {"q": "数据安全法", "a": "对"}, 
        ];
        var items = document.getElementsByClassName("item");
        if (answers.length < items.length) {
            Swal.fire("脚本内置答案数量小于当前试题数量,无法答题!!!");
            return;
        }
        function abcd_to_index(s) {
            var l = [];
            for(let i = 0; i < s.length; i++){
                let char = s[i];
                if(char === "a" || char === "A"){ l.push(0);}
                else if(char === "b" || char === "B"){ l.push(1);}
                else if(char === "c" || char === "C"){ l.push(2);}
                else if(char === "d" || char === "D"){ l.push(3);}
                else if(char === "e" || char === "E"){ l.push(4);}
                else if(char === "f" || char === "F"){ l.push(5);}
                else if(char === "g" || char === "G"){ l.push(6);}
                else if(char === "对"){ l.push(0);}
                else if(char === "错"){ l.push(1);}
            }
            return l;
        }
        let count = 0;
        for (let index = 0; index < items.length; index++){
            let item = items[index];
            let question = item.getElementsByClassName("question-title")[0].innerText
            let answer = null;
            for(let i = 0; i < answers.length; i++){
                if(question.includes( answers[i].q)){
                    answer = answers[i];
                    break;
                }
            }
            if(!answer){
                // 变色标记
                item.style.background="yellow";
                // 计数&&弹窗
                count = count + 1;
                let msg = `【${question}】\n\n此题没有配置答案,已经自动跳过,请自行谷歌!!!`;
                log(msg);
                alert(msg);
                continue;
            }
            let options = item.getElementsByClassName("question-option");
            let a_list = abcd_to_index(answer.a);
            for(let i = 0; i < a_list.length; i++){
                let a = a_list[i];
                options[a].getElementsByTagName("label")[0].click();
            }
        }
        let txt = "【广东省学法考试年度考试】已经自动作答完毕,请认真核对,手动交卷!";
        if(count > 0){
            txt = `【广东省学法考试年度考试】已经自动作答完毕,因题库不足已跳过【${count}】题,请自行作答。最后,请认真核对,手动交卷!`;
        }
        Swal.fire(txt);
    }
    // 刷分
    function study() {
        log("study")
        var pathname = window.location.pathname;
        if (pathname.includes("index")) {
            log("index...");
            var all_finish = true;
            var cols = document.getElementsByClassName("column");
            for (let index = 0; index < cols.length; index++) {
                var col = cols[index];
                var catalogdesc = col.getAttribute("catalogdesc");
                var course = col.querySelector(".card.current").innerText.replace(/\s+/g, "");
                if (catalogdesc.includes("庭审") || catalogdesc.includes("题库")) {
                    continue;
                }
                // 判断是否完成
                var btn = col.getElementsByClassName("btn")[0];
                if (btn) {
                    log("未完成", col);
                    all_finish = false;
                    btn.click();
                    break;
                } else {
                    log(catalogdesc, course);
                }
            }
            if (all_finish) {
                Swal.fire({
                    icon: "success",
                    title: "全部课程已经学习完毕!",
                    html: `请在规定时间自行进入考场作答!<br>开始考试后,按一下键盘<strong style="color: red;">【G】</strong>键!`,
                });
            }
        } else if (pathname.includes("chapter")) {
            log("chapter...");
            var ms = 3000 + Math.floor(Math.random() * 1000);
            submitLearn();
            Swal.fire({
                title: "学习强国",
                text: `自动学习中,【${ms}】【毫秒】后自动跳转!`,
                timer: ms,
                timerProgressBar: true
            });
            setTimeout(() => {
                var next_chapter = document.querySelector(".next_chapter")
                if (next_chapter) {
                    next_chapter.click();
                } else {
                    window.location.pathname = "study/index";
                }
            }, ms);

        } else if (pathname.includes("course")) {
            log("course...");
            var finish = true;
            var lis = document.getElementsByClassName("chapter")[0].getElementsByTagName("li");
            for (let index = 0; index < lis.length; index++) {
                var li = lis[index];
                var sub_title = li.getElementsByClassName("sub_title")[0].innerText;
                if (sub_title.includes("获得") || sub_title.includes("未开放")) {
                    continue;
                }
                finish = false;
                li.querySelector(".title a").click();
                break;
            }
            if (finish) {
                //document.querySelector(".menu-ic-note").click();
                let ms = 3 * 1000;
                Swal.fire({
                    icon: "question",
                    title: "温馨提示",
                    text: `本页课程已经学完,${ms / 1000}秒后将返回主页,点击按钮留在当前页面。`,
                    confirmButtonText: "留在当前页",
                    timer: ms,
                    timerProgressBar: true,
                }).then((result) => {
                    if (result.isConfirmed) {
                        console.log('确定按钮被点击,取消执行函数 f');
                    } else {
                        // 只有在用户未点击确定按钮且定时器结束时才执行 f
                        document.querySelector(".menu-ic-note").click();
                    }
                });
            }
        } else if (pathname.includes("login")) {
            log("login...")
        } else if (pathname.includes("exam")) {
            log("exam...")
        } else {
            log("未知页面", pathname);
        }
    }

    if (document.readyState === "complete") {
        // DOM 已经加载完成
        main();
    } else {
        // DOM 还未加载完成
        // document.addEventListener("DOMContentLoaded", main);
        window.addEventListener("load", main);
    }

    document.addEventListener("keydown", function (event) {
        log("keydown", event.code);
        if (event.code === "KeyG") {
            exam();
        } else if (event.code === "KeyT"){
            let ms = 3000;
            Swal.fire({
                title: "学习强国",
                text: `自动学习中,【${ms}】【毫秒】后自动跳转!`,
                timer: ms,
                timerProgressBar: true
            });
        }
    });
})();

标签: none