Greasy Fork

来自缓存

Greasy Fork is available in English.

超星职教云无敌我的世界专属自动评价评分课件 (我的世界史蒂夫专属)

我的世界!。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         超星职教云无敌我的世界专属自动评价评分课件 (我的世界史蒂夫专属)
// @namespace    http://tampermonkey.net/
// @version      1.21.130
// @description  我的世界!。
// @icon  data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAATlBMVEVSpTVRpDRJli9PoDNMmzEAAwABDgIAAAA9eydUqTY9eygCAAUJCAhdpEE2ZiQfRxUgQRU6diYGFQUOIgk3byRGeTEVGhFBgCpYqztis0Op4b1OAAAAiUlEQVR4AdXLBQ7EIBRF0Y9Td9v/QvG6xEZvhZecAH8YwjZiJ3ETbZAyzrmQEUAkhZmMblHYAtrOGFuMT/h8M0nTNPHo5hYhs+WFKXcTDkVRKUxlFMEpQqlHSsnpXlU33CJv6io6YiuW2g9il5m6G5SRSV5h1fdDZM6h76sjwjhN4+Y8hNDmfGsa0OAJeZWq1QUAAAAASUVORK5CYII=
// @author       热爱我的世界,漫威争锋,王者荣耀,揍击派对,超级鸡马,画画狼人杀的无敌史蒂夫
// @match        *://*.chaoxing.com/*
// @match        *://*.erya100.com/*
// @match        *://i.mooc.chaoxing.com/*
// @match        *://*.icve.com.cn/*
// @match        *://zjy2.icve.com.cn/*
// @include      *
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


    var STORAGE_KEY = "steve_custom_review_text";
    var my_text = localStorage.getItem(STORAGE_KEY) || "好";

    var loop_time = 2000;
    var wait_jump = 3000;
    var wait_expand = 2500;
    var max_try = 12;
    var start_step = 3;

    var is_submitted = false;
    var old_url = window.location.href;
    var is_jumping = false;
    var step = start_step;
    var last_len = 0;

    console.log("无敌史蒂夫V9.0启动!当前评价内容:" + my_text);


    function createGui() {
        var btn = document.createElement('div');
        btn.innerText = "🟩 点击开始/设置评价";
        btn.style.cssText = `
            position: fixed;
            top: 100px;
            right: 20px;
            background: #2ea44f;
            color: white;
            padding: 12px 20px;
            border-radius: 6px;
            z-index: 999999;
            cursor: pointer;
            font-weight: bold;
            font-family: "Microsoft YaHei", sans-serif;
            box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            border: 2px solid #fff;
            transition: all 0.3s;
        `;

        // 鼠标放上去的效果
        btn.onmouseover = function() { btn.style.transform = "scale(1.05)"; };
        btn.onmouseout = function() { btn.style.transform = "scale(1)"; };


        btn.onclick = function() {

            var input = prompt("亲爱的卡卡你要评价什么呀?", my_text);


            if (input !== null) {
                if(input.trim() === "") {

                    alert(" 不能填空的哦,已恢复默认!");
                } else {
                    my_text = input;

                    localStorage.setItem(STORAGE_KEY, input);
                    alert("设置成功!接下来的评价内容都是:\n" + input);
                    console.log("内容已更新为:" + my_text);
                }
            }
        };

        document.body.appendChild(btn);
    }

    function fakeInput(el, val) {
        if (!el || el.value === val) return;
        el.focus();
        el.value = val;
        el.dispatchEvent(new Event('input', { bubbles: true }));
        el.dispatchEvent(new Event('change', { bubbles: true }));
        el.blur();
    }

    function run() {

        if (window.location.href !== old_url) {
            console.log("页面变了,重置状态");
            old_url = window.location.href;
            is_submitted = false;
            is_jumping = false;
            step = start_step;
            last_len = 0;
            return;
        }
        if (is_jumping) return;

        if (!is_submitted) {
            doJob();
        }
    }

    function doJob() {
        var inputs = document.querySelectorAll('input[placeholder*="标题"], textarea[placeholder*="内容"]');
        var text_ok = false;
        var count = 0;


        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].offsetParent !== null) {

                if (inputs[i].value !== my_text) fakeInput(inputs[i], my_text);
                else count++;
            }
        }
        if (count > 0) text_ok = true;

        var star_ok = false;
        var stars = document.querySelectorAll('.el-rate__item');
        if (stars.length >= 5) {
            var s5 = stars[4];
            if (s5.offsetParent !== null) {
                var icon = s5.querySelector('i');
                if (icon && icon.classList.contains('el-icon-star-off')) s5.click();
                else star_ok = true;
            }
        } else {
            if(count > 0) star_ok = true;
        }

        if (text_ok && star_ok) {
            var btn = getSubmitBtn();
            if (btn && !btn.disabled) {
                console.log("搞定,提交!");
                btn.click();
                is_submitted = true;
                setTimeout(next, wait_jump);
            }
        }
    }

    function next() {
        if (isNone()) {
            console.log("没课了,开找目录");
            openMenu();
        } else {
            normalJump();
        }
    }

    function isNone() {
        var spans = document.querySelectorAll('.el-link--inner');
        for (var i = 0; i < spans.length; i++) {
            if (spans[i].innerText.trim() === "暂无") {
                var p = spans[i].closest('div') ? spans[i].closest('div').innerText : "";
                if (p.includes("下一个")) return true;
            }
        }
        return false;
    }

    function normalJump() {
        var t = null;
        var paths = ["//*[contains(text(), '下一个课件')]//a", "//*[contains(text(), '下一个课件')]/following-sibling::a"];
        for (var i = 0; i < paths.length; i++) {
            try {
                var r = document.evaluate(paths[i], document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
                if (r.singleNodeValue && r.singleNodeValue.offsetParent !== null) {
                    t = r.singleNodeValue;
                    break;
                }
            } catch(e) {}
        }
        if (t) t.click();
        else openMenu();
    }

    function openMenu() {
        is_jumping = true;
        var divs = document.querySelectorAll('div');
        var tab = null;
        for (var i = 0; i < divs.length; i++) {
            if (divs[i].innerText.trim() === "课件目录") {
                tab = divs[i];
                break;
            }
        }

        if (tab) {
            if (step === start_step) {
                tab.click();
            }
            setTimeout(findNext, 1500);
        } else {
            is_jumping = false;
        }
    }

    function fixTitle(t) {
        if (!t) return "";
        var s = t.replace(/\.(pdf|mp4|png|jpg|html|ppt|pptx|doc|docx|V2|v2)$/i, '').trim();
        s = s.replace(/^[\d\s\.]+/g, '');
        return s;
    }

    function clickIt(el) {
        if (!el) return;
        var ts = el.closest('.ts');
        if (ts) { ts.click(); return; }
        var fi = el.closest('.fIteml');
        if (fi) { fi.click(); return; }
        el.click();
    }

    function getItems() {
        var sels = ['.courseDataTree .tit', '.listItem .tit', '.fIteml .name', '.fIteml .tit', '.h3', '.title'];
        var all = Array.from(document.querySelectorAll(sels.join(',')));
        return all.filter(function(x) { return x.offsetParent !== null; });
    }

    function findNext() {
        var all = getItems();
        var len = all.length;
        var h1 = document.querySelector('.courseName');
        if (!h1) { is_jumping = false; return; }

        var myTitle = fixTitle(h1.innerText.trim());
        if (step === start_step) console.log("当前是:" + myTitle);

        var idx = -1;
        for (var i = 0; i < all.length; i++) {
            var txt = fixTitle(all[i].innerText);
            if (txt && (txt.includes(myTitle) || myTitle.includes(txt))) {
                idx = i;
                break;
            }
        }

        if (idx === -1) {
             if (step > start_step) {
                 setTimeout(findNext, 1000);
                 return;
             } else {
                var rows = document.querySelectorAll('.courseDataTree .ts');
                for (var k = 0; k < rows.length; k++) {
                    if (rows[k].getAttribute('data-op') !== '1') {
                        rows[k].click();
                        rows[k].setAttribute('data-op', '1');
                    }
                }
                setTimeout(findNext, wait_expand);
                return;
             }
        }

        if (idx !== -1) {
            if (last_len > 0 && len < last_len) {
                step = 1;
                var rIdx = idx + step;
                 if (rIdx < all.length) {
                    clickIt(all[rIdx]);
                    last_len = len;
                    setTimeout(findNext, wait_expand);
                    return;
                }
            }
            last_len = len;

            var aim = idx + step;
            if (aim < all.length) {
                var nextEl = all[aim];
                console.log("点这里:" + nextEl.innerText);
                clickIt(nextEl);

                setTimeout(function() {
                    if (window.location.href === old_url) {
                        step++;
                        if (step > max_try) step = start_step;
                        findNext();
                    }
                }, wait_expand);

            } else {
                console.log("到底了");
                is_jumping = false;
            }
        }
    }

    function getSubmitBtn() {
        var btns = document.querySelectorAll('button.el-button--primary');
        for (var i = 0; i < btns.length; i++) {
            if (btns[i].offsetParent !== null && btns[i].innerText.includes("提交")) {
                return btns[i];
            }
        }
        return null;
    }


    createGui();
    // 启动循环
    setInterval(run, loop_time);

})();