采用DeepSeek大模型,题目识别准、作答快,所有题目均可作答。支持自动刷课、自动答题、自动完成章节测试,简洁界面、稳定服务,持续适配平台更新。
// ==UserScript==
// @name 🚀 学习通AI刷课答题终极版|💯 全自动刷章节与测测验|🎯 作业自动答题|🧠 AI大模型精准作答|🛠️ 无需配置|长期维护更新
// @namespace http://tampermonkey.net/
// @version 1.0.3
// @description 采用DeepSeek大模型,题目识别准、作答快,所有题目均可作答。支持自动刷课、自动答题、自动完成章节测试,简洁界面、稳定服务,持续适配平台更新。
// @author Peince
// @match *://*.chaoxing.com/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_getResourceText
// @connect api.116611.xyz
// @resource typrMd5Lib https://116611.xyz/typr-md5.js
// @resource fontTableData https://116611.xyz/table.json
// @license CC-BY-NC-ND-4.0
// @antifeature payment 脚本存在第三方答题接口付费功能
// @icon data:image/png;base64,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Z+eaKTvQKyPRFpRTRThQAtFFFBIlFFFACUUUUAFOFNpwoAKKKKYwooooJHUUlGaAFopM0ZoAKKKKACiiigAooopAFFFFABRRRQAtFFFAhaKKKACiiigAoFLRQAClooqgExSEUuaM1ICUUUUAFFFFAC0UlGaAFpRTRThQIWijNJmgBaKSlpgFLSUUAGaXNJiigBc0ZpKTNAC5ooooAKKKKACiiikAUUUUALmgGkoFAhwpwpopRQSx9FJRQSLRSUUALSGijNACGiikoAXNLTc0uaAFopKKADNFFFAxc0ZpKKAFooooAKKKKACiiimIKRjTqjepAv6B/wAh2w/67LXf+LfCQ1FTd2eFuFXlezD09q4Dw7/yHbD/AK7rXuA+7XpYWCnBpnzebVp0a8ZQ7Hgjo0bsjjDKcEehpOnWu+8d+FlUHUrBAp5adR3964H71clWk6bsz2MHio4mnzRCijpRWR2CjpSGlHSkNIBaWkpaAEooooASkNLSGgAooooAWiiigYUUUUAFFFFACiigUUCCilpKCQoopKAFooooAKKKKACiiigBM0UUUxlHvSikFKKR1gKdikFOoASiiigkDTTTjTaACnCkpwoATFGKM0ZoAKKKKYwooooELmjNJRQAuaM0lFAC0UUUCCiiigAooopAFFFFABRRRQAtFFFABS0lAoELRRRQAtFJRQAtGaSiqAKKM0VICZozSkUmKAFooooAKM0lFAC0optKKBDqM0lFAC0UUUwFopKWgBaKbRmgBaKKKACiiigAooooAKKKKQBRRRQAUoFApRQIMUtLRQSwozRRQSGaM0UUAGaTNFFBQUUUUAFFFLQAUUUUALRTaWgQtGKKKACiiiqEFFFFIQtFFFAxpNNY09hTCOaTKLugf8h3T/8Aruv869yX7orwvQv+Q7p//Xdf517ov3R9K9TBfCz5PPP40fQRkWVCrjIIwc15l448NtY3BvbRf3Mh+ZQPumvUFqK6t47mFopVDKwwc101aanGx5OExMsPU5lseDUVt+LfD0mi3uYjm2kJ2dfl74NYYrxqkHTdmfdUa0a0FOI6iiiszYKKKKAEooooAKKKKAEooooAWiiigYUUUUAFFFFACiigUUCCikpRQSFFApaACiiigAooooAWiiigBKKWimMzqBRRSOsdRRRQAtFFFBIUUUUALRRRQAlFFFABRRRTGFFFFABRRRQAUUUUCCiiigBaKKKACiiigAooopCCiiigBaKKKAEpRSUopiFooooAKKKMUAFJS0mKAEpRRRSGFLSUUALQaKKBCUUYooAKUUlKKAFoooxQAUUtFAhMUtFFABmjNJRTAXNFJQKAHUUUUwCiiigAoooqbAFFFFFgFpabmlzTJFzS5puaM0ALnmikpaBC0tNpaACkpaKQCUtFLQAUtFKKCRKKWigBKKKKBhRRRQAUUUUwCiiigBaKKKAEamHrT2ph61LGW9D/AOQ7p/8A13X+de6J9wV4XoX/ACHLH/ruv8690T7g+lergvhZ8pn38WPoOHSigdKK7z50rX9nDe27QTrvRwcg145rmkyaRqLwyg+WTlG9VPSvbKyfEGjRavatHKoLj7p9D61y4iiqkdNz08vxrw09dmeMUVc1LT5tNvHtp1AdD17H6VT715Di46M+1p1FUjzR2CiiipLEooooAKKKKACiiigAooooGFFFFABSYp1JQIKWkFKKADFGKM0ZoFYMUUZozQFhaXNNooGKaSlzSGgBBThSUUAFFFFMDPooopHUKKdTRTqAFooooJCiiigAooooAKKKKACiiimMKKKKAEooooAKKKKAFooooAKKKKAFooooJCiiigYUUUUAFFFFABS0lLQSFFFJQAuaM0UUAGaM0UUAFFJQKQxaKKWgAooooEFFKKKAEoFLSUALS0gpwoASkzS0lAgzSZopKAHUUlGaYC0CkzSg0AOooopgFFFFABRRRQSFFFFABRS0lIYUUUgoCw6iiigQUZpM0ZoAfmjNJmikIUUopBS0ALRRmkoJHUUgpaAEooooGFFFFABRRRTAKKKKAFooooAa1MPWntTD1qGMt6F/yHLH/ruv8691T7g+leE6Ef8AieWP/Xdf517tH9wfSvWwXws+Uz7+LH0HDpRQOlFd586FFFFAGF4r0GPVrBxGEWcD5GPavJby1ltLt4LgESIeTXu9cf438MDUIHvLbIniU8D+IDtXHiKCmuaO57WWY90Zezm9GeZGigq6MVkVlcdQ1JmvJPsE7q4UUUUDCiiigBaKKKACikopEi0UUUABpDS0lBQUtNzS5oAWim5ozQMdRTc0ZoAWjNJSZoELmnCm0tADqbRmlFBIUUtFAGfRRRQdgUUUUALThTRThQAlFFFAmgzS5pKKBC0UlFAC0hpaaaYxaKbmjNADqKSigBaKKKAEooooAWiiigBaKKKBDhRQKKAEooooAKKKKAEpaSgUALSUUUALRRRQIKKKKACiiigAoooFADxRQKKQgooooAWikpaYBRRSUAFFFFACUUtFACUYpaWgQmKKWigBaKKKZIUUUUAFFFFIoKKKKAFpKKKACiikoAKKKBSAWiiigApRSUtAgFLSUtBIA0opo608UCClFJRmgBaKTNFAwoFFFAC0gpaKBCikoooAWg0lFAhD0php5pppFIsaJ/yG7D/run/oVe7xdBXhOi/8hux/67p/OvdYvuivVwXws+Vz7+LH0H0UHrRXafOC0U2igBaO2D0oooA4Lx54XkuHXULBFBUHzlHVvcV5+Rjg9q98IBGCMivMPHnhp7K5N9Zrm1cAso/hPc/SuDE0L+9E+lyvMNVRqfI5A0UUV5x9OLRRRSELRRRQAUUUUCEooooKCmk0p6U00DCiiigBaKbRQA6inwW8sz7IlZmbpit/S/BmqX3EsbW6/wB98f41pGnKTOWri6VH42c9Ue9fMVP4uwHWvSNO+HMETg3t3JOP7irt/UV1emaPYaZCIrS3VB+ZP511QwknueTXzunBWpq55VYeEtbvWU/YzBG38cjqMfhnNdZpPw7tIHEl9dy3RH/LPaFT+p/Wu32Co7mVYYWZ/u4rpjhoQ1Z49XNK9Z2Tt6HJeLHsNG0wxW0EMUrjam1QDXnAFXta1SbVb2SacHAdvLX0XtVGvOrTUpaH0mAoOjT97diUUtFYnoGbRRRQdgUUUUAApwpopwoAWiiigBKSnUlBIlFFFABmkoopjCiiigAooooAWgUUCgB1FFFABRRRQAUUUUAOoptFAhaKKKACiiigBKKKKAA02lNJQAuaUU0U4UAFAooFADqKKKAEoApaKCRaKKKAFooooASlpKKQC0lFFABmikozQAvNHNFGaAFzRRiimIM0tJS0ALRRRTJCiiigAooopFBRRRQAUUUlABRRRQAUCigUgFooooAWiiigQUUUUCAU4U2loAXNJmkpaAFzS0lFAhaKKKAFooFKaoQlFFFIAopaDSENNNNOPSmGkUi5of8AyHbD/run8690ToPrXhWhf8h2w/6+E/nXuqfdH1r1cF8DPlM+/ix9B1FFFdp86JRRRQAtFFFABUVxBHPE0cqhkYYINS0UAtNUeS+MfC0mjytc2uZLWQ5IP8BJ/lXM17tqNjFqFm9vcKGjcYINeR+J9Bn0W9KsC0DH91Jt4x6V5uIw/L70T67LMwVSPsqj94x6KKK4D3RaKKKACiiigBDSGlNNNABRQkUkp2xK8jeiDNaWl+HNU1FysMDRY7yoyj+VVGEpbIyqYilSV5MzaPLkb7kbt9FzXf6R8PFHzaqyyD+5ESK67StDsdMjCWcWwV1wwknueRXzmnHSmrnluj+EdU1VPMQJBH/01DA/lius0n4eW0Sg6hL9of8Auj7tdwFCilz7V2Rw0I7niV80r1Xa9kZ2n6NZacoS0t0jA9BzV/pxTqStlFLY82UpSd5MUUUUVoSFeefETX0lJ0y3LB42DSHp26V1PirV/wCy9Jlmhw033UB9a8ivbmS7nkuJjmSRssK4cTV5Vyo9zKsJ7SftJrREQNKDTKUGvKPrR+aKbRQBQppozRTO0KWilxQAmacKbSigkWjFFGaAEozSGjNABRSUUAJRRRQMWigUUALRRRQAtFFFAC0UUUAFFFFABRRRQAtFFFAgooooAWiiigkKaadTTQMKKKKAClFJRQAtFFFAC0UUUALRRRQIXNGaSigQtGKAaM0CEpaSigYtFFFACUUtFACUtFFABS0UUCuFFLRQFxaKTNGaCRaKTNGaAFzRmkooKFzRmkooAWkpaSgApaSloAKKSlpAFLSUUAFFFFABRRRQAUUUVRIUCigUAPFFJRmmIdRSUUAOopKWmAtFFFIkKBS0CkJjWpjVI1MakUixonGuaf8A9fCfzr3ZPuCvCdH/AOQ1Yf8AXwn8691j+4PpXpYP4WfK59/Fj6D6KB0oruPnRpooNFBQUUUUALRRRQIWs/WdNh1Sye2lUHcCA2Pun1rQo6UNXVmVGbg1KJ4hrmkXGk3bW86kID8j9mFZ3SvafEmh2+t2nlXCjcvKP3U14/qunz6ZevaXS4kU9ezDsRXk4ihyPmR9lluPWIjyT+JFYU6mVs6d4b1a9fC2jxr/AH3GBXNGLlsejVxFOkrzdjKp0UUk77YI3lb0QZNd5pHgBVO/UJBKP7oBH611Gm+HdO04hrS2RG9ep/WuqGFb3PHr5zTjpTVzzPTfCupX3LQm3HrIMV0mmfD1EcNqFwsyj+FVI/XNd5tHpS12Qw0YnjVczrz2djL03w/pun82tqiMO/etRQB04paK3UIo82U5Td2xcUYozRmrJCiiigAooooAKrXtzHawPPIwVUBJJ7AVZrzj4ia7HcM2mW7NiNwZGHTv8tZ1JqEbs6cLh3iKqgjnvEOry6pfyyu5MQY+UvYLWUeeaaWz0NFeJObm7s+8pUo0YKERaUUClFSahRTqKAMulFIKcKDpClpKKAFpDRmigAzRmiigApKWigBKKKKAEooooGKKKBRQAtFFFADqKbRQA6iiigBaKbRQAtFFFAC0UUUEhRRRQMWiiigQU006mmgBKKKKAHCigUUAFFFFAC0UUUAFFFFAC0UmaM0CFpKWjFAhKWkooGLRRRQAUUlFAC0UlFADs0tNzS0E2FozSUZoCw7NGaSigkXNFJRQA6ikzRQULRSUUAFLSUtABSUtJQAUUUUgFopKWgAoooqgCiiigAooooJCiiigBaKSimMdmikoFADqWm9qWmSOopKWkSL2pRSdqBSEwamHrTmpjUikWdG/5DVj/wBfCfzr3VPuivCNG/5DVj/18J/Ovd4/uivSwfwny2ffxY+g6iiiu4+cENIaU000FBRRQKAHUUUUALRRRTEFYXifw1DryQh5GiaF925QCSO4/Gt2iplFS0ZdOpKnLmi9TG07wvpWnkGK0iLD+Mrk1sKAvA4FLmiiMYxVkglUlN3k7hRRRTJCiiigAooooAKKKKACiiigkWiiop5VijZm7AmmUld2MPxl4gTRLHK/NNJ8qD3ryS4maaSSZzl5GLn6nk1oeI9Xk1jUXmkJ8qNisY7Y9azK8fEVuZ2R9nluD+r0+aS1YgI9KcKMUtch6od6UUAU4VQxKKKKAM2lFJSig6QoooqhCmkpTSUgCkNLSGgAozQaaTQVcdmim5pRQFxaKKKAEooopAOFFAooAKKKKACiiigkKKKKAFooooGOFFAooEFFFFAxaKKKBCUlOxSUDG0UuKMUAFAooFAC0UUUALRRRQAUUUUEBRRRQMKKKKAFNJSmkoAKDRSGgBaKKKACiiigB1GaSigBc0ZpKKAFoozRmgQUUZozQAUtJRQAtFFFABS0lLQIU0lKaSgAooooAUUUCigAooopkhRRRQAUUUUAFFFFACUtJS0igFLSUUAPopuaM0yR1GabRQA/NKDTAaUGgloU0w04001LGWtG/wCQ1Y/9fKf+hV7rH90fSvCNG/5DVl/18J/6FXu8X3V+lelg/hZ8rn38WPoOoooruPnRDTTTjTTTGFFFFABRRRQAtFJmgGmA+ikzRmgQtFJmjNABRSUUhi0UlFAC0UUUAFFFFAC0UUUCFrz34i+IFZP7PspiJA370qegx0rpvF2uJo2ltOCDKSFRPUmvHrid55nlkO55GLsfeuTE1eVcqPcynBe1n7Sa0RH9aUUnelryD7AcKcKaKcKCWOooopkhRRRTKMylFJSig6QoooqhCmkpTSUgCkNLSGgANNNOpDQA2loooAWiiigBaKKKB3FooopCCiiigYUUUUAFFFFSIBThTRTqYC0UUUwCiiigYtFFFAhM0UUUDCiiigBKBRQKAFooooAKKKKACiiigkWiiigBaKKKAA0lKaSgApDS0hoAWiiigAooooAWikzRmgBaKTNGaAFopKKBC0UlFADqKSloAKWkooAWlpKWgQppKU0lABRRRQAoooFFABRRRTJCiiigAooooAKKKKACkpaSkUFFFJQAtFJQKAHUUUUyRRS0lPRGb7kckjeiDNBLaW400010Gl+DtY1RPMjRII/+m2VP5YrrNL+HWmxbZNRZrqQdiSF/TGa3jhpzPNr5ph6Ol7vyOA0KC4n1W2a2heXZKjNtGcDNe5x/dFQ2dnbWUQitIEhQdFUYqxXo0aPs0fK47G/XJ81rWFpKKK3OAQ0004000DCiiigBKKKKACiiikAuaM0lFAxc0ZpKKACiiimIKcKaKcKAFoFFAoAdRRRQSFQXc8drbvNKwVEGST0qevPPiLr6yA6XA24g/vcenUCs6k1CPMzqwuHliKigjmvF2rnWNWaUMfKiGxB7Dv8AjWLTqSvGqTc3c+9oUY0YKERRTqaKdWRsFFFFBItFFFMAooooAz6WkozVnUxaSiigkWkoooASg0UUAFFFFACUUUUgFooooAdRTeaKAHUUmaKAFopKBQAtJS0UAApaSloAMUYpc0ZpDCjFGaM0ALmkpM0maAHZpc03NLmgAooooGKKKSigAooooEKKKBRQAtJSmkoEFLSUooAWiiigQlFOooASiiigBKKKKAEooooAWiiigAooopAFFFFACClpBS0AFKKSlFACYp1FFMQUUUUALS0UlAC5paaDSigBaKTNGaBC0UlFAC0UUUxXCiiigLhRRRQISikJpM0ALRRRQULRRRSAKKltLae8nENtCZJH4wBXVaT8PdSmcPqEsMUf91eWx/KtYUZz2Rx18bRo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
// ==/UserScript==
const systemConfig = {
buildTime: new Date().toISOString(),
environment: 'production'
};
class Logger {
constructor(prefix) {
this.prefix = prefix || 'System';
this.levels = ['DEBUG', 'INFO', 'WARN', 'ERROR'];
}
log(level, message) {
if (this.levels.includes(level)) {
const timestamp = new Date().toISOString();
}
}
debug(msg) { this.log('DEBUG', msg); }
info(msg) { this.log('INFO', msg); }
warn(msg) { this.log('WARN', msg); }
error(msg) { this.log('ERROR', msg); }
}
const logger = new Logger('CXHelper');
const browserCheck = {
isChrome: () => /Chrome/.test(navigator.userAgent),
isFirefox: () => /Firefox/.test(navigator.userAgent),
isEdge: () => /Edge/.test(navigator.userAgent),
isSafari: () => /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)
};
class PerformanceMonitor {
constructor() {
this.metrics = new Map();
this.startTimes = new Map();
}
start(name) {
this.startTimes.set(name, performance.now());
}
end(name) {
const startTime = this.startTimes.get(name);
if (startTime) {
const duration = performance.now() - startTime;
this.metrics.set(name, duration);
this.startTimes.delete(name);
return duration;
}
return 0;
}
getMetric(name) {
return this.metrics.get(name) || 0;
}
}
const perfMonitor = new PerformanceMonitor();
const utils = {
generateId: (length = 8) => {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
},
deepClone: (obj) => {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj.getTime());
if (obj instanceof Array) return obj.map(item => utils.deepClone(item));
if (typeof obj === 'object') {
const cloned = {};
Object.keys(obj).forEach(key => {
cloned[key] = utils.deepClone(obj[key]);
});
return cloned;
}
},
debounce: (func, wait) => {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
},
throttle: (func, limit) => {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
}
}
};
class CacheManager {
constructor(maxSize = 100) {
this.cache = new Map();
this.maxSize = maxSize;
}
set(key, value, ttl = 300000) { // 默认5分钟过期
if (this.cache.size >= this.maxSize) {
const firstKey = this.cache.keys().next().value;
this.cache.delete(firstKey);
}
const item = {
value: value,
expiry: Date.now() + ttl
};
this.cache.set(key, item);
}
get(key) {
const item = this.cache.get(key);
if (!item) return null;
if (Date.now() > item.expiry) {
this.cache.delete(key);
return null;
}
return item.value;
}
clear() {
this.cache.clear();
}
}
const cacheManager = new CacheManager();
logger.info('System initialization completed');
(function() {
'use strict';
(function(){
function _b64ToBytes(b64){ const bin = atob(b64); const out = new Uint8Array(bin.length); for(let i=0;i<bin.length;i++) out[i] = bin.charCodeAt(i); return out; }
function _bytesToStr(arr){ let s=''; for(let i=0;i<arr.length;i++) s += String.fromCharCode(arr[i]); return s; }
function _strToBytes(s){ const out = new Uint8Array(s.length); for(let i=0;i<s.length;i++) out[i] = s.charCodeAt(i); return out; }
function _xor(a,b){ const out=new Uint8Array(a.length); for(let i=0;i<a.length;i++) out[i] = a[i] ^ b[i % b.length]; return out; }
const __S = [100, 121, 96, 105, 102, 109, 113, 102, 115, 96, 116, 98, 109, 117, 96, 51, 49, 51, 54].map(c=>c-1);
const __SALT = String.fromCharCode.apply(null, __S);
const __ENC = "idiM9YBNCEBSu80fAcWJtglB3UgCOQSNSUCG2EFbmlWW7AyIJkSb/kgNWgCHsoEA";
function __getDSK(){
try {
const step1 = __ENC.split('').reverse().join('');
const xored = _b64ToBytes(step1);
const plainB64Bytes = _xor(xored, _strToBytes(__SALT));
const plainB64 = _bytesToStr(plainB64Bytes);
return atob(plainB64);
} catch (e) { return ''; }
}
window.__getDeepseekKey = __getDSK;
})();
const DEEPSEEK_PROXY_BASE = 'https://api.116611.xyz';
const DEEPSEEK_MODEL = 'deepseek-chat';
const DEEPSEEK_API_URL = `${DEEPSEEK_PROXY_BASE}/v1/chat/completions`;
function deepseekChat(messages, options = {}) {
return new Promise((resolve, reject) => {
try {
GM_xmlhttpRequest({
method: 'POST',
url: DEEPSEEK_API_URL,
headers: {
'Content-Type': 'application/json',
'X-App-Token': __getDSAuth()
},
data: JSON.stringify({ model: DEEPSEEK_MODEL, messages, ...options }),
timeout: 60000,
onload: (r) => {
if (r.status >= 200 && r.status < 300) {
try { resolve(JSON.parse(r.responseText)); } catch (e) { reject(e); }
} else {
reject(new Error(`HTTP ${r.status}: ${String(r.responseText || '').slice(0,200)}`));
}
},
onerror: () => reject(new Error('Network error')),
ontimeout: () => reject(new Error('Timeout'))
});
} catch (err) {
reject(err);
}
});
}
let isAnswering = false;
let isStudyingChapters = false;
let studyIntervalId = null;
const STUDY_PERSIST_KEY = 'cx_helper_study_on_v2';
const PANEL_REG_KEY = 'cx_helper_active_panel_v2';
const PANEL_INSTANCE_ID = `${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
const FRAME_DEPTH = (() => { let d = 0; try { let w = window; while (w !== w.top) { d++; w = w.parent; } } catch { d = 999; } return d; })();
let isActiveOwner = false;
let createdPanelEl = null;
const HEARTBEAT_INTERVAL_MS = 2000;
const STALE_MS = 7000;
let heartbeatTimerId = null;
let lastAutoSkipTs = 0;
let emptyChecksCount = 0;
let lastEmptySectionKey = '';
let recoveryTimerId = null;
const API_BASE = 'https://116611.xyz';
const MONEY_YUAN = (() => {
try {
const b64 = 'NS4wMA==';
return atob(b64);
} catch {
return '5.00';
}
})();
const PAY_NAME = 'XHelper 解锁/赞助';
const DEFAULT_PAY = 'wxpay';
const LS_KEY_DEV_ID = 'cxhelper_device_id';
const LS_KEY_FREE = 'cxhelper_free_used';
const LS_KEY_LICENSED = 'cxhelper_licensed';
const POLL_MS_PAY = 3000;
const POLL_MAX_PAY = 100;
const getFreeLimit = (() => {
let cached = null;
return function() {
if (cached != null) return cached;
try {
const b64 = 'JDEw';
const decoded = atob(b64);
const n = parseInt(decoded.replace(/\D/g, ''), 10);
cached = Number.isFinite(n) ? n : 10;
} catch {
cached = 10;
}
return cached;
};
})();
function getDeviceIdPaid() {
try {
let id = localStorage.getItem(LS_KEY_DEV_ID);
if (!id) {
id = ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));
localStorage.setItem(LS_KEY_DEV_ID, id);
}
return id;
} catch { return 'dev_' + Math.random().toString(36).slice(2); }
}
const DEVICE_ID_PAID = getDeviceIdPaid();
function getCookie(key) {
try {
const name = key + '=';
const parts = document.cookie.split(';');
for (let part of parts) {
const s = part.trim();
if (s.indexOf(name) === 0) return decodeURIComponent(s.substring(name.length));
}
return '';
} catch { return ''; }
}
function setCookie(key, value, days, domain) {
try {
const d = new Date();
d.setTime(d.getTime() + ((days || 365) * 24 * 60 * 60 * 1000));
const expires = 'expires=' + d.toUTCString();
const dm = domain ? ';domain=' + domain : '';
document.cookie = key + '=' + encodeURIComponent(value) + ';path=/' + ';' + expires + dm;
} catch {}
}
function isLocallyLicensed() {
try {
// 优先从跨子域Cookie读取,保障不同页面一致
const c = getCookie(LS_KEY_LICENSED);
if (c === '1') return true;
return localStorage.getItem(LS_KEY_LICENSED) === '1';
} catch { return false; }
}
function setLocallyLicensed() {
try { localStorage.setItem(LS_KEY_LICENSED, '1'); } catch {}
// 写入跨子域Cookie,统一所有 *.chaoxing.com 页面状态
try { setCookie(LS_KEY_LICENSED, '1', 365, '.chaoxing.com'); } catch {}
}
function getFreeUsedCount() {
try { return parseInt(localStorage.getItem(LS_KEY_FREE) || '0', 10) || 0; } catch { return 0; }
}
function incFreeUsedCount() {
try { const n = getFreeUsedCount() + 1; localStorage.setItem(LS_KEY_FREE, String(n)); return n; } catch { return 0; }
}
async function checkLicensePaid() {
if (isLocallyLicensed()) return true;
try {
const r = await fetch(`${API_BASE}/api/license/status?deviceId=${encodeURIComponent(DEVICE_ID_PAID)}`, { credentials: 'omit' });
const ct = (r.headers.get('content-type') || '').toLowerCase();
const data = ct.includes('application/json') ? await r.json() : await r.text();
const ok = !!(data && data.licensed);
if (ok) setLocallyLicensed();
try { updateTrialBadge(); } catch {}
return ok;
} catch { return false; }
}
async function startPaymentPaid(payType) {
const win = window.open('', '_blank');
try {
const resp = await fetch(`${API_BASE}/api/create`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: PAY_NAME,
money: MONEY_YUAN,
type: payType || DEFAULT_PAY,
param: DEVICE_ID_PAID
})
});
const html = await resp.text();
win.document.open();
win.document.write(html);
win.document.close();
return true;
} catch (e) {
if (win) win.close();
alert('发起支付失败:' + e.message);
return false;
}
}
async function pollUntilLicensedPaid(onProgress) {
for (let i = 0; i < POLL_MAX_PAY; i++) {
if (onProgress) { try { onProgress(i); } catch {} }
const ok = await checkLicensePaid();
if (ok) { setLocallyLicensed(); return true; }
await new Promise(r => setTimeout(r, POLL_MS_PAY));
}
return false;
}
function showPayModalPaid(messageText) {
return new Promise(resolve => {
const mask = document.createElement('div');
mask.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:999998;';
const box = document.createElement('div');
box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:420px;background:#fff;border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.2);overflow:hidden;z-index:999999;font-family:system-ui,Segoe UI,Arial;';
const msg = messageText || '试用已用完,打赏5元永久解锁哦';
box.innerHTML = (
'<div style="padding:14px 16px;border-bottom:1px solid #f0f0f0;font-weight:600;font-size:13px;">解锁全部功能(永久)</div>' +
'<div style="padding:16px;">' +
'<div style="margin-bottom:12px;font-size:12px;">' + msg + '</div>' +
'<div style="margin-bottom:12px;">' +
'<label style="margin-right:14px;cursor:pointer;font-size:12px;"><input type="radio" name="cx_pay" value="wxpay" checked> 微信</label>' +
'<label style="margin-right:14px;cursor:pointer;font-size:12px;"><input type="radio" name="cx_pay" value="alipay"> 支付宝</label>' +
'<div style="color:#888;font-size:12px;margin-top:6px;">若支付方式不可用请尝试其他支付方式</div>' +
'</div>' +
'<div id="cx_tip_paid" style="color:#555;font-size:12px;">点击"去支付"将打开收银台,完成后此处会自动检测。</div>' +
'</div>' +
'<div style="padding:12px 16px;border-top:1px solid #f0f0f0;text-align:right;">' +
'<button id="cx_cancel_paid" style="padding:8px 14px;border-radius:8px;border:1px solid #ddd;background:#fff;color:#333;margin-right:8px;cursor:pointer;font-size:13px;">取消</button>' +
'<button id="cx_go_pay" style="padding:8px 14px;border-radius:8px;border:none;background:#4f46e5;color:#fff;cursor:pointer;font-size:13px;">去支付</button>' +
'</div>'
);
document.body.appendChild(mask);
document.body.appendChild(box);
const tip = box.querySelector('#cx_tip_paid');
const btnPay = box.querySelector('#cx_go_pay');
const btnCancel = box.querySelector('#cx_cancel_paid');
function close() { try { box.remove(); mask.remove(); } catch {} }
btnCancel.onclick = () => { close(); resolve(false); };
btnPay.onclick = async () => {
btnPay.disabled = true;
btnPay.textContent = '打开收银台...';
const payType = (box.querySelector('input[name="cx_pay"]:checked') || {}).value || DEFAULT_PAY;
const ok = await startPaymentPaid(payType);
if (!ok) { btnPay.disabled = false; btnPay.textContent = '去支付'; return; }
btnPay.textContent = '检测支付中...';
if (tip) tip.innerHTML = '已打开收银台,请完成支付,完成后此处会自动解锁...<br><span style="color:#ff6b35;font-size:12px;margin-top:4px;display:block;">💡 若无法打开支付页面请尝试连接手机热点网络</span>';
const done = await pollUntilLicensedPaid();
if (done) {
if (tip) tip.textContent = '支付成功,正在解锁...';
setLocallyLicensed();
try { updateTrialBadge(); } catch {}
setTimeout(() => { close(); resolve(true); }, 500);
} else {
btnPay.disabled = false;
btnPay.textContent = '去支付';
if (tip) tip.textContent = '未检测到支付完成,可重试或稍后再次打开本面板。';
}
};
});
}
function showFeedbackModal() {
const mask = document.createElement('div');
mask.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:999998;';
const box = document.createElement('div');
box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:400px;background:#fff;border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.2);overflow:hidden;z-index:999999;font-family:system-ui,Segoe UI,Arial;';
box.innerHTML = (
'<div style="padding:16px 20px;border-bottom:1px solid #f0f0f0;font-weight:600;font-size:16px;color:#333;">意见反馈</div>' +
'<div style="padding:24px 20px;text-align:center;">' +
'<div style="margin-bottom:16px;font-size:14px;color:#555;line-height:1.6;">' +
'如果您在使用过程中遇到问题或有任何建议,欢迎通过以下方式联系我们:' +
'</div>' +
'<div style="background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:16px;margin:16px 0;">' +
'<div style="font-size:16px;font-weight:600;color:#1677ff;margin-bottom:8px;">联系邮箱</div>' +
'<div style="font-size:18px;font-weight:bold;color:#333;cursor:pointer;" onclick="navigator.clipboard.writeText(\'[email protected]\')" title="点击复制">[email protected]</div>' +
'<div style="font-size:12px;color:#666;margin-top:4px;">点击邮箱地址即可复制</div>' +
'</div>' +
'<div style="font-size:13px;color:#888;margin-top:12px;line-height:1.5;">我们将会认真对待每一条反馈,并且尽快回复您的问题。您的建议是我们改进产品的重要动力!</div>' +
'</div>' +
'<div style="padding:12px 20px;border-top:1px solid #f0f0f0;text-align:right;">' +
'<button id="feedback-close" style="padding:8px 16px;border-radius:8px;border:none;background:#1677ff;color:#fff;cursor:pointer;font-size:14px;">关闭</button>' +
'</div>'
);
document.body.appendChild(mask);
document.body.appendChild(box);
const closeBtn = box.querySelector('#feedback-close');
function close() {
try {
box.remove();
mask.remove();
} catch {}
}
closeBtn.onclick = close;
mask.onclick = close;
const emailDiv = box.querySelector('[onclick*="clipboard"]');
if (emailDiv) {
emailDiv.addEventListener('click', function() {
const originalText = this.innerHTML;
this.innerHTML = '✅ 已复制到剪贴板';
this.style.color = '#52c41a';
setTimeout(() => {
this.innerHTML = originalText;
this.style.color = '#333';
}, 2000);
});
}
}
async function ensureAccessAllowed() {
if (await checkLicensePaid()) return true;
const used = getFreeUsedCount();
if (used < getFreeLimit()) { incFreeUsedCount(); try { updateTrialBadge(); } catch {} return true; }
const ok = await showPayModalPaid();
if (ok) { setLocallyLicensed(); try { updateTrialBadge(); } catch {} return true; }
throw new Error('试用已用完,请解锁后继续使用');
}
function getActivePanelRecord() {
try { const raw = localStorage.getItem(PANEL_REG_KEY); return raw ? JSON.parse(raw) : null; } catch { return null; }
}
function setActivePanelRecord(rec) {
try { localStorage.setItem(PANEL_REG_KEY, JSON.stringify(rec)); } catch {}
}
function clearActivePanelRecordIfOwner() {
try {
const cur = getActivePanelRecord();
if (cur && cur.id === PANEL_INSTANCE_ID) {
localStorage.removeItem(PANEL_REG_KEY);
}
} catch {}
}
function shouldWeOwn(current) {
const nowTs = Date.now();
if (!current) return { own: true, ts: nowTs };
if (!current.aliveTs || nowTs - current.aliveTs > STALE_MS) return { own: true, ts: nowTs };
try { if (current.url && current.url !== location.href) return { own: true, ts: nowTs }; } catch {}
if (FRAME_DEPTH > (current.depth || 0)) return { own: true, ts: nowTs };
if (FRAME_DEPTH === (current.depth || 0) && nowTs > (current.ts || 0)) return { own: true, ts: nowTs };
return { own: false, ts: nowTs };
}
function claimOwnership() {
const cur = getActivePanelRecord();
const decision = shouldWeOwn(cur);
if (decision.own) {
setActivePanelRecord({ id: PANEL_INSTANCE_ID, depth: FRAME_DEPTH, ts: decision.ts, aliveTs: Date.now(), url: location.href });
isActiveOwner = true;
} else {
isActiveOwner = false;
}
return isActiveOwner;
}
function startHeartbeat() {
if (heartbeatTimerId) return;
heartbeatTimerId = setInterval(() => {
if (!isActiveOwner) return;
const cur = getActivePanelRecord();
if (!cur || cur.id !== PANEL_INSTANCE_ID) { stopHeartbeat(); return; }
cur.aliveTs = Date.now();
try { cur.url = location.href; } catch {}
setActivePanelRecord(cur);
}, HEARTBEAT_INTERVAL_MS);
}
function stopHeartbeat() { if (heartbeatTimerId) { clearInterval(heartbeatTimerId); heartbeatTimerId = null; } }
const cleanupOwnership = () => {
stopHeartbeat();
clearActivePanelRecordIfOwner();
};
window.addEventListener('beforeunload', cleanupOwnership);
window.addEventListener('pagehide', cleanupOwnership);
function destroyPanelAndStop() {
try {
if (studyIntervalId) { clearInterval(studyIntervalId); studyIntervalId = null; }
isStudyingChapters = false;
isAnswering = false;
stopHeartbeat();
const panel = document.getElementById('answer-helper-panel');
if (panel && panel.parentNode) panel.parentNode.removeChild(panel);
createdPanelEl = null;
} catch {}
}
window.addEventListener('storage', (e) => {
if (e.key !== PANEL_REG_KEY) return;
const rec = getActivePanelRecord();
if (!rec) return;
if (rec.id === PANEL_INSTANCE_ID) {
if (!createdPanelEl) {
try { createdPanelEl = createPanel(); bindPanelEvents(); } catch {}
}
isActiveOwner = true;
startHeartbeat();
} else {
isActiveOwner = false;
destroyPanelAndStop();
}
});
GM_addStyle(`
/* Panel: Dark Glass Theme */
#answer-helper-panel {
position: fixed;
top: 24px;
left: 24px;
width: 520px;
min-width: 420px;
/* backdrop-filter removed for white theme */
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 0;
z-index: 9999;
box-shadow: 0 6px 20px rgba(0,0,0,0.12);
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: #333;
user-select: none;
overflow: hidden;
}
/* Header */
#answer-helper-header {
cursor: move;
height: 44px;
padding: 0 16px;
display: flex;
align-items: center;
justify-content: space-between;
background: #f7f8fa;
border-bottom: 1px solid #e5e7eb;
font-size: 15px;
letter-spacing: 0.2px;
color: #333;
}
#answer-helper-header .title {
display: inline-flex;
align-items: center;
gap: 8px;
font-weight: 600;
color: #333;
}
#answer-helper-header .title .accent {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle, #4cc9f0 0%, #4361ee 65%, transparent 66%);
box-shadow: 0 0 12px #3a86ff70;
}
#answer-helper-header .right {
display: inline-flex;
align-items: center;
gap: 8px;
}
#answer-helper-header .collapse-btn {
width: 30px;
height: 30px;
border-radius: 30px;
background: #edf2f7;
border: 1px solid #e5e7eb;
cursor: pointer;
color: #4a5568;
display: flex;
align-items: center;
justify-content: center;
transition: transform .15s ease, background .15s ease, color .15s ease;
}
#answer-helper-header .collapse-btn:hover {
background: #e2e8f0;
color: #2d3748;
transform: scale(1.04);
}
.collapse-btn-inner { width: 16px; height: 16px; position: relative; }
.collapse-icon-bar.horizontal { width: 14px; height: 2px; background: currentColor; border-radius: 2px; position: absolute; left: 1px; top: 7px; }
.collapse-icon-bar.vertical { width: 2px; height: 14px; background: currentColor; border-radius: 2px; position: absolute; left: 7px; top: 1px; }
/* Content */
#answer-helper-content { padding: 10px 14px; }
#answer-helper-panel.collapsed #answer-helper-content { display: none; }
#answer-helper-panel.collapsed { width: 220px; min-width: 180px; }
/* Two-column body: main + right actions column */
#answer-helper-content .panel-body {
display: grid;
grid-template-columns: 1fr 100px;
gap: 10px;
align-items: start;
}
.panel-main { min-width: 0; }
.panel-actions.panel-column { display: flex; flex-direction: column; gap: 8px; }
.panel-actions.panel-column .ah-btn { flex: unset; min-height: 48px; padding: 8px 6px; flex-direction: column; align-items: center; justify-content: center; gap: 6px; }
.panel-actions.panel-column .button-icon { font-size: 18px; }
.panel-actions.panel-column .button-text { font-size: 11px; }
/* Toast */
#no-task-toast {
position: fixed;
top: 20px;
right: 20px;
background: #ffffff;
border: 1px solid #e5e7eb;
color: #333;
padding: 10px 16px;
border-radius: 10px;
font-size: 13px;
z-index: 10000;
animation: fadeInOut 3s ease-in-out forwards;
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
@keyframes fadeInOut {
0% { opacity: 0; transform: translateY(-10px); }
10% { opacity: 1; transform: translateY(0); }
90% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-10px); }
}
/* Terminal Log */
#answer-log {
height: 160px;
overflow-y: auto;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 8px 10px 8px 12px;
margin: 8px 0 10px;
font-size: 12.5px;
line-height: 1.55;
font-family: SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
background: #f8f9fa;
color: #333;
}
#answer-log::-webkit-scrollbar { width: 8px; height: 8px; }
#answer-log::-webkit-scrollbar-track { background: #edf2f7; border-radius: 10px; }
#answer-log::-webkit-scrollbar-thumb { background: #cbd5e0; border-radius: 10px; }
.log-item { margin-bottom: 8px; padding: 8px 10px; border-radius: 8px; background: #ffffff; }
.success { color: #2e7d32; border-left: 3px solid #36c06a; }
.error { color: #c62828; border-left: 3px solid #ef4444; }
.debug { color: #1e40af; border-left: 3px solid #3a86ff; }
.info { color: #4b5563; border-left: 3px solid #9aa0a6; }
/* Button Grid */
/* (previous grid tile layout removed for right-side column design) */
.ah-btn {
flex: 1;
padding: 10px 12px;
border: 1px solid #e5e7eb;
border-radius: 10px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.2px;
cursor: pointer;
transition: all .18s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
color: #333;
background: #f5f7fa;
}
.ah-btn:hover { transform: translateY(-1px); background: #edf2f7; border-color: #cbd5e0; }
.ah-primary { background: #2563eb; color: #fff; border-color: #1d4ed8; }
.ah-primary:hover { background: #1d4ed8; }
.ah-danger { background: #ef4444; color: #fff; border-color: #dc2626; }
.ah-danger:hover { background: #dc2626; }
.ah-secondary { background: #f5f7fa; color: #333; }
.ah-success { background: #10b981; color: #fff; border-color: #059669; }
.ah-success:hover { background: #059669; }
.button-icon { font-size: 14px; line-height: 1; }
/* Speed buttons state */
.speed-button { transition: all .15s ease; }
.speed-active { background: #2563eb; color: #fff; }
#playback-speed-controls.segmented { display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px; }
#playback-speed-controls.segmented .ah-btn { min-width: 72px; padding: 8px 10px; }
/* Misc */
#debug-page{ display:none !important; }
#answer-helper-panel .cx-trial-badge{ position: absolute; left: 12px; bottom: 8px; color: #666; font-size: 12px; pointer-events: none; }
#answer-helper-content { padding-bottom: 18px; }
`);
function createPanel() {
const panel = document.createElement('div');
panel.id = 'answer-helper-panel';
panel.innerHTML = `
<div id="answer-helper-header">
<span class="title"><span class="accent"></span>研习助手</span>
<div class="right">
<button id="feedback-btn" class="ah-btn ah-secondary" style="min-width:auto; width:30px; height:30px; padding:0; border-radius:10px;">
<span class="button-icon" style="margin:0; font-size:14px;">💬</span>
</button>
<button class="collapse-btn" title="折叠/展开">
<span class="collapse-btn-inner">
<span class="collapse-icon-bar horizontal"></span>
</span>
</button>
</div>
</div>
<div id="answer-helper-content">
<div class="panel-body">
<div class="panel-main">
<div id="answer-log"></div>
<div id="playback-speed-controls" class="segmented" style="display:none;">
<button id="speed-1x" class="ah-btn ah-secondary speed-button speed-active"><span class="button-icon">1×</span></button>
<button id="speed-1.5x" class="ah-btn ah-secondary speed-button"><span class="button-icon">1.5×</span></button>
<button id="speed-2x" class="ah-btn ah-secondary speed-button"><span class="button-icon">2×</span></button>
</div>
</div>
<div class="panel-actions panel-column">
<button id="start-answer" class="ah-btn ah-primary">
<span class="button-icon">▶</span>
<span class="button-text">开始答题</span>
</button>
<button id="pause-answer" class="ah-btn ah-danger" style="display:none;">
<span class="button-icon">⏸</span>
<span class="button-text">暂停答题</span>
</button>
<button id="start-study" class="ah-btn ah-success">
<span class="button-icon">⏯</span>
<span class="button-text">开始刷章节(章节答题)</span>
</button>
<button id="pause-study" class="ah-btn ah-danger" style="display:none;">
<span class="button-icon">■</span>
<span class="button-text">暂停刷章节</span>
</button>
<button id="buy-license" class="ah-btn ah-secondary">
<span class="button-icon">💳</span>
<span class="button-text">购买授权</span>
</button>
<button id="debug-page" class="ah-btn ah-secondary">
<span class="button-icon">🔍</span>
<span class="button-text">调试页面</span>
</button>
</div>
</div>
</div>
<div id="cx_trial_badge" class="cx-trial-badge">检测中...</div>
`;
document.body.appendChild(panel);
let isDragging = false, offsetX = 0, offsetY = 0;
const header = panel.querySelector('#answer-helper-header');
header.addEventListener('mousedown', function(e) {
if (e.target.classList.contains('collapse-btn')) return;
isDragging = true;
const rect = panel.getBoundingClientRect();
offsetX = e.clientX - rect.left;
offsetY = e.clientY - rect.top;
document.body.style.userSelect = 'none';
});
document.addEventListener('mousemove', function(e) {
if (!isDragging) return;
panel.style.left = (e.clientX - offsetX) + 'px';
panel.style.top = (e.clientY - offsetY) + 'px';
panel.style.right = 'auto';
});
document.addEventListener('mouseup', function() {
isDragging = false;
document.body.style.userSelect = '';
});
const collapseBtn = panel.querySelector('.collapse-btn');
const collapseBtnInner = collapseBtn.querySelector('.collapse-btn-inner');
collapseBtn.addEventListener('click', function() {
panel.classList.toggle('collapsed');
collapseBtnInner.innerHTML = '';
if (panel.classList.contains('collapsed')) {
const h = document.createElement('span');
h.className = 'collapse-icon-bar horizontal';
const v = document.createElement('span');
v.className = 'collapse-icon-bar vertical';
collapseBtnInner.appendChild(h);
collapseBtnInner.appendChild(v);
} else {
const h = document.createElement('span');
h.className = 'collapse-icon-bar horizontal';
collapseBtnInner.appendChild(h);
}
});
return panel;
}
function bindPanelEvents() {
document.getElementById('start-answer')?.addEventListener('click', () => {
addLog('本助手仅供学习研究,请遵守课程与平台规则。', 'info');
addLog('开始自动答题...');
autoAnswer();
});
document.getElementById('pause-answer')?.addEventListener('click', () => {
isAnswering = false;
addLog('正在暂停自动答题...', 'info');
});
const startStudyBtn = document.getElementById('start-study');
const pauseStudyBtn = document.getElementById('pause-study');
if (startStudyBtn && pauseStudyBtn) {
startStudyBtn.addEventListener('click', () => {
addLog('本助手仅供学习研究,请遵守课程与平台规则。', 'info');
startStudyChapters();
});
pauseStudyBtn.addEventListener('click', () => { stopStudyChapters(); });
}
document.getElementById('speed-1x')?.addEventListener('click', () => {
setVideoPlaybackSpeed(1.0);
});
document.getElementById('speed-1.5x')?.addEventListener('click', () => {
setVideoPlaybackSpeed(1.5);
});
document.getElementById('speed-2x')?.addEventListener('click', () => {
setVideoPlaybackSpeed(2.0);
});
updateSpeedButtonsState();
const buyBtn = document.getElementById('buy-license');
if (buyBtn) {
buyBtn.addEventListener('click', async () => {
try {
await showPayModalPaid('免费试用,打赏5元永久解锁哦');
} catch (e) {
addLog('打开支付弹窗失败: ' + (e && e.message ? e.message : e), 'error');
}
});
}
document.getElementById('debug-page')?.addEventListener('click', () => { debugPageStructure(); });
document.getElementById('feedback-btn')?.addEventListener('click', () => { showFeedbackModal(); });
setTimeout(updateTrialBadge, 0);
}
function safeClick(el) {
try {
if (!el) return false;
el.click();
el.dispatchEvent(new MouseEvent('click', { bubbles: true }));
return true;
} catch { return false; }
}
function forEachSameOriginFrame(callback) {
const visit = (win) => {
for (let i = 0; i < win.frames.length; i++) {
const f = win.frames[i];
try {
const doc = f.document || f.contentDocument;
if (doc && doc.location && doc.location.href.includes('.chaoxing.com')) {
callback(doc);
visit(f);
}
} catch { }
}
};
try { callback(document); } catch {}
try { visit(window); } catch {}
}
function forEachAllSameOriginDocs(callback) {
const seen = new Set();
const visit = (win) => {
if (!win || seen.has(win)) return;
seen.add(win);
try {
const doc = win.document || win.contentDocument;
if (doc) callback(doc);
} catch {}
try {
const len = win.frames ? win.frames.length : 0;
for (let i = 0; i < len; i++) {
try { visit(win.frames[i]); } catch {}
}
} catch {}
};
try { visit(window.top); } catch { visit(window); }
}
async function waitForQuestionsRenderAny(timeoutMs = 8000) {
const end = Date.now() + timeoutMs;
const selector = '.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item';
while (Date.now() < end) {
let hit = null;
forEachAllSameOriginDocs((doc) => {
if (hit) return;
try {
const qs = doc.querySelectorAll(selector);
if (qs && qs.length > 0) hit = doc;
} catch {}
});
if (hit) return hit;
await new Promise(r => setTimeout(r, 300));
}
return null;
}
function gotoNextSection(contextDoc) {
const docsToTry = [];
if (contextDoc) docsToTry.push(contextDoc);
try { if (window.top && window.top.document) docsToTry.push(window.top.document); } catch {}
docsToTry.push(document);
const textNextRegex = /下一(节|章|单元|页|个)|继续|下一步|下一个|Next/i;
const nextBtnSelectors = [
'.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next',
'.prev_next .right a', '.switch-btn.next', '.icon-arrow-right', '.right-btn .next'
];
const currentNodeSelectors = ['.cur', '.curr', 'li.active', 'li.selected', '.posCatalog_active'];
try { if (isStudyingChapters) localStorage.setItem(STUDY_PERSIST_KEY, '1'); } catch {}
for (const doc of docsToTry) {
try {
for (const sel of nextBtnSelectors) {
const btn = doc.querySelector(sel);
if (btn && !btn.getAttribute('disabled') && !String(btn.className).includes('disabled')) {
if (safeClick(btn)) { addLog('检测到下一节按钮,已点击', 'success'); return true; }
}
}
for (const curSel of currentNodeSelectors) {
const cur = doc.querySelector(curSel);
if (cur && cur.nextElementSibling) {
const link = cur.nextElementSibling.querySelector('a');
if (link && safeClick(link)) { addLog('目录定位到下一小节', 'success'); return true; }
}
}
const links = Array.from(doc.querySelectorAll('a[href*="knowledgeId"], a[href*="chapterId"], a[href*="studentstudy"]'));
if (links.length > 1) {
const hrefNow = (location && location.href) || '';
const idx = links.findIndex(a => (a.href || '').includes('knowledgeId') && hrefNow.includes('knowledgeId') && a.href.split('knowledgeId')[1] === hrefNow.split('knowledgeId')[1]);
const next = idx >= 0 ? links[idx + 1] : null;
if (next && safeClick(next)) { addLog('通过目录链接顺序跳转下一小节', 'success'); return true; }
}
const clickable = Array.from(doc.querySelectorAll('a, button, .btn, .el-button, .next'));
for (const el of clickable) {
const txt = (el.textContent || '').trim();
if (textNextRegex.test(txt)) {
const excludeClasses = ['close', 'cancel', 'delete', 'remove', 'back', 'prev', 'disabled', 'popup', 'modal'];
const hasExcludeClass = excludeClasses.some(cls =>
el.className.toLowerCase().includes(cls) ||
el.id.toLowerCase().includes(cls)
);
const isVisible = el.offsetWidth > 0 && el.offsetHeight > 0 &&
window.getComputedStyle(el).display !== 'none' &&
window.getComputedStyle(el).visibility !== 'hidden';
const isValidNavigationElement = (
(el.tagName === 'A' && (el.href || el.onclick)) ||
(el.tagName === 'BUTTON' && el.onclick) ||
el.className.includes('btn') ||
el.className.includes('next')
) && !el.closest('.popup, .modal, .dialog, .alert');
const isNavigationText = /^(下一节|下一章|下一个|下一页|继续|Next)$/i.test(txt);
if (!hasExcludeClass && isVisible && isValidNavigationElement && isNavigationText) {
if (safeClick(el)) {
addLog(`通过文本匹配跳转: ${txt}`, 'success');
return true;
}
} else {
addLog(`跳过不合适的文本匹配元素: ${txt} (类名: ${el.className})`, 'debug');
}
}
}
} catch {}
}
addLog('未能自动跳转到下一小节', 'error');
return false;
}
function handleVideosInDocument(doc) {
try {
const videos = doc.querySelectorAll('video, .video-js video');
if (videos.length === 0) return false;
let any = false;
videos.forEach(v => {
try {
v.muted = true;
if (!Number.isNaN(v.playbackRate)) v.playbackRate = currentPlaybackSpeed;
const p = v.play(); if (p && typeof p.catch === 'function') p.catch(() => {});
v.loop = false;
if (!v.dataset.autonextBind) {
v.dataset.autonextBind = '1';
v.addEventListener('ended', () => {
if (v.dataset.disableAutoNext === '1' || !isStudyingChapters) return;
addLog('视频播放结束,进行完成度检测', 'success');
setTimeout(() => ensureSectionCompletedAndAdvance(doc), 300);
}, { passive: true });
let nearingFired = false;
const onTimeUpdate = () => {
if (v.dataset.disableAutoNext === '1' || !isStudyingChapters) return;
try {
const d = v.duration || 0;
const t = v.currentTime || 0;
if (d > 0 && (d - t) <= 1.0 && !nearingFired) {
nearingFired = true;
addLog('检测到视频即将结束,进行完成度检测', 'debug');
setTimeout(() => ensureSectionCompletedAndAdvance(doc), 800);
}
} catch {}
};
v.addEventListener('timeupdate', onTimeUpdate, { passive: true });
}
any = true;
} catch {}
});
const popBtns = doc.querySelectorAll('.ans-job-icon, .popBtn, .dialog-footer .btn, .ans-modal .btn, .vjs-big-play-button');
popBtns.forEach(b => safeClick(b));
return any;
} catch { return false; }
}
function handlePPTInDocument(doc) {
try {
const nextSelectors = ['.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next'];
for (const sel of nextSelectors) {
const btn = doc.querySelector(sel);
if (btn && !btn.className.includes('disabled') && !btn.getAttribute('disabled')) {
if (safeClick(btn)) { addLog('PPT自动下一页', 'debug'); return true; }
}
}
const container = doc.scrollingElement || doc.body;
if (container) container.scrollTop = container.scrollHeight;
return false;
} catch { return false; }
}
function findChapterQuizTab(doc) {
try {
const byTitle = doc.querySelector('li[title*="章节测验"], li[title*="测验"], a[title*="章节测验"], a[title*="测验"]');
if (byTitle) return byTitle;
const byOnClick = Array.from(doc.querySelectorAll('li[onclick], a[onclick], button[onclick]')).find(el => {
const oc = (el.getAttribute('onclick') || '').toString();
return oc.includes('changeDisplayContent') && (oc.includes('(2,2') || oc.includes(',2)'));
});
if (byOnClick) return byOnClick;
const candidates = Array.from(doc.querySelectorAll('li, a, button, [role="tab"], [role="option"]'));
const textEl = candidates.find(el => /章节测验|测验/.test(((el.textContent || el.getAttribute('title') || '') + '').trim()));
if (textEl) return textEl;
} catch {}
return null;
}
async function waitForQuestionsRender(doc, timeoutMs = 6000) {
const end = Date.now() + timeoutMs;
while (Date.now() < end) {
try {
const qs = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item');
if (qs.length > 0) return true;
} catch {}
await new Promise(r => setTimeout(r, 300));
}
return false;
}
let TYPR_MD5_LIB, FONT_TABLE_DATA;
try {
TYPR_MD5_LIB = GM_getResourceText('typrMd5Lib');
FONT_TABLE_DATA = GM_getResourceText('fontTableData');
if (TYPR_MD5_LIB) {
window.TYPR_MD5_LIB = TYPR_MD5_LIB;
}
if (FONT_TABLE_DATA) {
window.FONT_TABLE_DATA = FONT_TABLE_DATA;
}
} catch (e) {
console.error('加载外部资源失败:', e);
TYPR_MD5_LIB = '';
FONT_TABLE_DATA = '{}';
}
function injectConsoleDecryptCode(doc, timeoutMs = 3000) {
return new Promise((resolve) => {
try {
const consoleCode = `
if (!window.Typr || !window.md5) {
${TYPR_MD5_LIB || window.TYPR_MD5_LIB || ''}
}
if (!window.chaoXingFontTable) {
window.chaoXingFontTable = ${FONT_TABLE_DATA || window.FONT_TABLE_DATA || '{}'};
}
const decryptChaoXingFont = async () => {
const { Typr, md5, chaoXingFontTable: table } = window;
const base64ToUint8Array = (base64) => {
const data = atob(base64);
const buffer = new Uint8Array(data.length);
for (let i = 0; i < data.length; i++) {
buffer[i] = data.charCodeAt(i);
}
return buffer;
};
const styleElements = [...document.querySelectorAll('style')];
const cxStyle = styleElements.find(el =>
el.textContent.includes('font-cxsecret')
);
if (!cxStyle) {
return;
}
const fontData = cxStyle.textContent.match(/base64,([\\w\\W]+?)'/)[1];
const parsedFont = Typr.parse(base64ToUint8Array(fontData))[0];
const charMap = {};
for (let charCode = 19968; charCode < 40870; charCode++) {
const glyph = Typr.U.codeToGlyph(parsedFont, charCode);
if (!glyph) continue;
const path = Typr.U.glyphToPath(parsedFont, glyph);
const pathHash = md5(JSON.stringify(path)).slice(24);
charMap[String.fromCharCode(charCode)] =
String.fromCharCode(table[pathHash]);
}
document.querySelectorAll('.font-cxsecret').forEach(element => {
let htmlContent = element.innerHTML;
Object.entries(charMap).forEach(([encryptedChar, decryptedChar]) => {
const regex = new RegExp(encryptedChar, 'g');
htmlContent = htmlContent.replace(regex, decryptedChar);
});
element.innerHTML = htmlContent;
element.classList.remove('font-cxsecret');
});
};
decryptChaoXingFont().catch(console.error);
`;
const beforeCnt = (() => { try { return doc.querySelectorAll('.font-cxsecret').length; } catch { return -1; } })();
let script = doc.createElement('script');
script.type = 'text/javascript';
let blobUrl = '';
try {
const blob = new Blob([consoleCode], { type: 'text/javascript' });
blobUrl = (doc.defaultView || window).URL.createObjectURL(blob);
script.src = blobUrl;
} catch {
script.textContent = consoleCode;
}
(doc.head || doc.documentElement).appendChild(script);
script.onload = () => { try { if (blobUrl) (doc.defaultView || window).URL.revokeObjectURL(blobUrl); } catch {} };
const start = Date.now();
const timer = setInterval(() => {
try {
const cnt = doc.querySelectorAll('.font-cxsecret').length;
if (cnt === 0 || (beforeCnt >= 0 && cnt < beforeCnt)) { clearInterval(timer); resolve(); return; }
} catch {}
if (Date.now() - start > timeoutMs) { clearInterval(timer); resolve(); }
}, 200);
} catch { resolve(); }
});
}
async function tryEnterQuizAndAnswer(contextDoc) {
try {
if (!isStudyingChapters) return false;
let targetDoc = null;
let tabEl = null;
forEachAllSameOriginDocs((doc) => {
if (tabEl) return;
const el = findChapterQuizTab(doc);
if (el) { tabEl = el; targetDoc = doc; }
});
if (!tabEl || !targetDoc) return false;
addLog('检测到章节测验入口,正在进入...', 'info');
await new Promise((r) => {
let pending = 0; let done = false;
forEachAllSameOriginDocs((doc) => {
pending++; injectConsoleDecryptCode(doc).finally(() => { if (--pending === 0 && !done) { done = true; r(); } });
});
if (pending === 0) r();
});
try { tabEl.scrollIntoView({ block: 'center', behavior: 'smooth' }); } catch {}
const clicked = safeClick(tabEl);
const oc = (tabEl.getAttribute('onclick') || '').toString();
const m = oc.match(/changeDisplayContent\(([^)]*)\)/);
if (!clicked && m && m[1]) {
try {
const ownerWin = (tabEl.ownerDocument && tabEl.ownerDocument.defaultView) || null;
const topWin = (function(){ try { return window.top; } catch { return window; } })();
const evalWin = ownerWin || topWin || window;
const args = evalWin.eval('[' + m[1] + ']');
const fn = (ownerWin && ownerWin.changeDisplayContent) || (topWin && topWin.changeDisplayContent) || window.changeDisplayContent;
if (typeof fn === 'function') {
fn.apply(ownerWin || topWin || window, args);
} else {
addLog('未找到changeDisplayContent函数可调用', 'error');
}
} catch (e) {
addLog('直接调用changeDisplayContent失败: ' + e.message, 'error');
}
}
const qDoc = await waitForQuestionsRenderAny(10000);
if (!isStudyingChapters) return false;
if (!qDoc) {
addLog('进入章节测验后未检测到题目,自动跳转下一节', 'info');
try { gotoNextSection(targetDoc || document); } catch {}
return true;
}
await injectConsoleDecryptCode(qDoc);
if (!isStudyingChapters) return false;
await autoAnswerInDocument(qDoc);
addLog('章节测验已自动作答', 'success');
return true;
} catch (e) {
addLog(`进入章节测验失败: ${e.message}`, 'error');
return false;
}
}
function hasActionableStudyContent(doc) {
try {
if (doc.querySelector('video, .video-js video')) return true;
const docSelectors = [
'.ans-attach-ct', '.reader', '.ppt', '.ppt-play', '.vjs-control', '.vjs-big-play-button',
'.catalog', '.course_section', '.posCatalog', '.posCatalog_active', '.catalogTree'
];
if (docSelectors.some(sel => !!doc.querySelector(sel))) return true;
const nextSelectors = ['.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next'];
if (nextSelectors.some(sel => !!doc.querySelector(sel))) return true;
if (doc.querySelector('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item')) return true;
if (doc.querySelector('input[type="radio"], input[type="checkbox"], textarea, select')) return true;
if (doc.querySelector('[id^="answerEditor"], iframe[id^="ueditor_"], div[contenteditable="true"]')) return true;
const iframes = Array.from(doc.querySelectorAll('iframe'));
if (iframes.some(f => {
const src = (f.getAttribute('src') || '').toLowerCase();
return src.includes('mooc-ans') || src.includes('document') || src.includes('ppt') || src.includes('video') || src.includes('knowledgeid');
})) return true;
if (doc.querySelector('.cur, .curr, li.active, li.selected, .posCatalog_active')) return true;
} catch {}
return false;
}
function hasUnansweredQuestions(doc) {
try {
const containers = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item');
for (const q of containers) {
try { if (!isQuestionAnswered(q)) return true; } catch {}
}
const radios = Array.from(doc.querySelectorAll('input[type="radio"]'));
if (radios.length > 0) {
const groups = new Map();
radios.forEach(r => {
const k = r.name || `__radio_${Math.random()}`;
if (!groups.has(k)) groups.set(k, []);
groups.get(k).push(r);
});
for (const [, list] of groups) {
if (!list.some(r => r.checked)) return true;
}
}
const texts = Array.from(doc.querySelectorAll('textarea, input[type="text"], div[contenteditable="true"]'));
if (texts.length > 0) {
if (texts.some(el => {
if (el.tagName && el.tagName.toLowerCase() === 'div') return ((el.innerText || el.textContent || '').trim().length === 0);
return ((el.value || '').trim().length === 0);
})) return true;
}
} catch {}
return false;
}
function tryAutoSkipEmptySection() {
if (!isStudyingChapters) return false;
const now = Date.now();
if (now - lastAutoSkipTs < 4000) return false;
const href = (location && location.href) || '';
const key = href.split('?')[0] + (href.includes('knowledgeId') ? ('?k=' + href.split('knowledgeId')[1]) : '');
if (key !== lastEmptySectionKey) { lastEmptySectionKey = key; emptyChecksCount = 0; }
let found = false;
forEachSameOriginFrame((doc) => {
if (found) return;
if (hasActionableStudyContent(doc)) { found = true; return; }
if (hasUnansweredQuestions(doc)) { found = true; return; }
});
if (!found) {
emptyChecksCount += 1;
addLog(`小节判空第${emptyChecksCount}次`, 'debug');
if (emptyChecksCount >= 2) {
lastAutoSkipTs = now;
emptyChecksCount = 0;
addLog('检测到空白小节(已二次确认),自动跳转下一小节', 'info');
gotoNextSection(document);
return true;
}
} else {
emptyChecksCount = 0;
}
return false;
}
async function autoAnswerInDocument(rootDoc) {
try {
if (!isStudyingChapters) return false;
if (isQuizPageDoc(rootDoc)) {
if (!isStudyingChapters) return false;
const ok = await autoAnswerQuizInDocument(rootDoc);
if (ok) return true;
}
const possibleSelectors = ['.question', '.questionLi', '.subject_item', '.examPaper_subject', '.questionContainer', '.q-item', '.subject_node', '[class*="question"]', '[class*="subject"]', '.ti-item', '.exam-item'];
let questions = [];
for (let selector of possibleSelectors) {
questions = rootDoc.querySelectorAll(selector);
if (questions.length > 0) break;
}
if (questions.length === 0) return false;
addLog(`章节内发现 ${questions.length} 个题目,自动作答...`, 'info');
for (let q of questions) {
if (!isStudyingChapters) { addLog('已暂停刷章节,停止小测作答', 'info'); return false; }
const info = getQuestionInfo(q);
if (!info || !info.question) continue;
const ans = await getAnswer(info);
if (ans) {
fillAnswer(ans, q, info.type);
await new Promise(r => setTimeout(r, 800));
}
}
return true;
} catch (e) { addLog(`章节答题出错: ${e.message}`, 'error'); return false; }
}
function isStudyPage() { return /mycourse\/studentstudy|mooc2-ans|knowledgeId|chapterId/.test(location.href); }
function hasStudyContentDeep() {
let found = false;
const tryDoc = (doc) => {
try {
if (doc.querySelector('video, .video-js, .ans-attach-ct, .reader, .ppt, .ppt-play, .catalog, .vjs-play-control')) { found = true; return; }
if (doc.querySelector('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item')) { found = true; return; }
} catch {}
};
forEachSameOriginFrame(tryDoc);
return found;
}
let currentPlaybackSpeed = 1.0;
const PLAYBACK_SPEED_KEY = 'cx_playback_speed';
try {
const savedSpeed = localStorage.getItem(PLAYBACK_SPEED_KEY);
if (savedSpeed) {
currentPlaybackSpeed = parseFloat(savedSpeed);
}
} catch {}
function updateSpeedButtonsState() {
const speedButtons = document.querySelectorAll('.speed-button');
speedButtons.forEach(btn => {
btn.classList.remove('speed-active');
});
const activeButton = document.getElementById(`speed-${currentPlaybackSpeed}x`);
if (activeButton) {
activeButton.classList.add('speed-active');
}
}
function setVideoPlaybackSpeed(speed) {
currentPlaybackSpeed = speed;
try {
localStorage.setItem(PLAYBACK_SPEED_KEY, speed.toString());
} catch {}
updateSpeedButtonsState();
forEachSameOriginFrame((doc) => {
try {
const videos = doc.querySelectorAll('video, .video-js video');
videos.forEach(v => {
if (!Number.isNaN(v.playbackRate)) v.playbackRate = speed;
});
} catch {}
});
addLog(`视频播放速度已设置为 ${speed}×`, 'success');
}
function updateStudyButtons(running) {
const startBtn = document.getElementById('start-study');
const pauseBtn = document.getElementById('pause-study');
const speedControls = document.getElementById('playback-speed-controls');
if (!startBtn || !pauseBtn) return;
if (running) {
startBtn.style.display = 'none';
pauseBtn.style.display = 'flex';
if (speedControls) speedControls.style.display = 'flex';
} else {
startBtn.style.display = 'flex';
pauseBtn.style.display = 'none';
if (speedControls) speedControls.style.display = 'none';
}
}
function startStudyChapters() {
if (isStudyingChapters) { addLog('刷章节已在运行', 'info'); return; }
isStudyingChapters = true;
try { localStorage.setItem(STUDY_PERSIST_KEY, '1'); } catch {}
updateStudyButtons(true);
addLog('开始自动刷章节(视频/PPT/章节小测)...', 'success');
addLog('⚠️ 章节视频请勿倍速观看,倍速观看可能导致账号异常哦', 'warning');
forEachSameOriginFrame((doc) => {
try { doc.querySelectorAll('video, .video-js video').forEach(v => { delete v.dataset.disableAutoNext; }); } catch {}
handleVideosInDocument(doc);
handlePPTInDocument(doc);
autoAnswerInDocument(doc);
});
tryAutoSkipEmptySection();
studyIntervalId = setInterval(() => {
if (!isStudyingChapters) return;
forEachSameOriginFrame((doc) => {
handleVideosInDocument(doc);
handlePPTInDocument(doc);
});
tryAutoSkipEmptySection();
}, 3000);
}
function stopStudyChapters() {
if (!isStudyingChapters) return;
isStudyingChapters = false;
if (studyIntervalId) { clearInterval(studyIntervalId); studyIntervalId = null; }
try { localStorage.removeItem(STUDY_PERSIST_KEY); } catch {}
forEachSameOriginFrame((doc) => {
try {
doc.querySelectorAll('video, .video-js video').forEach(v => {
v.dataset.disableAutoNext = '1';
try { v.pause(); } catch {}
});
} catch {}
});
updateStudyButtons(false);
addLog('已暂停刷章节', 'info');
}
const LOG_SHOW_DEBUG = false;
const LOG_MAX_ITEMS = 120;
function addLog(message, type = 'info') {
try {
if (type === 'debug' && !LOG_SHOW_DEBUG) return;
const logContainer = document.getElementById('answer-log');
if (!logContainer) return;
const text = String(message || '')
.replace(/\s+/g, ' ')
.slice(0, 140);
const logItem = document.createElement('div');
logItem.className = `log-item ${type}`;
logItem.textContent = `${new Date().toLocaleTimeString()} - ${text}`;
logContainer.appendChild(logItem);
const items = logContainer.querySelectorAll('.log-item');
if (items.length > LOG_MAX_ITEMS) {
const removeCount = items.length - LOG_MAX_ITEMS;
for (let i = 0; i < removeCount; i++) {
const n = logContainer.firstElementChild;
if (n) logContainer.removeChild(n);
}
}
logContainer.scrollTop = logContainer.scrollHeight;
} catch {}
}
async function updateTrialBadge() {
try {
const el = document.getElementById('cx_trial_badge');
if (!el) return;
const licensed = await checkLicensePaid();
const buyBtn = document.getElementById('buy-license');
if (buyBtn) {
const group = buyBtn.closest('.button-group');
if (licensed) {
if (group) group.style.display = 'none';
else buyBtn.style.display = 'none';
} else {
if (group) group.style.display = 'flex';
else buyBtn.style.display = 'flex';
}
}
if (licensed) {
el.textContent = '永久激活,感谢赞助';
return;
}
const used = getFreeUsedCount();
const remain = Math.max(0, getFreeLimit() - used);
el.textContent = `试用剩余:${remain}/${getFreeLimit()}`;
} catch {}
}
function getQuestionInfo(questionElement) {
try {
addLog('题目元素HTML结构:' + questionElement.outerHTML.substring(0, 200) + '...', 'debug');
const questionId = questionElement.id || '';
addLog(`题目ID: ${questionId}`, 'debug');
const possibleTypeSelectors = [
'.type_title',
'.mark_name',
'.questionType',
'div[class*="type"]',
'div[class*="Type"]',
'.subject_type',
'.q-type',
'div[class*="questionType"]',
'.stem_type'
];
const possibleQuestionSelectors = [
'.subject_describe',
'.mark_name',
'.questionContent',
'.title',
'div[class*="title"]',
'.subject_stem',
'.q-body',
'.question-content',
'.stem-content',
'.stem_txt'
];
let typeText = '';
for (let selector of possibleTypeSelectors) {
const element = questionElement.querySelector(selector);
if (element) {
typeText = element.textContent.trim();
addLog(`找到题目类型: ${typeText},使用选择器: ${selector}`, 'debug');
break;
}
}
let type = '';
if (typeText.includes('单选题')) type = 'single';
else if (typeText.includes('多选题')) type = 'multiple';
else if (typeText.includes('判断题')) type = 'judge';
else if (typeText.includes('填空题')) type = 'blank';
else if (typeText.includes('简答题')) type = 'short';
else if (typeText.includes('名词解释')) type = 'term';
else if (typeText.includes('论述题')) type = 'essay';
else if (typeText.includes('计算题')) type = 'calculation';
else if (typeText.includes('完形填空')) type = 'cloze';
else if (typeText.includes('写作题')) type = 'writing';
else if (typeText.includes('连线题')) type = 'matching';
else if (typeText.includes('分录题')) type = 'accounting';
let questionText = '';
for (let selector of possibleQuestionSelectors) {
const element = questionElement.querySelector(selector);
if (element) {
questionText = element.textContent.trim();
addLog(`找到题目内容: ${questionText.substring(0, 30)}...,使用选择器: ${selector}`, 'debug');
break;
}
}
const optionSelectors = [
'.stem_answer > div',
'.stem_answer div[class*="option"]',
'div.stem_answer > div',
`#${questionId} > div.stem_answer > div`,
'.answer_p',
'.subject_node',
'.answer_options',
'.options div'
];
let options = [];
let foundSelector = '';
for (let selector of optionSelectors) {
const elements = questionElement.querySelectorAll(selector);
if (elements.length > 0) {
options = Array.from(elements).map((option, index) => {
const text = option.textContent.trim();
const letter = String.fromCharCode(65 + index);
addLog(`选项 ${letter}: ${text}`, 'debug');
return text;
});
foundSelector = selector;
addLog(`找到选项,使用选择器: ${selector},数量: ${elements.length}`, 'debug');
break;
}
}
if (options.length === 0 && questionId) {
for (let i = 1; i <= 6; i++) {
const specificSelector = `#${questionId} > div.stem_answer > div:nth-child(${i})`;
const element = document.querySelector(specificSelector);
if (element) {
options.push(element.textContent.trim());
addLog(`使用nth-child选择器找到选项 ${i}: ${element.textContent.trim()}`, 'debug');
}
}
}
if (!type || !questionText) {
addLog('未能完全识别题目信息', 'error');
}
return {
type,
question: questionText,
options,
foundSelector,
questionId
};
} catch (error) {
addLog(`解析题目失败: ${error.message}`, 'error');
return null;
}
}
function getModelParams(questionType) {
const preciseTypes = ['single', 'multiple', 'blank', 'cloze', 'judge', 'term'];
if (preciseTypes.includes(questionType)) {
return {
temperature: 0.1,
max_tokens: 100,
top_p: 0.1,
frequency_penalty: 0.1,
presence_penalty: 0.1
};
} else {
return {
temperature: 0.5,
max_tokens: 500,
top_p: 0.8,
frequency_penalty: 0.3,
presence_penalty: 0.3
};
}
}
async function getAnswer(questionInfo) {
try {
await ensureAccessAllowed();
} catch (e) {
addLog(String(e && e.message ? e.message : e), 'error');
return null;
}
const prompt = generatePrompt(questionInfo);
addLog(`发送到DeepSeek的提示词:\n${prompt}`, 'debug');
try {
const modelParams = getModelParams(questionInfo.type);
addLog(`使用模型参数: ${JSON.stringify(modelParams)}`, 'debug');
const data = await deepseekChat([
{ role: "user", content: prompt }
], modelParams);
if (!data.choices || !data.choices[0] || !data.choices[0].message) {
throw new Error('Invalid API response format');
}
const answer = data.choices[0].message.content.trim();
return answer;
} catch (error) {
addLog(`API调用失败: ${error.message}`, 'error');
return null;
}
}
function generatePrompt(questionInfo) {
let prompt = `直接给出答案不要解释 \n题目:${questionInfo.question}\n`;
if (questionInfo.type === 'single' || questionInfo.type === 'multiple' || questionInfo.type === 'judge') {
if (questionInfo.options && questionInfo.options.length > 0) {
prompt += '选项:\n';
questionInfo.options.forEach((option, index) => {
const letter = String.fromCharCode(65 + index);
const cleanOption = option.replace(/^[A-Z][\s.、.。]+|^\d+[\s.、.。]+/, '').trim();
prompt += `${letter}. ${cleanOption}\n`;
});
if (questionInfo.type === 'single') {
prompt += '\n请直接回答选项字母(A/B/C/D/...)';
} else if (questionInfo.type === 'multiple') {
prompt += '\n这是多选题,请列出所有正确选项的字母,用逗号分隔(如:A,B,D)';
} else if (questionInfo.type === 'judge') {
prompt += '\n这是判断题,请回答A表示正确,B表示错误';
}
}
} else if (questionInfo.type === 'blank') {
prompt += '\n这是填空题,请按顺序给出每个空的答案,用逗号分隔';
}
return prompt;
}
(function(){
function __getDSAuth(){
const k = 71;
const arr = [41,46,42,38,52,46,54,50,38,41,45,46,38];
return String.fromCharCode(...arr.map(n => n ^ k));
}
window.__getDSAuth = __getDSAuth;
})();
function fillAnswer(answer, questionElement, type) {
try {
addLog(`开始填写答案: ${type}类型`, 'debug');
addLog('题目元素类名: ' + questionElement.className, 'debug');
let filled = false;
const questionId = questionElement.id;
addLog(`处理题目ID: ${questionId}`, 'debug');
switch (type) {
case 'blank':
case 'cloze': {
const answers = answer.split(/[,,;;、]\s*/).map(a => a.trim()).filter(a => a);
addLog(`解析到的答案数量: ${answers.length}`, 'debug');
answers.forEach((ans, idx) => addLog(`第${idx + 1}个答案: ${ans}`, 'debug'));
const editorElements = questionElement.querySelectorAll('[id^="answerEditor"]');
if (editorElements.length > 0) {
addLog(`找到UEditor元素数量: ${editorElements.length}`, 'debug');
editorElements.forEach((editorElement, index) => {
const editorId = editorElement.id;
addLog(`处理第${index + 1}个编辑器: ${editorId}`, 'debug');
if (index < answers.length) {
const currentAnswer = answers[index];
try {
if (typeof UE !== 'undefined' && UE.getEditor) {
const editor = UE.getEditor(editorId);
if (editor) {
if (editor.ready) {
editor.ready(() => {
editor.setContent(currentAnswer);
addLog(`通过UEditor API设置第${index + 1}个空的内容: ${currentAnswer}`, 'debug');
if (typeof editor.fireEvent === 'function') {
editor.fireEvent('contentChange');
}
});
filled = true;
}
}
}
if (!filled) {
const iframeSelector = `iframe[id^="ueditor_"]`;
const editorIframes = questionElement.querySelectorAll(iframeSelector);
const editorIframe = editorIframes[index];
if (editorIframe) {
try {
const iframeDoc = editorIframe.contentDocument || editorIframe.contentWindow.document;
const editorBody = iframeDoc.body;
if (editorBody) {
editorBody.innerHTML = currentAnswer;
editorBody.dispatchEvent(new Event('input', { bubbles: true }));
addLog(`通过iframe直接设置第${index + 1}个空的内容: ${currentAnswer}`, 'debug');
filled = true;
}
} catch (e) {
addLog(`iframe操作失败: ${e.message}`, 'error');
}
}
}
const textarea = document.getElementById(editorId);
if (textarea) {
textarea.value = currentAnswer;
textarea.dispatchEvent(new Event('change', { bubbles: true }));
textarea.dispatchEvent(new Event('input', { bubbles: true }));
addLog(`设置第${index + 1}个空的textarea值: ${currentAnswer}`, 'debug');
}
} catch (e) {
addLog(`处理第${index + 1}个空时出错: ${e.message}`, 'error');
}
} else {
addLog(`警告:第${index + 1}个空没有对应的答案`, 'error');
}
});
}
if (!filled) {
const blankInputs = [
...questionElement.querySelectorAll('input[type="text"]'),
...questionElement.querySelectorAll('.blank'),
...questionElement.querySelectorAll('.fill-blank'),
...questionElement.querySelectorAll('[class*="blank"]'),
...questionElement.querySelectorAll('[class*="fill"]'),
...questionElement.querySelectorAll('textarea')
];
if (blankInputs.length > 0) {
addLog(`找到 ${blankInputs.length} 个普通输入框`, 'debug');
blankInputs.forEach((input, index) => {
if (index < answers.length) {
try {
input.value = answers[index];
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
addLog(`填写第${index + 1}个空: ${answers[index]}`, 'debug');
filled = true;
} catch (e) {
addLog(`填写第${index + 1}个空失败: ${e.message}`, 'error');
}
} else {
addLog(`警告:第${index + 1}个输入框没有对应的答案`, 'error');
}
});
}
}
break;
}
case 'short':
case 'term':
case 'essay':
case 'writing':
case 'calculation':
case 'matching':
case 'accounting': {
const textInputs = [
...questionElement.querySelectorAll('textarea'),
...questionElement.querySelectorAll('.answer-area'),
...questionElement.querySelectorAll('.writing-area'),
...questionElement.querySelectorAll('[class*="answer"]'),
...questionElement.querySelectorAll('[class*="text-area"]'),
...questionElement.querySelectorAll('div[contenteditable="true"]')
];
if (textInputs.length > 0) {
textInputs.forEach(input => {
try {
if (input.tagName.toLowerCase() === 'textarea' || input.tagName.toLowerCase() === 'input') {
input.value = answer;
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
}
else if (input.getAttribute('contenteditable') === 'true') {
input.innerHTML = answer;
input.dispatchEvent(new Event('input', { bubbles: true }));
}
addLog(`填写答案到${input.tagName.toLowerCase()}`, 'debug');
filled = true;
} catch (e) {
addLog(`填写答案失败: ${e.message}`, 'error');
}
});
}
const editors = [
...questionElement.querySelectorAll('.editor'),
...questionElement.querySelectorAll('[class*="editor"]'),
...questionElement.querySelectorAll('iframe')
];
editors.forEach(editor => {
try {
if (editor.tagName.toLowerCase() === 'iframe') {
const iframeDoc = editor.contentDocument || editor.contentWindow.document;
const editorBody = iframeDoc.body;
if (editorBody) {
editorBody.innerHTML = answer;
editorBody.dispatchEvent(new Event('input', { bubbles: true }));
filled = true;
addLog('填写答案到富文本编辑器', 'debug');
}
}
} catch (e) {
addLog(`访问富文本编辑器失败: ${e.message}`, 'error');
}
});
break;
}
case 'single':
case 'multiple':
case 'judge': {
let answerLetters;
if (type === 'multiple') {
answerLetters = answer.toUpperCase().split(/[,,、\s]+/).map(l => l.trim());
} else {
answerLetters = [answer.toUpperCase().trim()];
}
addLog(`识别到的选项字母: ${answerLetters.join(', ')}`, 'debug');
for (const letter of answerLetters) {
if (!/^[A-Z]$/.test(letter)) {
addLog(`跳过无效的选项字母: ${letter}`, 'error');
continue;
}
const index = letter.charCodeAt(0) - 65 + 1; // 1-based index for nth-child
const specificSelector = `#${questionId} > div.stem_answer > div:nth-child(${index})`;
const optionElement = document.querySelector(specificSelector);
if (optionElement) {
try {
optionElement.click();
addLog(`点击选项元素: ${specificSelector}`, 'debug');
const input = optionElement.querySelector('input');
if (input) {
input.click();
input.checked = true;
input.dispatchEvent(new Event('change', { bubbles: true }));
addLog(`点击选项input元素`, 'debug');
}
const label = optionElement.querySelector('label');
if (label) {
label.click();
addLog(`点击选项label元素`, 'debug');
}
filled = true;
} catch (e) {
addLog(`点击选项 ${letter} 失败: ${e.message}`, 'error');
}
} else {
addLog(`未找到选项元素: ${specificSelector}`, 'error');
}
}
break;
}
default:
break;
}
if (filled) {
addLog(`答案填写成功`, 'success');
} else {
addLog(`答案可能未成功填写,请检查`, 'error');
}
try {
const submitButtons = [
...questionElement.querySelectorAll('button[type="submit"]'),
...questionElement.querySelectorAll('input[type="submit"]'),
...questionElement.querySelectorAll('.submit-btn'),
...questionElement.querySelectorAll('.save-btn'),
...questionElement.querySelectorAll('[class*="submit"]'),
...questionElement.querySelectorAll('[class*="save"]')
];
if (submitButtons.length > 0) {
submitButtons[0].click();
addLog('触发了提交按钮', 'debug');
}
} catch (e) {
addLog(`触发提交按钮失败: ${e.message}`, 'debug');
}
} catch (error) {
addLog(`答案填写失败: ${error.message}`, 'error');
}
}
function debugPageStructure() {
addLog('开始调试页面结构...', 'debug');
addLog('页面URL: ' + window.location.href, 'debug');
addLog('页面标题: ' + document.title, 'debug');
const possibleContainers = [
'.question',
'.questionLi',
'.subject_item',
'.examPaper_subject',
'.questionContainer',
'.q-item',
'.subject_node',
'[class*="question"]',
'[class*="subject"]'
];
for (let selector of possibleContainers) {
const elements = document.querySelectorAll(selector);
addLog(`使用选择器 ${selector} 找到 ${elements.length} 个元素`, 'debug');
if (elements.length > 0) {
addLog(`第一个元素HTML结构:${elements[0].outerHTML.substring(0, 200)}...`, 'debug');
}
}
const allElements = document.querySelectorAll('*');
const relevantElements = Array.from(allElements).filter(el => {
const className = el.className || '';
const id = el.id || '';
return (className + id).toLowerCase().includes('question') ||
(className + id).toLowerCase().includes('answer') ||
(className + id).toLowerCase().includes('option') ||
(className + id).toLowerCase().includes('subject');
});
addLog(`找到 ${relevantElements.length} 个可能相关的元素`, 'debug');
relevantElements.forEach(el => {
addLog(`发现元素: ${el.tagName.toLowerCase()}.${el.className}#${el.id}`, 'debug');
addLog(`元素HTML: ${el.outerHTML.substring(0, 100)}...`, 'debug');
});
const inputs = document.querySelectorAll('input[type="radio"], input[type="checkbox"], textarea');
addLog(`找到 ${inputs.length} 个输入元素`, 'debug');
inputs.forEach(input => {
addLog(`输入元素: type=${input.type}, name=${input.name}, class=${input.className}`, 'debug');
});
}
function updateStatus(running) {
const startButton = document.getElementById('start-answer');
const pauseButton = document.getElementById('pause-answer');
if (running) {
startButton.style.display = 'none';
pauseButton.style.display = 'flex';
} else {
startButton.style.display = 'flex';
pauseButton.style.display = 'none';
}
}
function hasQuestions() {
const possibleSelectors = [
'.question',
'.questionLi',
'.subject_item',
'.examPaper_subject',
'.questionContainer',
'.q-item',
'.subject_node',
'[class*="question"]',
'[class*="subject"]',
'.ti-item',
'.exam-item'
];
for (let selector of possibleSelectors) {
const questions = document.querySelectorAll(selector);
if (questions.length > 0) {
return true;
}
}
const allElements = document.querySelectorAll('*');
const possibleQuestions = Array.from(allElements).filter(el => {
const className = el.className || '';
const id = el.id || '';
const text = el.textContent || '';
return (className + id + text).toLowerCase().includes('题目') ||
(className + id).toLowerCase().includes('question') ||
(className + id).toLowerCase().includes('subject') ||
/^\d+[\.。]/.test(text.trim());
});
return possibleQuestions.length > 0;
}
function showNoTaskToast() {
const toast = document.createElement('div');
toast.id = 'no-task-toast';
toast.textContent = '该页面无任务';
document.body.appendChild(toast);
setTimeout(() => {
if (toast && toast.parentNode) {
toast.parentNode.removeChild(toast);
}
}, 3000);
}
let advanceInProgress = false;
function isQuestionAnswered(q) {
try {
const choiceInputs = q.querySelectorAll('input[type="radio"], input[type="checkbox"]');
if (choiceInputs.length > 0) {
return Array.from(choiceInputs).some(i => i.checked);
}
const textInputs = q.querySelectorAll('input[type="text"], textarea');
if (textInputs.length > 0) {
if (Array.from(textInputs).some(t => (t.value || '').trim().length > 0)) return true;
}
const editableDivs = q.querySelectorAll('[contenteditable="true"]');
if (editableDivs.length > 0) {
if (Array.from(editableDivs).some(d => (d.innerText || d.textContent || '').trim().length > 0)) return true;
}
const ueTextareas = q.querySelectorAll('[id^="answerEditor"]');
for (const ta of ueTextareas) {
const id = ta.id;
try {
if (typeof UE !== 'undefined' && UE.getEditor) {
const ed = UE.getEditor(id);
if (ed && ed.getContentTxt && ed.getContentTxt().trim().length > 0) return true;
}
} catch {}
if ((ta.value || '').trim().length > 0) return true;
}
const ifr = q.querySelector('iframe[id^="ueditor_"]');
if (ifr) {
try {
const doc = ifr.contentDocument || ifr.contentWindow.document;
const txt = (doc && doc.body && (doc.body.innerText || doc.body.textContent)) || '';
if (txt.trim().length > 0) return true;
} catch {}
}
} catch {}
return false;
}
function isSectionDone(contextDoc) {
const doc = contextDoc || document;
try {
const videos = doc.querySelectorAll('video, .video-js video');
for (const v of videos) {
try {
const d = v.duration || 0;
const t = v.currentTime || 0;
if (!(v.ended || (d > 0 && t / d >= 0.985))) {
return false;
}
} catch { return false; }
}
const questions = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item');
for (const q of questions) {
if (!isQuestionAnswered(q)) {
return false;
}
}
return true;
} catch { return false; }
}
async function ensureSectionCompletedAndAdvance(contextDoc) {
if (!isStudyingChapters) { addLog('刷章节已暂停,跳过跳转检测', 'info'); return; }
if (advanceInProgress) { addLog('跳转检测进行中,忽略重复触发', 'debug'); return; }
advanceInProgress = true;
try {
const doc = contextDoc || document;
await autoAnswerInDocument(doc);
await tryEnterQuizAndAnswer(doc);
let tries = 3;
while (tries-- > 0) {
if (!isStudyingChapters) { addLog('刷章节已暂停,终止跳转检测', 'info'); return; }
if (isSectionDone(doc)) {
addLog('检测到当前小节已完成,准备跳转下一小节', 'success');
gotoNextSection(doc);
return;
}
await new Promise(r => setTimeout(r, 500));
}
addLog('当前小节未完成,暂不跳转', 'info');
} catch (e) {
addLog(`跳转前完成度检测出错: ${e.message}`, 'error');
} finally {
advanceInProgress = false;
}
}
async function autoAnswer() {
if (isAnswering) {
addLog('自动答题已经在运行中...', 'info');
return;
}
isAnswering = true;
updateStatus(true);
addLog('开始查找题目...', 'debug');
try {
addLog('当前页面URL: ' + window.location.href, 'debug');
addLog('当前页面标题: ' + document.title, 'debug');
const possibleSelectors = [
'.question',
'.questionLi',
'.subject_item',
'.examPaper_subject',
'.questionContainer',
'.q-item',
'.subject_node',
'[class*="question"]',
'[class*="subject"]',
'.ti-item',
'.exam-item'
];
let questions = [];
let foundSelector = '';
for (let selector of possibleSelectors) {
questions = document.querySelectorAll(selector);
if (questions.length > 0) {
foundSelector = selector;
addLog(`使用选择器 ${selector} 找到 ${questions.length} 个题目`, 'debug');
break;
}
}
if (questions.length === 0) {
addLog('使用常规选择器未找到题目,尝试查找可能的题目容器...', 'debug');
const allElements = document.querySelectorAll('*');
const possibleQuestions = Array.from(allElements).filter(el => {
const className = el.className || '';
const id = el.id || '';
const text = el.textContent || '';
return (className + id + text).toLowerCase().includes('题目') ||
(className + id).toLowerCase().includes('question') ||
(className + id).toLowerCase().includes('subject') ||
/^\d+[\.。]/.test(text.trim()); // 匹配数字开头的内容
});
if (possibleQuestions.length > 0) {
questions = possibleQuestions;
addLog(`通过内容分析找到 ${questions.length} 个可能的题目`, 'debug');
}
}
if (questions.length === 0) {
addLog('未找到任何题目,请确保页面已完全加载', 'error');
addLog('页面主要内容:' + document.body.innerHTML.substring(0, 500) + '...', 'debug');
return;
}
addLog(`共找到 ${questions.length} 个题目`, 'info');
addLog('正在初始化中...', 'info');
Array.from(questions).forEach((q, idx) => {
addLog(`题目 ${idx + 1} 类名: ${q.className}, ID: ${q.id}`, 'debug');
});
for (let question of questions) {
if (!isAnswering) {
addLog('自动答题已暂停', 'info');
break;
}
const questionInfo = getQuestionInfo(question);
if (!questionInfo) {
addLog('题目信息获取失败,跳过当前题目', 'error');
continue;
}
addLog(`正在处理题目: ${questionInfo.question.substring(0, 30)}...`);
addLog(`题目类型: ${questionInfo.type}`, 'debug');
addLog(`选项数量: ${questionInfo.options.length}`, 'debug');
const answer = await getAnswer(questionInfo);
if (answer) {
addLog(`获取到答案: ${answer}`);
fillAnswer(answer, question, questionInfo.type);
}
if (isAnswering) {
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
} catch (error) {
addLog(`自动答题过程出错: ${error.message}`, 'error');
} finally {
isAnswering = false;
updateStatus(false);
addLog('答题过程结束', 'success');
}
}
function init() {
let persistedStudy = false;
try { persistedStudy = localStorage.getItem(STUDY_PERSIST_KEY) === '1'; } catch {}
const pageTitle = document.title || '';
const currentUrl = location.href || '';
if (pageTitle.includes('课程') || pageTitle === '课程' || pageTitle.includes('课表') || pageTitle === '课表' ||
pageTitle.includes('AI工作台') || pageTitle === 'AI工作台' || pageTitle.includes('知识点') || pageTitle === '知识点' ||
pageTitle.includes('章节') || pageTitle === '章节' || pageTitle.includes('资料') || pageTitle === '资料' ||
pageTitle.includes('错题集') || pageTitle === '错题集' || pageTitle.includes('学习记录') || pageTitle === '学习记录') {
let pageType = '';
if (pageTitle.includes('课表')) pageType = '课表';
else if (pageTitle.includes('课程')) pageType = '课程';
else if (pageTitle.includes('AI工作台')) pageType = 'AI工作台';
else if (pageTitle.includes('知识点')) pageType = '知识点';
else if (pageTitle.includes('章节')) pageType = '章节';
else if (pageTitle.includes('资料')) pageType = '资料';
else if (pageTitle.includes('错题集')) pageType = '错题集';
else if (pageTitle.includes('学习记录')) pageType = '学习记录';
addLog(`检测到${pageType}页面,不展现脚本面板`, 'info');
return;
}
const isCourseDetailPage = () => {
if (currentUrl.includes('/mooc2-ans/mycourse/stu') ||
currentUrl.includes('/mycourse/studentcourse') ||
currentUrl.includes('course/') && !currentUrl.includes('knowledge')) {
const hasNavigationMenu = document.querySelector('.nav-content ul, .stuNavigationList ul');
const hasModuleLinks = document.querySelectorAll('a[title="章节"], a[title="作业"], a[title="考试"], a[title="资料"]').length >= 3;
const hasCourseInfo = document.querySelector('.classDl, .sideCon, .nav_side');
const hasCourseId = document.querySelector('#courseid, input[name="courseid"]');
if ((hasNavigationMenu || hasModuleLinks) && hasCourseInfo && hasCourseId) {
return true;
}
}
return false;
};
if (isCourseDetailPage()) {
addLog('检测到课程详情页面,不展现脚本面板', 'info');
return;
}
const isChapterListPage = () => {
const hasChapterList = document.querySelector('.fanyaChapter, .chapter_body, .xs_table');
const hasChapterItems = document.querySelectorAll('.chapter_unit, .chapter_item').length > 0;
const hasChapterStructure = document.querySelector('.chapter_th, .chapter_td');
const hasProgressInfo = document.querySelector('.catalog_points_yi, .chapter_head');
const hasSearchBox = document.querySelector('#searchChapterListByName, .dataSearch');
const hasTypicalStructure = hasChapterList && hasChapterStructure && hasProgressInfo;
const hasChapterTitles = document.querySelectorAll('.catalog_name, .newCatalog_name').length > 2;
const urlIndicatesChapterList = currentUrl.includes('/mycourse/studentcourse') ||
currentUrl.includes('/studentstudy') && !currentUrl.includes('chapterId=');
const hasNoLearningContent = !document.querySelector('video, .video-js, iframe[src*="chaoxing"], .questionLi, .TiMu');
return hasTypicalStructure && hasChapterItems && hasChapterTitles && urlIndicatesChapterList && hasNoLearningContent;
};
if (isChapterListPage()) {
addLog('检测到章节列表页面,不展现脚本面板', 'info');
return;
}
if (!persistedStudy && !hasQuestions() && !hasStudyContentDeep() && !isStudyPage()) {
showNoTaskToast();
return;
}
if (!claimOwnership()) {
if (persistedStudy && !recoveryTimerId) {
recoveryTimerId = setInterval(() => {
if (claimOwnership()) {
clearInterval(recoveryTimerId); recoveryTimerId = null;
createdPanelEl = createPanel();
bindPanelEvents();
startHeartbeat();
if (!isStudyingChapters) startStudyChapters();
}
}, 1000);
}
return;
}
createdPanelEl = createPanel();
bindPanelEvents();
startHeartbeat();
if (persistedStudy) {
startStudyChapters();
setTimeout(() => tryAutoSkipEmptySection(), 600);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
function isQuizPageDoc(doc) {
try {
if (doc.getElementById('form1') && doc.querySelector('#RightCon .newTestTitle')) return true;
if (doc.querySelector('.newTestCon form#form1') && doc.querySelector('.ans-cc')) return true;
} catch {}
return false;
}
function collectQuizQuestions(doc) {
const questions = [];
try {
const typeInputs = doc.querySelectorAll('input[id^="answertype"]');
typeInputs.forEach((inp) => {
try {
const id = inp.id.replace('answertype', '');
const qid = id.trim();
const block = doc.querySelector(`.singleQuesId[data="${qid}"]`) || inp.closest('.TiMu') || doc;
const typeVal = (inp.value || '').trim();
let type = '';
if (typeVal === '0') type = 'single';
else if (typeVal === '1') type = 'multiple';
else if (typeVal === '3') type = 'judge';
else if (typeVal === '2') type = 'blank';
else if (typeVal === '4') type = 'short';
else {
const hasTextInput = block.querySelector('input[type="text"], textarea, [contenteditable="true"], [id^="answerEditor"], iframe[id^="ueditor_"]');
type = hasTextInput ? 'short' : 'text';
}
const opts = [];
const lis = block.querySelectorAll(`ul.Zy_ulTop li[onclick][qid="${qid}"]`);
lis.forEach((li, idx) => {
const span = li.querySelector('.num_option, .num_option_dx');
const letter = span?.getAttribute('data') || String.fromCharCode(65 + idx);
const txt = (li.querySelector('a.after')?.textContent || '').trim();
opts.push(`${letter}. ${txt}`);
});
let qtext = '';
const label = block.querySelector('.Zy_TItle .fontLabel');
if (label) qtext = label.textContent.replace(/\s+/g, ' ').trim();
questions.push({ qid, type, question: qtext, options: opts });
} catch {}
});
} catch {}
return questions;
}
function fillQuizAnswer(doc, qid, type, answer) {
try {
const block = doc.querySelector(`.singleQuesId[data="${qid}"]`) || doc;
if (!block) return false;
if (type === 'single' || type === 'multiple' || type === 'judge') {
let letters = [];
if (type === 'multiple') {
letters = (answer || '').toUpperCase().split(/[,,、\s]+/).filter(Boolean);
} else if (type === 'judge') {
const val = String(answer || '').trim().toLowerCase();
if (/^a$|对|true|正确/.test(val)) letters = ['A'];
else if (/^b$|错|false|错误/.test(val)) letters = ['B'];
else if (/^t$/.test(val)) letters = ['A'];
else if (/^f$/.test(val)) letters = ['B'];
else letters = [(val.match(/[ab]/i) || ['A'])[0].toUpperCase()];
} else {
const m = String(answer || '').toUpperCase().match(/[A-Z]/g);
letters = m ? m : [];
}
const ul = block.querySelector('ul.Zy_ulTop');
if (!ul) return false;
letters.forEach((L) => {
let target = null;
if (type === 'judge') {
const dataVal = (L === 'A') ? 'true' : 'false';
target = ul.querySelector(`li .num_option[data='${dataVal}'], li .num_option_dx[data='${dataVal}']`)
|| ul.querySelector(`li .num_option[data='${L}'], li .num_option_dx[data='${L}']`);
} else {
target = ul.querySelector(`li .num_option[data='${L}'], li .num_option_dx[data='${L}']`);
}
if (target) {
const li = target.closest('li');
safeClick(li);
}
});
const hidden = doc.getElementById(`answer${qid}`);
if (hidden) {
const want = (type === 'judge')
? (letters[0] === 'A' ? 'true' : 'false')
: letters.join('');
if (!hidden.value || (type !== 'multiple' && hidden.value.toLowerCase() !== want)) {
hidden.value = want;
const spans = ul.querySelectorAll(`.choice${qid}`);
spans.forEach(s => s.classList.remove('check_answer', 'check_answer_dx'));
letters.forEach((L) => {
let sel = null;
if (type === 'judge') {
const dv = (L === 'A') ? 'true' : 'false';
sel = ul.querySelector(`.choice${qid}[data='${dv}']`) || ul.querySelector(`.choice${qid}[data='${L}']`);
} else {
sel = ul.querySelector(`.choice${qid}[data='${L}']`);
}
if (sel) {
const isMulti = !!ul.querySelector('.num_option_dx');
sel.classList.add(isMulti ? 'check_answer_dx' : 'check_answer');
const li = sel.closest('li');
if (li) {
li.setAttribute('aria-checked', 'true');
li.setAttribute('aria-pressed', 'true');
}
}
});
}
}
return true;
}
else if (type === 'blank') {
const answers = String(answer || '').split(/[,,;;、]\s*/).map(s => s.trim()).filter(Boolean);
const ueAreas = block.querySelectorAll('[id^="answerEditor"]');
ueAreas.forEach((ta, i) => {
const val = answers[i] || '';
if (!val) return;
try {
if (typeof UE !== 'undefined' && UE.getEditor) {
const ed = UE.getEditor(ta.id);
if (ed) {
ed.ready(() => {
ed.setContent(val);
if (typeof ed.fireEvent === 'function') ed.fireEvent('contentChange');
});
}
} else {
ta.value = val;
ta.dispatchEvent(new Event('input', { bubbles: true }));
ta.dispatchEvent(new Event('change', { bubbles: true }));
}
} catch {}
});
const ifrs = block.querySelectorAll('iframe[id^="ueditor_"]');
ifrs.forEach((ifr, i) => {
const val = answers[i] || '';
if (!val) return;
try {
const d = ifr.contentDocument || ifr.contentWindow?.document;
const body = d && d.body;
if (body) {
body.innerHTML = val;
body.dispatchEvent(new Event('input', { bubbles: true }));
}
} catch {}
});
const inputs = [
...block.querySelectorAll('input[type="text"]'),
...block.querySelectorAll('textarea'),
...block.querySelectorAll('[contenteditable="true"]')
];
inputs.forEach((el, i) => {
const val = answers[i] || '';
if (!val) return;
try {
const tag = (el.tagName || '').toLowerCase();
if (tag === 'input' || tag === 'textarea') {
el.value = val;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
} else if (el.getAttribute('contenteditable') === 'true') {
el.innerHTML = val;
el.dispatchEvent(new Event('input', { bubbles: true }));
}
} catch {}
});
const hidden = doc.getElementById(`answer${qid}`);
if (hidden) hidden.value = answers.join(' ');
return true;
}
else if (type === 'text' || type === 'short' || type === 'essay' || type === 'writing') {
const val = String(answer || '').trim();
if (!val) return false;
const ueAreas = block.querySelectorAll('[id^="answerEditor"]');
ueAreas.forEach((ta) => {
try {
if (typeof UE !== 'undefined' && UE.getEditor) {
const ed = UE.getEditor(ta.id);
if (ed) {
ed.ready(() => {
ed.setContent(val);
if (typeof ed.fireEvent === 'function') ed.fireEvent('contentChange');
});
}
} else {
ta.value = val;
ta.dispatchEvent(new Event('input', { bubbles: true }));
ta.dispatchEvent(new Event('change', { bubbles: true }));
}
} catch {}
});
const ifrs = block.querySelectorAll('iframe[id^="ueditor_"]');
ifrs.forEach((ifr) => {
try {
const d = ifr.contentDocument || ifr.contentWindow?.document;
const body = d && d.body;
if (body) {
body.innerHTML = val;
body.dispatchEvent(new Event('input', { bubbles: true }));
}
} catch {}
});
const inputs = [
...block.querySelectorAll('textarea'),
...block.querySelectorAll('input[type="text"]'),
...block.querySelectorAll('[contenteditable="true"]')
];
inputs.forEach((el) => {
try {
const tag = (el.tagName || '').toLowerCase();
if (tag === 'input' || tag === 'textarea') {
el.value = val;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
} else if (el.getAttribute('contenteditable') === 'true') {
el.innerHTML = val;
el.dispatchEvent(new Event('input', { bubbles: true }));
}
} catch {}
});
const hidden = doc.getElementById(`answer${qid}`);
if (hidden) hidden.value = val;
return true;
}
return false;
} catch { return false; }
}
function findAndClickQuizSubmitButton(doc) {
try {
const targetWindow = doc.defaultView || window;
const chaoxingSubmitMethods = [
() => {
if (typeof targetWindow.btnBlueSubmit === 'function') {
targetWindow.btnBlueSubmit();
addLog('使用 btnBlueSubmit() 方法提交', 'success');
return true;
}
return false;
},
() => {
if (typeof targetWindow.submitCheckTimes === 'function') {
targetWindow.submitCheckTimes();
addLog('使用 submitCheckTimes() 方法提交', 'success');
return true;
}
return false;
},
() => {
if (typeof targetWindow.submitWork === 'function') {
targetWindow.submitWork();
addLog('使用 submitWork() 方法提交', 'success');
return true;
}
return false;
},
() => {
const forms = doc.querySelectorAll('form');
for (const form of forms) {
const formAction = form.action || '';
if (formAction.includes('work') || formAction.includes('quiz') || formAction.includes('submit')) {
try {
form.submit();
addLog('使用表单 submit() 方法提交', 'success');
return true;
} catch (e) {
addLog(`表单提交失败: ${e.message}`, 'error');
}
}
}
return false;
}
];
for (const method of chaoxingSubmitMethods) {
try {
if (method()) return true;
} catch (e) {
addLog(`提交方法执行失败: ${e.message}`, 'error');
}
}
const submitSelectors = [
'input[type="submit"][value*="提交"]',
'button[type="submit"]',
'input[value="提交答案"]',
'input[value="提交"]',
'button[onclick*="submit"]',
'button[onclick*="btnBlueSubmit"]',
'button[onclick*="submitCheckTimes"]',
'.submit-btn',
'.btn-submit',
'#submit',
'.submit',
'input[id*="submit"]',
'button[id*="submit"]',
'a[onclick*="submit"]',
'input[onclick*="tijiao"]',
'button[onclick*="tijiao"]'
];
for (const selector of submitSelectors) {
const submitBtn = doc.querySelector(selector);
if (submitBtn && !submitBtn.disabled && !submitBtn.classList.contains('disabled')) {
try {
submitBtn.scrollIntoView({ block: 'center', behavior: 'smooth' });
const onclick = submitBtn.getAttribute('onclick');
if (onclick) {
try {
const func = new targetWindow.Function(onclick);
func.call(submitBtn);
addLog(`通过onclick执行提交: ${onclick}`, 'success');
return true;
} catch (e) {
addLog(`onclick执行失败: ${e.message}`, 'error');
}
}
if (safeClick(submitBtn)) {
addLog(`成功点击提交按钮: ${selector}`, 'success');
return true;
}
} catch (e) {
addLog(`点击提交按钮失败: ${e.message}`, 'error');
}
}
}
const clickableElements = Array.from(doc.querySelectorAll('input, button, a, span, div'));
for (const el of clickableElements) {
const text = (el.textContent || el.value || '').trim();
if (/^(提交|提交答案|完成|确认提交)$/.test(text)) {
try {
el.scrollIntoView({ block: 'center', behavior: 'smooth' });
const onclick = el.getAttribute('onclick');
if (onclick) {
try {
const func = new targetWindow.Function(onclick);
func.call(el);
addLog(`通过文本匹配和onclick执行提交: ${text}`, 'success');
return true;
} catch (e) {
addLog(`文本匹配onclick执行失败: ${e.message}`, 'error');
}
}
if (safeClick(el)) {
addLog(`通过文本匹配点击提交按钮: ${text}`, 'success');
return true;
}
} catch (e) {
addLog(`通过文本匹配点击提交按钮失败: ${e.message}`, 'error');
}
}
}
addLog('未找到章节测验提交按钮', 'error');
return false;
} catch (e) {
addLog(`查找提交按钮时出错: ${e.message}`, 'error');
return false;
}
}
function validateAndFixSubmitParams(doc) {
try {
const targetWindow = doc.defaultView || window;
if (typeof targetWindow.workRelationId === 'undefined') {
const workIdInputs = doc.querySelectorAll('input[name*="workRelationId"], input[id*="workRelationId"]');
if (workIdInputs.length > 0) {
targetWindow.workRelationId = workIdInputs[0].value;
addLog(`设置workRelationId: ${targetWindow.workRelationId}`, 'debug');
}
}
if (typeof targetWindow.courseId === 'undefined') {
const courseIdInputs = doc.querySelectorAll('input[name*="courseId"], input[id*="courseId"]');
if (courseIdInputs.length > 0) {
targetWindow.courseId = courseIdInputs[0].value;
addLog(`设置courseId: ${targetWindow.courseId}`, 'debug');
}
}
if (typeof targetWindow.classId === 'undefined') {
const classIdInputs = doc.querySelectorAll('input[name*="classId"], input[id*="classId"]');
if (classIdInputs.length > 0) {
targetWindow.classId = classIdInputs[0].value;
addLog(`设置classId: ${targetWindow.classId}`, 'debug');
}
}
const questions = doc.querySelectorAll('[class*="TiMu"], [class*="timu"]');
questions.forEach((q, index) => {
const qid = q.getAttribute('id') || `question_${index}`;
let answerInput = doc.querySelector(`input[name="answer${qid}"], input[id="answer${qid}"]`);
if (!answerInput) {
answerInput = doc.createElement('input');
answerInput.type = 'hidden';
answerInput.name = `answer${qid}`;
answerInput.id = `answer${qid}`;
q.appendChild(answerInput);
addLog(`为题目${qid}创建答案input`, 'debug');
}
});
addLog('提交参数验证完成', 'debug');
return true;
} catch (e) {
addLog(`提交参数验证失败: ${e.message}`, 'error');
return false;
}
}
async function handleSubmitConfirmDialog(doc, timeoutMs = 3000) {
const startTime = Date.now();
while (Date.now() - startTime < timeoutMs) {
try {
const confirmDialogSelectors = [
'.popDiv', '.modal', '.dialog', '.alert',
'.layui-layer', '.confirm-dialog', '.submit-confirm',
'[class*="confirm"]', '[class*="dialog"]', '[class*="modal"]'
];
for (const selector of confirmDialogSelectors) {
const dialog = doc.querySelector(selector);
if (dialog && dialog.style.display !== 'none' &&
(dialog.textContent.includes('确认提交') ||
dialog.textContent.includes('提交') ||
dialog.textContent.includes('确定'))) {
addLog('检测到提交确认弹窗', 'info');
const confirmButtonSelectors = [
'button[onclick*="submit"]', 'button[value*="提交"]',
'button[value*="确定"]', 'button[value*="确认"]',
'input[type="button"][value*="提交"]',
'input[type="button"][value*="确定"]',
'input[type="button"][value*="确认"]',
'.confirm-btn', '.submit-btn', '.ok-btn',
'button:contains("提交")', 'button:contains("确定")',
'button:contains("确认")', 'a[onclick*="submit"]'
];
for (const btnSelector of confirmButtonSelectors) {
const confirmBtn = dialog.querySelector(btnSelector) ||
doc.querySelector(`${selector} ${btnSelector}`);
if (confirmBtn && !confirmBtn.disabled) {
try {
const onclick = confirmBtn.getAttribute('onclick');
if (onclick) {
const targetWindow = doc.defaultView || window;
const func = new targetWindow.Function(onclick);
func.call(confirmBtn);
addLog(`通过onclick执行确认提交: ${onclick}`, 'success');
return true;
}
if (safeClick(confirmBtn)) {
addLog(`点击确认提交按钮: ${btnSelector}`, 'success');
return true;
}
} catch (e) {
addLog(`点击确认按钮失败: ${e.message}`, 'error');
}
}
}
const allButtons = dialog.querySelectorAll('button, input[type="button"], a');
for (const btn of allButtons) {
const text = (btn.textContent || btn.value || '').trim();
if (/^(提交|确定|确认|OK)$/.test(text)) {
try {
if (safeClick(btn)) {
addLog(`通过文本匹配点击确认按钮: ${text}`, 'success');
return true;
}
} catch (e) {
addLog(`文本匹配点击确认按钮失败: ${e.message}`, 'error');
}
}
}
}
}
} catch (e) {
}
await new Promise(r => setTimeout(r, 200));
}
return false;
}
async function waitForQuizSubmitCompletion(doc, timeoutMs = 5000) {
const startTime = Date.now();
const originalUrl = doc.location.href;
while (Date.now() - startTime < timeoutMs) {
try {
const successIndicators = [
'.success', '.alert-success', '.msg-success',
'[class*="success"]', '[class*="complete"]',
'*[text()*="提交成功"]', '*[text()*="完成"]'
];
for (const selector of successIndicators) {
const indicator = doc.querySelector(selector);
if (indicator && indicator.textContent.includes('成功')) {
addLog('检测到提交成功提示', 'success');
return true;
}
}
if (doc.location.href !== originalUrl) {
addLog('检测到页面跳转,提交可能已完成', 'info');
return true;
}
const nextStepSelectors = [
'button[onclick*="next"]', 'a[onclick*="next"]',
'input[value*="下一"]', 'button[value*="下一"]',
'.next-btn', '.btn-next', '#next'
];
for (const selector of nextStepSelectors) {
if (doc.querySelector(selector)) {
addLog('检测到下一步按钮,提交可能已完成', 'info');
return true;
}
}
} catch (e) {
}
await new Promise(r => setTimeout(r, 200));
}
addLog('等待提交完成超时', 'error');
return false;
}
async function autoAnswerQuizInDocument(doc) {
try {
if (!isStudyingChapters) return false;
if (!isQuizPageDoc(doc)) return false;
await injectConsoleDecryptCode(doc);
const qs = collectQuizQuestions(doc);
if (!qs || qs.length === 0) return false;
addLog(`检测到章节测验,共 ${qs.length} 题,开始作答...`, 'info');
for (const q of qs) {
if (!isStudyingChapters) { addLog('已暂停刷章节,停止测验作答', 'info'); return false; }
const promptInfo = { type: q.type, question: q.question || `题目 ${q.qid}`, options: q.options || [] };
const ans = await getAnswer(promptInfo);
if (ans) {
fillQuizAnswer(doc, q.qid, q.type, ans);
}
await new Promise(r => setTimeout(r, 500));
}
addLog('章节测验答题完成,准备提交...', 'success');
await new Promise(r => setTimeout(r, 1000));
addLog('验证提交参数...', 'info');
validateAndFixSubmitParams(doc);
let submitSuccess = false;
const targetWindow = doc.defaultView || window;
try {
const originalAlert = targetWindow.alert;
targetWindow.alert = function(msg) {
addLog(`阻止弹窗: ${msg}`, 'debug');
if (msg && msg.includes('code-1')) {
addLog('检测到code-1错误,尝试其他提交方式', 'info');
return;
}
return originalAlert.call(this, msg);
};
if (typeof targetWindow.btnBlueSubmit === 'function') {
addLog('使用学习通标准提交流程', 'info');
targetWindow.btnBlueSubmit();
await new Promise(r => setTimeout(r, 1000));
if (typeof targetWindow.submitCheckTimes === 'function') {
targetWindow.submitCheckTimes();
addLog('执行submitCheckTimes完成', 'success');
}
if (typeof targetWindow.noSubmit === 'function') {
addLog('检测到noSubmit函数,跳过自动提交以避免错误', 'info');
}
submitSuccess = true;
addLog('学习通标准提交流程执行完成', 'success');
} else if (typeof targetWindow.submitWork === 'function') {
addLog('使用submitWork提交', 'info');
targetWindow.submitWork();
submitSuccess = true;
} else {
submitSuccess = findAndClickQuizSubmitButton(doc);
}
// 恢复原始alert targetWindow.alert = originalAlert;
} catch (e) {
addLog(`提交流程执行失败: ${e.message}`, 'error');
submitSuccess = findAndClickQuizSubmitButton(doc);
}
if (submitSuccess) {
addLog('已执行提交操作,等待确认弹窗...', 'info');
await new Promise(r => setTimeout(r, 500));
const confirmHandled = await handleSubmitConfirmDialog(doc, 3000);
if (confirmHandled) {
addLog('已处理提交确认弹窗', 'success');
} else {
addLog('未检测到确认弹窗或处理失败', 'info');
}
const submitCompleted = await waitForQuizSubmitCompletion(doc, 8000);
if (submitCompleted) {
addLog('章节测验提交完成,准备跳转下一节...', 'success');
await new Promise(r => setTimeout(r, 2000));
if (isStudyingChapters) {
const jumpSuccess = gotoNextSection(doc);
if (jumpSuccess) {
addLog('已自动跳转到下一节', 'success');
} else {
addLog('自动跳转失败,请手动切换到下一节', 'error');
}
}
} else {
addLog('等待提交完成超时,但将继续尝试跳转', 'info');
await new Promise(r => setTimeout(r, 1500));
if (isStudyingChapters) gotoNextSection(doc);
}
} else {
addLog('未找到提交按钮,跳过提交直接尝试跳转', 'info');
await new Promise(r => setTimeout(r, 1000));
if (isStudyingChapters) gotoNextSection(doc);
}
return true;
} catch (e) {
addLog(`章节测验自动作答失败: ${e.message}`, 'error');
return false;
}
}
})();