您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动播放、倍速控制、进度统计、学习时长添加,理论上适用于所有学校
// ==UserScript== // @name 同济大学党旗飘飘刷课工具 // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description 自动播放、倍速控制、进度统计、学习时长添加,理论上适用于所有学校 // @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+gsGO88DOATQJXZvOec79gLr3adplSvuuONfzERfPmOoQEkBCYVWzwX4FavxzZs3B0uXfsq2g6xfvwFvvLHDEhCA5oXDTa+mNxgKtX8RUN8HcOYYag1mwDwAkOs29pCbYK9S9M22tqY/jGXME73vsgYkGOy8mIh/DND8Ukx0FTFqNEKNBtT41PCR5D6d0RVn9Ooje00C4iQWZvwsEvF/x0kdKVs8BcoSkFCo4xPmOS2APlYMqY6rZHy42sDMCgMNPqCxrgoz6qpyNh0zgO09xuDPK10J7Og1z5ClQzN8rsyyPWY8yaxfLqcFckpe9AJlBQgRL2TGNQD5C1XqzFod82oNnFJtoDb9gMzkyYDP57iLnQf78PTBBJ6PaujnkdLn2nYNPXzE5ZGI/2+OO5YKeStQVoCYt3oBzMpXjQbNwKJ6Ax+vM1CrstydzhOQw9296IvFB8Pb2KOwoVvhoD506DL5sQHKdyIR/8/yHaPUc6ZAuQGSdfRWi2/+JB3nTjFwSo1hT70iAJLs6PVewp8O+dCX5ijmdauchZkfqKqqu+rWW68aeQbHXvRSyoECExaQGsX4ZJ0+6BhTNIfvXBUREHOu+g3CHw8qvN4/ci+XzU2Y+U1NwxdaWwOWt9EdrAMpaqFA2QKSaXGZv6tWwPn1Oi6o11Ezcndjf5EUGZBkx89FFf6nK1tuY4J8dMqYOUpELeGw/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+1bgQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU0AAcU1q6ciLCgggXpw1idk1BQQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU0AAcU1q6ciLCgggXpw1idk1BQQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU0AAcU1q6ciLCgggXpw1idk1BQQQ16SWjryogADixVmTmF1TQABxTWrpyIsKCCBenDWJ2TUFBBDXpJaOvKiAAOLFWZOYXVNAAHFNaunIiwoIIF6cNYnZNQUEENeklo68qIAA4sVZk5hdU6CkgDQ3rz1VKX2z1Wjmzp2NSy+9cNTlWCyOaLR31O/XrduArVt3gNkAkRp13TC009rbl73umnrSUdkrUFJAWlrubND1gQNWKp588gdw9dUX2wbkgQf+gvfe22cJiFKxqa2tLV1lP2syQNcUKCkg5ihCoU62Go3Pp+GGG65GRYVvRJFMDjIwMIC1a383WC6zg3BfOByY5Jpy0tGEUKDkgASDnRuJ8FErNS+6aCEWLZqfE5CnnnoZL7wwtFvLBAgzPx+JBM6eELMmg3RNATcA+SERfmA1Ik3TcO21l+DYYxuGi6Q7yLvv7sXvfvfo8PXMgOB7kYj/RteUk44mhAIlB6S5OTJPKe3lXGpecMFZWLx4wWCxVEAee+xFvPTS1hHVM2+x1Cnh8PKRBXN1KtdFgRwKlByQoTyk4xGARt+uSguupqYKxx8/E42NU/D++wewa9c+xOOJUUNgZhAdDZ0ZD0Ui/i/KbIsCxVbAFUBWrGj/GLN6utjBJ9szc5y2Nn9OlypV/9Ju+SrgCiCmfMFgx31EdGUJpFwTDvubStCuNCkKwDVAVq36beXBg/ueAWjkLasCJoGZNzQ27lu0atUqo4BmpKooYKmAa4CYESxfvnpGZaVxP0CLCp0TZqzXtNhX5MFgoUpK/WwKuApIMpBQqOPHAH0v/6nhG8LhwM3515eaooA9BcYEkKGcZO1sosSNzHQZUe6tHjN0gH/ObHy/vT24y97wpJQoUJgCYwZIMmy/v2OOz4drAVwN0Mz04TDzO0TqHk3DnXfc0fReYcOV2qKAMwXGHJDUcAOB9kalfDOJ9AalcCAWo92rV/sPORuSlBYFiqfA/wNrEWxeJ2tBGwAAAABJRU5ErkJggg== // @author Hyoung(https://github.com/Flesymeb) // @match *://*/*/play* // @match *://*/*/user/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 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' }); if (!window.location.href.includes("play")) return; 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 progress = video.currentTime / (video.duration || 1); const ended = video.ended; if (ended || progress > 0.98) { completedIndex++; if (next && next.querySelector("a")) { next.querySelector("a").click(); } else { GM_notification({ text: '✅ 本章播放完成,跳转课程列表页~', timeout: 4000 }); clearInterval(window.start); location.href = `https://${location.host}/jjfz/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); })();