uestc全自动党旗飘飘刷课工具(webvpn版)

非常感谢同济大佬Hyoung提供的脚本,请大家支持https://github.com/Flesymeb。但是因为它有一些问题,所以我二次开发了这一版。

// ==UserScript==
// @name         uestc全自动党旗飘飘刷课工具(webvpn版)
// @namespace    https://uestc
// @version      1.0.0
// @description  非常感谢同济大佬Hyoung提供的脚本,请大家支持https://github.com/Flesymeb。但是因为它有一些问题,所以我二次开发了这一版。
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAF4hJREFUeF7tnQlwHNWZx//f69FlWRaWfGACBGKHcNgblwEnBBNDINfiSkLMkQopIMkSWzOaMVpTIalUsk4qgYRTmpFke4srCdlssgshkMPeZUPCZe6Yy8YYg7HB+LYij47RTPe31ZJHHo2mZ7rnaKlH31SpTKnf8b3/ez/939f9eiDIRxQQBSwVINFGFBAFrBUQQGR1iAJZFBhzQK67bu0sXU8sIcLnmTEHoJlEmMGMvQDvIaI3mHk9oD8YiYT2yWyKAm4qMGaAXHfd6pN03bgRoK8QwUYcbAD0y0SCv9/ZGdjppkjS18RVwMbCLL44wWDnDUT4ab4tGwYH2tsDnfnWl3qigF0FXAVk1apV6sCB6fcQ0VV2A8xS7vZwuOl6gLgIbUkTokBGBVwFJBTq/BWArxY6F8wMosHQbw+H/SsLbU/qiwJWCrgGSCjUYf61v8XOVKQAkLE4swEiNXiNmb8WiQRM8OQjChRdAVcACQbXzgb0LUTQ7IzAGSDoZ9Znt7cHd9lpW8qIAk4UcAWQUKjjzwB9zm5gTgA54iK/iEQCV9ttX8qJAnYVKDkggUD7Ak1TL+QKqKFhChYvXoCPfvQUxGJxRKO92Lz5bTz77Gvo7u4ZUT11i5W8kEjwiaW8/ev3d5zg8+EMgE4H+ERmzABoOhGONf/7yLObQ0TYf+QZzkEA+4hoj2Fgk2HwI52dgd25dJDr40uBkgMSDHb+kAg/yDbs+fNPwZe+dP5wkSQgyV+sW7cBW7fuGL6eCRAATeGwf00x5G1q6pxaUYGlAH8coNMAzANQV4S2tzDjz0R8fzgceKII7UkTJVbABUA6XiCiBVbjOO20k3HFFZ8ecTkdEPPigw/+FTt37hkslwkQZn44Egl8IV+9li9fPcOEgshYCtCF+bZjtx4zvwvgN0rhN21tgefs1pNy7ipQckBCoc6szylWrrwSdXW1OQHZv78Lv/71ektAALwfDvuPcyJfS8vtNbpe/Q1mXEGE85zULXLZrQBuCof99xS5XWmuQAVKCsjKlWunxeO65fmpWbOmYdmyL48aQiYHMQvdffdD6Onpy+gg5vVw2G9rPKHQ2hOBxL8C9I0ibZ0KnIah6sz8ilLayra25f9blAalkYIVsLWg8u2luXntqUrpm63qn3HGbFx22ejdjBUgf/jD43j77V2WgDBrcyKRZdus+gsGO88DOATQJXZvOec79gLr3adplSvuuONfzERfPmOoQEkBCYVWzwX4FavatZsHSpd+ybaDrF+/AW+8sUMSEA3LhptuPTXHgqF2r4C6PoBjx1BbjAbgAIhdN7GH3AR7laJvt7U1/WEMc8boffeeakCCwc6LiPgxQDMrxURXEYMGIdRowI1PHY9k9+mMrjCjR9Q5CQhQWZ/4sUvEP89pXShbPAXKEpBQqOMT5jktgD5WDKeOq2R8uNrAzAogGnxAY10VZtRV5Ww6ZgDbewzBn1e6EtiNXXvIVDE8X2ZZHjOeZVavltMCsUVfAlQFIFa8kDVeAPkLVersWh3zag2cUm2gNv2AzOTJgM/nuIudB/vw9MEEno9q6OeR0ufadj19dMTlkYj/b447lgp5K1BWgJi3egHMyletBs3AonqDH68xUKuynZ3OE5DD3b3oi8UHg9vYo7ChW+GgPnToMvmxAcp3IhH/z/Ido9RzpkC5AZJ19FaLb/4kHecWMXBKjWFPvSIAkuzo9V7Cnw750JfmKOZ1q5yFmR+oqqq76tdbrxp5BsdexErqUAFJiwhIYxTjp0kHHaA7fufQEBDnnat+g/CHgwrv94/ci+XzU2Y+V1NQwdaWwOWt9EdrAMpaqFA2QKSaXGZv6tWwPn1Oiiu11Azcndjf5EUGZBkx89FFf6nK1tuY4J8dMqYOUpELeGw/077wUtJJwqUHSBWf3V9xFg8RcenjykAjKSyJQLEbP6dGOG/9/tGJfHZJtU8AKlUxdfb2q4dOqwmn6IpUAaAcMpePfNwzpqsY1GdgROqDPiKMeISAmLO7OEE8NsDPuyOZ7a4zO4I86i96SY/L9rq8FBDoVDncmZ8FuAEEZ4LhwM3FyP8YiwXyzjceJKebZ9+fKWBJQ06Gn1DOUaDjz0BSFLQhw9qeLnX1kuYw3NgJvCVlb5lt922bH8xFsh4b+O66+44Rter1hNhYWqszHgESCyNRELdhYzB04AYBkOp0UMwXeJT9QmcPXnkXSmvAWJO7AtRhXVZ8hLzD4SZl6Q+gGTmfcz4bnt74K5CFsd4r3vkZbz/AvChTLEy40eRiP/fChlH2QFyarWOz0w1UJfhzpQXATEnd098KC/p0q2nKxMoAG8k4hVtbc2PFbJIxmPd5uaOFqXo9hy52ZORiH9RIfGXFSCfOyaBM9NcI1UcrwJijmHAAP50SMNrfdm3XJlBwf1K0fWtrU3bC1ks46FuKNRxAUCtAP4pVzzM6I1E/CNfNspVKe16WQHyrZlxTK+wfqbhZUCS82Y+gV93SINu49taMzxovBXQIuHwsqPvLztcMGNV3Hy3aGAgcQsRXeMkBrvvCFm16WlA0hfARADEnMh9g1subdQxlcz78EyHIfn3ANaEw4F1ThbbWJUNBjvMLwdcRUSTncYwoQFJT9InCiDmIokz4S9dhOd7sh+azHG2a7th8NpEQt29Zk2TeRhy3Hz8/o7JSuEqInyPiBy9Sp06CAEk5S7WRAIkuQhMN/njIQ3vDdh/ZmLhNA8w08/b2/0PjRUl11//i9r+/sNLlKKlAC4rRhwCyAQHJLmIXu5VeLRLQ9Rwdow+fREy827zfzOhlHF/W1vzM8VYpNnaaGlZ/YFEwlhCREsAmD9F/QggAsjwgkow4bko4cluDbEjp4NzHZ/PtRqZ+UWAniHCRmbaWFNTufnmm795OFc9q+stLXc2JBKxs4hwITM+T0Tmd46V7COACCCjFpd5OvixbhMWn633352uTmbeBdAmIpgnic13cLoB6jYM/gdAUaX0aYCazoxGIp5pfgPl0DdR8ulENN1pf4WUF0AEEMv105UgPNqlsCntGH0hC2681J1Xr+HiWT7cu30Au/utb+0LIAJI1jVrfrFEHys80qXwXNTZua7xAkNqHHOnKHx2ViVOnDSUa924qR97YgLIoBjpX/szkW/z2l28JiD1R+4E748Tno0qbIwq7Enk+zKM3Z6LV65CAR9v0LB4RgWmV428CSGApOgsgDhfdKmApNY2z3c91a2w4fDRhN5566WtMauacM60Cixs0Aa/WinTRwARQApahVaAJBuNM/BsVMNrPYQ3+9Xw3a+COi2gsvnG59kNGhY2Vgxvo7I1d+OmPuyJWZeQHERykJw5SHKLZWfdmm80bulTeL1XYVus9NuwKgV8qJYwu86HOZMVTq511qc4iDiInXVtWSaXg+RqfOeAwq4Y8P4AwfzvnTHK22Wm+hhTFOPYSsbxVYyT6qtwYn1lrhCyXr9pc7/cxUoqJDmI87VUKCCZeuwzgG6dBn/MW8nmvwPG0J0k09AnKQy+j1OnJf/lzF+QUVsLVFQ4H1RKDXEQcZCCFlApACkooNTKRQDkJ5v6sdfiNi8zxyKRQHUh8Xr6uLvc5s099QKIADK8Sibiad5ciAggAogAkoUSAUQAEUAEkIwKSA6S9rU/ssUavU7EQcRBxEHEQcRBTAXkOUiulFwcJFUB2WLJFisnMbLFki2WbLFkiyVbLNli5TSLjAXEQcRBxEHEQcRBxEHEQTIpIGexUlSRu1jOIZEtlmyxZIslWyzZYskWy7l7mDXEQcRBxEHEQcRBxEHEQSRJP6JALBZHNNo7Sg9J0p1DIlss2WLJFku2WLLFki2Wc/eQJF3eSR/xv4GW90FGQyRbLNliyRZLtliyxZItlmyx5C6W3MXKjwJxEHEQcZD82JEcRHIQyUHEQcRBxEHEQSQHkRwkPwrEQcRBxEHyY0dyEMlBJAcRBxEHEQcRB5EcRHKQ/CgQBxEHEQfJjx3JQSQHkRxEHEQcRBxEHERyEMlB8qNAHEQcRBwkP3YkB5EcRHIQcRBxEHEQcRDJQSQHyY8CcRBxEHGQ/NiRHERyEMlBxEHEQcRBxEEkB5EcJD8KxEHEQcRB8mNHchDJQSQHEQcRBxEHEQeRHERykPwoEAcRBxEHyY8dyUEkB5EcRBxEHEQcRBxEchDJQfKjQBxEHEQcJD92JAeRHERyEHEQcRBxEHEQyUEkB8mPAnEQcRBxkPzYkRxEchDJQcRBxEHEQcRBJAeRHCQ/CsRBxEHEQfJjR3IQyUFKloMc1gl740M/h+JAnwHEmNCvfIP/GgzU+AjVCqjWCLU+Qn0FYWolYWoFMMO8kPI53N2Lvlg8v5WeZ61yB+TGTf3YE2NLdcJhP+Up3WC1girn6jgUWj0X4Fesys2bNwdLl35q1OVYLI5otHfU79ev34A33tgBZgNECobBUOroEL41M47pFdZiNfgYPosR9xvA1n6FbX2E7TGF9wYIA1y4PMfVKMyZrHByrcIsjkHTBZDhia2tBSoqci2jrNcFkBR5ig3Itn7CKz0KW/oUdsVH/rUvaNYsKjMDx1UZmDfJ/GFUK2uYi9V/+TtIH/bErNUSB3HoILsGCC9GFV7o0dCtF+4QThayCQildPnhagMLJhuYU204acZRWQFEtlg5cxAzl3ipR+HVHuCArjlaYMUsnA5Isu0GzcDZdQbm1xqWW8B84yh/QCQHGV4bTrdY7w8QHu/WBnML88PMoNQ/4fmuujzrWQGSbM5czOfU6Th3SvEcRQARBxnlINv7CU8f1rAtNjKvGGtA7HJVrwxcdIyOUycVnqOUPyCSg9h2kPPqEnitV+GgnjnhHk+A5HITc9AnVRpY0qCj3pc/KALIBHYQO4ss9a+2k/LM3A3Q8wBvY8ZbSvFbAL2rFA4Bvq7W1mXvX3/9L2oHBvoadT0+TSnVQETTAG4EeDozFhDROQCmZXOOXNBqYFx4jIGzJ+t2DWhEuXIH5KbN/djdL89BBic9Vw6SvoLMxWd+bOYdO5j5ISJ+HPD9PRxevjWvFZlWKRhcOxtIfJ6IrgFwZuY2GUPwWt9VO+GIm5jPcpx8yh0QeQ6SshryASQ7HLwRoF8qxX9ubQ1sdrLw8inr93fM0TT6FhFfC9AxTtsw3eSShgQ+4iA3KX9AJAexnYPYvFO1H+BfGYZxV3t70PIpv9PF66R8S8vtNYlE1VVEWAHQaSO3gbldb1FdAovr7d3pKn9A5DavLUBy7eWZ8Vdm3NXe7r/PyWIuddlgsONSIvxoJChDW65s20PzIeMljToqKPuWq/wBEQexBYjVQmbGg8z6D8bKLewCFgq1X85MPyGiOemOYrVNbPQZuHyajmx5SbkDIkl6lhwEMP96Zk5smbEeoO9GIk1/t7tIx0O5YLDzp0S4YSQkSTcZHWElMb7cmMDs6sxOUs6A9CQYt26J4eCA3MUaXBnpSXqmBc2Ml4iMleFw8/+NhwWfTwzNzWvOItLvJaIz7LrJ4ikJLMrwBL7cAIkbwKZuHZv+kcCLXQYGcqRiE/qwYvriMwxe1d4e+GE+i3I81gkGO/+TCFfYjc080/XPDTo+WHX0L2q5APL6YQN/Pxi3BUWqXgLIiNVD88LhplftLigvlMu05UrGbfXg8/QaHefVG5jmY3gVkN4EDzlFt4FX/6EjZu+m3YgpZeZ3I5HACYXMc0nPe5f6hanRAy8/QMwxBoMd1xLRv1tsKc1jmBkfMppHVT4xRcfH6vJYXYWsKrt1016YMrdLL3XpeO5gAlsOFx4zM98biQS+bjecTOUEkELUc7HuihXtnzQMeoCIGq26zXSr2/zdVB8G3ztZUKvjhJTtl4vhZ+wqXlOLtwc0vBnV8WbUwLZo4VAcdVfep2lqYWtr0/ZCximAFKKey3X9/o4TfD48BNB8KzdJP62SDs2MCsbcGh2nTGLMqeacz1GKNcSoDuyNq8H3+3cPAG/1K7wzUJq3OJnRq2l8bmtrYGOh8QsghSo4BvVDoc5fAviatZOYV4a2XbkeoM6uMvDBKgMnVgPHVxpZ3+nPNdQ+w/yCC2BfnLA/obB3ANhvAhGnwS+5KPWHmd8E6B5No/8o1DmSsZY0aslBSrckgsGOKwHcQUTTnWy57ERUqxiTNGASMWo0oEYBk8zfKUaCgV6D0GsM/dujD/3r9uvLqeNgxpNExi3hcPPv7YzPSRkBxIla46xsU1Pn1IoK3AbAMhF1csR/nA0vVzg7mPEbpXBXW5t/S67C+V4XQPJVbhzVCwY7FxMNgmJxnH4cBVtYKOYt/Id13Xi4o6N5Q2FN2astgNjTyROlVqxYvcQw+DtEONcTAdsIkpnfIcJ9iQTu7ewMvGmjSlGLCCBFlXN8NNbcvPp8pdgP4LLxEZGjKPYzs3ny+lFm/ltHR/NrjmoXubAAUmRBx1Nz3/72XXX9/bFLmfFVIlw0nmJLxsLMJgBPENEzgHqiWG9yFmusAkixlBzn7QSD4SnMFecoZZzLTOcBWEiESW6GzYy9RHiWGc8QGRuqq2uevfnmbx52MwanfQkgThUro/IrVnR+BKC5zMbpAM1j5pOJ6KRcXzSRTQJm7ASwDeDtAG0jwltExjafr2Lbbbct2+81+QQQr82YS/GGQms+zGwcy0w5voqSokR0yDDiXR0dzQdcCs+1bgQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU0AAcU1q6ciLCgggXpw1idk1BQQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU0AAcU1q6ciLCgggXpw1idk1BQQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU6CkgDQ3rz1VKX2z1Wjmzp2NSy+9cNTlWCyOaLR31O/XrduArVt3gNkAkRp13TC009rbl73umnrSUdkrUFJAWlrubND1gQNWKp588gdw9dUX2wbkgQf+gvfe22cJiFKxqa2tLV1lP2syQNcUKCkg5ihCoU62Go3Pp+GGG65GRYVvRJFMDjIwMIC1a383WC6zg3BfOByY5Jpy0tGEUKDkgASDnRuJ8FErNS+6aCEWLZqfE5CnnnoZL7wwtFvLBAgzPx+JBM6eELMmg3RNATcA+SERfmA1Ik3TcO21l+DYYxuGi6Q7yLvv7sXvfvfo8PXMgOB7kYj/RteUk44mhAIlB6S5OTJPKe3lXGpecMFZWLx4wWCxVEAee+xFvPTS1hHVM2+x1Cnh8PKRBXN1KtdFgRwKlByQoTyk4xGARt+uSguupqYKxx8/E42NU/D++wewa9c+xOOJUUNgZhAdDZ0ZD0Ui/i/KbIsCxVbAFUBWrGj/GLN6utjBJ9szc5y2Nn9OlypV/9Ju+SrgCiCmfMFgx31EdGUJpFwTDvubStCuNCkKwDVAVq36beXBg/ueAWjkLasCJoGZNzQ27lu0atUqo4BmpKooYKmAa4CYESxfvnpGZaVxP0CLCp0TZqzXtNhX5MFgoUpK/WwKuApIMpBQqOPHAH0v/6nhG8LhwM3515eaooA9BcYEkKGcZO2sosSNzHQZUe6tHjN0gH/ObHy/vT24y97wpJQoUJgCYwZIMmy/v2OOz4drAVwN0Mz04TDzO0TqHk3DnXfc0fReYcOV2qKAMwXGHJDUcAOB9kalfDOJ9AalcCAWo92rV/sPORuSlBYFiqfA/wNrEWxeJ2tBGwAAAABJRU5ErkJggg==
// @author       kangkang
// @match        *://*.*.edu.cn/https/*/user/lesson
// @match        *://*.*.edu.cn/https/*/fzdx/play*
// @match        *://*.*.edu.cn/https/*/fzdx/lesson
// @require      https://code.jquery.com/jquery-3.4.0.min.js
// @require      https://lib.baomitu.com/jquery-cookie/1.4.1/jquery.cookie.min.js
// @grant        GM_notification
// @license      MIT
// ==/UserScript==


(function () {
    'use strict';


    const currentUrl = window.location.href;

    // --- 1. 如果是课程列表页 ---
    if (currentUrl.includes("/user/lesson") || currentUrl.includes("/fzdx/lesson")) {
        setTimeout(() => {
            const courseUnits = $('.study_plan2');
            let found = false;
            courseUnits.each(function() {
                const unit = $(this);
                if (unit.text().includes('未完成')) {
                    const studyButton = unit.find('a.study_a');
                    if (studyButton.length > 0) {
                        GM_notification({ text: `找到未完成课程:${unit.find('a.plan_a').text().trim()},即将跳转学习...`, timeout: 3000 });
                        found = true;
                        studyButton[0].click();
                        return false;
                    }
                }
            });

            if (!found) {
                 GM_notification({ text: '本页所有课程均已完成!', timeout: 5000 });
            }
        }, 2000); // 延迟2秒执行,给页面加载时间

        return; // 列表页逻辑执行完毕,退出脚本
    }


    if (currentUrl.includes("/fzdx/play")) {
        const originAddListener = Document.prototype.addEventListener;
        Document.prototype.addEventListener = function (type, listener, options) {
            if (type === "visibilitychange") return;
            return originAddListener.call(this, type, listener, options);
        };
        Object.defineProperty(document, 'hidden', { configurable: true, get: () => false });
        Object.defineProperty(document, 'visibilityState', { configurable: true, get: () => 'visible' });

        const style = document.createElement("style");
        style.innerHTML = `
        .gpt-btn {
            padding: 6px 15px;
            font-size: 14px;
            font-weight: bold;
            color: white;
            background: linear-gradient(to right, #43cea2, #185a9d);
            border: none;
            border-radius: 6px;
            box-shadow: 0 2px 6px rgba(0,0,0,0.2);
            cursor: pointer;
            transition: transform 0.1s ease;
        }
        .gpt-btn:hover {
            transform: scale(1.03);
            background: linear-gradient(to right, #2bc0e4, #eaecc6);
        }
        .gpt-btn.stop { background: #e74c3c; }
        select.gpt-btn {
            background-color: #ffffff;
            color: #000000;
            border: 1px solid #ccc;
            border-radius: 6px;
            padding: 6px 10px;
            font-weight: bold;
            appearance: menulist;
        }
        .gpt-controls, .gpt-extra-controls {
            display: flex;
            gap: 10px;
            margin: 10px 0;
            flex-wrap: wrap;
            align-items: center;
        }
        .gpt-status {
            padding: 10px;
            font-family: Consolas, monospace;
            background: #f9f9f9;
            border-left: 4px solid #2ecc71;
            border-radius: 6px;
            font-size: 13px;
            color: #333;
            white-space: pre-line;
        }`;
        document.head.appendChild(style);

        const setCookie = (name, value, days) => {
            const d = new Date();
            d.setTime(d.getTime() + days * 864e5);
            document.cookie = `${name}=${value}; expires=${d.toGMTString()}`;
        };
        const getCookie = name => {
            const prefix = name + "=";
            return document.cookie.split(';').map(c => c.trim()).find(c => c.startsWith(prefix))?.slice(prefix.length) || "";
        };

        const checkUserCookie = () => {
            let user = getCookie("username");
            if (!user) {
                GM_notification({ text: '刷课系统已就绪,欢迎使用!', timeout: 3000 });
                user = prompt("请输入你的名字:", "哈喽~~");
                if (user) setCookie("username", user, 30);
            }
        };

        const targetContainer = document.querySelector(".video_cont") || document.body;
        const controlsWrapper = document.createElement("div");
        controlsWrapper.className = "gpt-controls";

        let autoStarted = false;
        let completedIndex = 0;

        const btnStartAuto = document.createElement("button");
        btnStartAuto.textContent = "▶️ 开始刷课";
        btnStartAuto.className = "gpt-btn";
        btnStartAuto.onclick = () => {
            $.cookie('autoPlayEnabled', 1);
            startAutoLearning();
        };

        const btnStopAuto = document.createElement("button");
        btnStopAuto.textContent = "⏸️ 暂停刷课";
        btnStopAuto.className = "gpt-btn stop";
        btnStopAuto.onclick = () => {
            $.cookie('autoPlayEnabled', 0);
            clearInterval(window.start);
            document.querySelector("video")?.pause();
            GM_notification({ text: "⏸️ 已暂停自动刷课", timeout: 3000 });
            autoStarted = false;
        };

        const selectPlaybackRate = document.createElement("select");
        selectPlaybackRate.className = "gpt-btn";
        [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 8.0, 16.0].forEach(rate => {
            const opt = document.createElement("option");
            opt.value = rate;
            opt.textContent = rate + "x";
            selectPlaybackRate.appendChild(opt);
        });
        const savedRate = parseFloat($.cookie('playback_rate') || 1.5);
        selectPlaybackRate.value = savedRate;
        selectPlaybackRate.onchange = () => {
            const video = document.querySelector("video");
            if (video) {
                video.playbackRate = parseFloat(selectPlaybackRate.value);
                $.cookie('playback_rate', video.playbackRate, { expires: 7 });
            }
        };

        controlsWrapper.appendChild(btnStartAuto);
        controlsWrapper.appendChild(btnStopAuto);
        controlsWrapper.appendChild(selectPlaybackRate);
        targetContainer.prepend(controlsWrapper);

        const extraControls = document.createElement("div");
        extraControls.className = "gpt-extra-controls";

        const timeLabel = document.createElement("span");
        timeLabel.textContent = "🕒 增加学习时长:";
        timeLabel.style.fontWeight = "bold";
        extraControls.appendChild(timeLabel);

        const selectTime = document.createElement("select");
        selectTime.className = "gpt-btn";
        [5, 10, 15, 20, 30].forEach(min => {
            const opt = document.createElement("option");
            opt.value = min;
            opt.textContent = `➕ ${min} 分钟`;
            selectTime.appendChild(opt);
        });

        const btnAddTime = document.createElement("button");
        btnAddTime.className = "gpt-btn";
        btnAddTime.textContent = "添加";

        const getRid = () => {
            try {
                if (typeof studyTime !== 'undefined') {
                    const str = studyTime.toString();
                    const match = str.match(/rid:\s*["']?(\d+)["']?/);
                    if (match) return match[1];
                }
                const html = document.documentElement.innerHTML;
                const match2 = html.match(/rid\s*[:=]\s*["']?(\d+)["']?/);
                return match2 ? match2[1] : null;
            } catch {
                return null;
            }
        };

        btnAddTime.onclick = () => {
            const rid = getRid();
            const minutes = parseInt(selectTime.value);
            const _xsrf = $(':input[name="_xsrf"]').val() || "";
            if (!rid) return GM_notification({ text: "❌ 未找到 rid", timeout: 3000 });

            $.ajax({
                type: "POST",
                url: "/jjfz/lesson/study_time",
                data: {
                    rid: rid,
                    study_time: minutes * 60 * 1000,
                    _xsrf: _xsrf
                },
                complete: res => {
                    if (res.status === 200) {
                        GM_notification({ text: `✅ 为 rid ${rid} 增加 ${minutes} 分钟`, timeout: 3000 });
                    } else {
                        GM_notification({ text: `❌ 增加失败(状态码 ${res.status})`, timeout: 3000 });
                    }
                }
            });
        };

        extraControls.appendChild(selectTime);
        extraControls.appendChild(btnAddTime);
        targetContainer.appendChild(extraControls);

        const statusBox = document.createElement("div");
        statusBox.className = "gpt-status";

        const updateStatus = () => {
            const total = document.querySelectorAll(".video_lists ul li").length;
            const rate = parseFloat($.cookie("playback_rate") || 1.0);
            statusBox.innerHTML = `🎓 Hello~ ${getCookie("username") || "同学"}
    📺 状态:${$.cookie('autoPlayEnabled') == 1 ? "自动刷课中" : "未开启"}
    ⏩ 倍速:${rate}x
    📊 进度:${completedIndex}/${total}(剩余 ${total - completedIndex})
    🌐 标签检测:已屏蔽
    💡 <a href="https://github.com/Flesymeb" target="_blank">Made by Flesymeb↗</a>`;
        };
        setInterval(updateStatus, 3000);
        targetContainer.appendChild(statusBox);

        setInterval(() => {
            const video = document.querySelector("video");
            const currentRate = parseFloat($.cookie("playback_rate") || 1.0);
            if (video && video.playbackRate !== currentRate) {
                video.playbackRate = currentRate;
            }
        }, 1000);

        const startAutoLearning = () => {
            if (autoStarted || $.cookie('autoPlayEnabled') != 1) return;
            autoStarted = true;

            window.start = setInterval(() => {
                const video = document.querySelector("video");
                const current = document.querySelector(".video_red1")?.closest("li");
                const next = current?.nextElementSibling;

                if (!video || !current) return;



                const ended = video.ended;

                if (ended) {
                    completedIndex++;
                    if (next && next.querySelector("a")) {
                        next.querySelector("a").click();
                    } else {
                        GM_notification({ text: '✅ 本章播放完成,跳转课程列表页~', timeout: 4000 });
                        clearInterval(window.start);
                        const baseUrl = location.href.split('/fzdx/play')[0];
                        location.href = baseUrl + '/user/lesson';
                    }
                    return;
                }

                if (video.paused) video.play();
                document.querySelector(".public_cancel")?.click();
                document.querySelector(".public_submit")?.click();
            }, 1500);
        };

        checkUserCookie();
        setTimeout(() => {
            if ($.cookie('autoPlayEnabled') == 1) startAutoLearning();
        }, 1000);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址