您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
岐黄天使刷课助手的调试与模块加载器,用于开发和测试阶段管理模块依赖。
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/537076/1594813/%E5%B2%90%E9%BB%84%E5%A4%A9%E4%BD%BF%E5%88%B7%E8%AF%BE%E5%8A%A9%E6%89%8B%20-%20%E8%B0%83%E8%AF%95%E5%8A%A0%E8%BD%BD%E5%99%A8%E6%A8%A1%E5%9D%97.js
// ==UserScript== // @name 岐黄天使刷课助手 - 调试加载器模块 // @namespace http://tampermonkey.net/qhtx-modules // @version 1.3.0 // @description 岐黄天使刷课助手的调试与模块加载器,用于开发和测试阶段管理模块依赖。 // @author AI助手 // ==/UserScript== // 调试加载器模块 (function() { 'use strict'; // 添加模块加载状态跟踪 window.moduleStatus = { loaded: new Set(), pending: new Set([ 'styles', 'utils', 'ui', 'videoPlayer', 'videoNavigation', 'courseNavigation', 'questionBank', 'autoAnswer', 'remoteSync' ]), startTime: Date.now(), // 显示模块加载状态 showStatus: function() { const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2); console.log(` ========== 模块加载状态 (${elapsed}秒) ========== 已加载: ${Array.from(this.loaded).join(', ') || '无'} 待加载: ${Array.from(this.pending).join(', ') || '无'} ============================================ `); } }; // 定期显示模块加载状态 window.moduleStatusInterval = setInterval(() => { if (window.moduleStatus.pending.size === 0) { clearInterval(window.moduleStatusInterval); window.moduleStatus.showStatus(); console.log('%c所有模块加载完成!', 'color: green; font-size: 14px; font-weight: bold'); } else { window.moduleStatus.showStatus(); } }, 2000); // 检查模块加载状态 function checkModuleLoaded(moduleName) { const now = new Date(); const timeStr = now.toLocaleTimeString() + '.' + now.getMilliseconds(); console.log(`[模块加载] 正在验证 ${moduleName} 状态,当前时间: ${timeStr}`); // 详细检查window对象上的模块属性 console.log(`[模块加载详情] ${moduleName} 检查:`, { '直接访问': window[moduleName], '类型': typeof window[moduleName], '是否存在': moduleName in window, 'window属性': Object.keys(window).filter(k => k.includes(moduleName)), '全局变量': Object.keys(window).filter(k => k.startsWith('qh') || k.includes('module') || k.includes('Module')) }); // 检查模块是否已加载 if (typeof window[moduleName] === 'function') { window.moduleStatus.loaded.add(moduleName); window.moduleStatus.pending.delete(moduleName); console.log(`[模块加载] %c${moduleName} 已就绪%c`, 'color: green; font-weight: bold', 'color: black'); // 输出已加载的模块列表 console.log(`[模块加载] 已加载模块: ${Array.from(window.moduleStatus.loaded).join(', ')}`); console.log(`[模块加载] 待加载模块: ${Array.from(window.moduleStatus.pending).join(', ')}`); return true; } // 如果模块未加载,尝试检查是否有其他命名方式 const possibleNames = [ moduleName, moduleName.charAt(0).toUpperCase() + moduleName.slice(1), // 首字母大写 moduleName + 'Module', 'qh' + moduleName.charAt(0).toUpperCase() + moduleName.slice(1), // qh前缀 'create' + moduleName.charAt(0).toUpperCase() + moduleName.slice(1), // create前缀 'init' + moduleName.charAt(0).toUpperCase() + moduleName.slice(1), // init前缀 'apply' + moduleName.charAt(0).toUpperCase() + moduleName.slice(1) // apply前缀 ]; console.log(`[模块加载] 尝试其他可能的命名:`, possibleNames.map(name => ({ name, exists: name in window, type: typeof window[name] }))); console.warn(`[模块加载] %c${moduleName} 未就绪%c,window[${moduleName}] = ${window[moduleName]}`, 'color: red; font-weight: bold', 'color: black'); return false; } // 使用GM_xmlhttpRequest检查模块文件 function checkModuleFile(moduleName) { return new Promise((resolve, reject) => { const url = `//192.168.1.6:9999/qhtx/${moduleName}.js?check=${Date.now()}`; console.log(`[模块检查] 使用GM_xmlhttpRequest检查模块文件: ${url}`); if (typeof GM_xmlhttpRequest !== 'function') { console.error('[模块检查] GM_xmlhttpRequest不可用'); reject('GM_xmlhttpRequest不可用'); return; } GM_xmlhttpRequest({ method: 'GET', url: url, onload: function(response) { console.log(`[模块检查] ${moduleName}.js 检查结果:`, { status: response.status, statusText: response.statusText, responseSize: response.responseText ? response.responseText.length : 0, responsePreview: response.responseText ? response.responseText.substring(0, 100) + '...' : '无内容' }); if (response.status >= 200 && response.status < 300) { resolve({ module: moduleName, content: response.responseText, status: response.status }); } else { reject(`HTTP错误: ${response.status} ${response.statusText}`); } }, onerror: function(error) { console.error(`[模块检查] ${moduleName}.js 请求失败:`, error); reject(`请求失败: ${error.error || '未知错误'}`); }, ontimeout: function() { console.error(`[模块检查] ${moduleName}.js 请求超时`); reject('请求超时'); } }); }); } // 使用GM_xmlhttpRequest直接加载模块 function loadModuleWithGM(moduleName) { return new Promise((resolve, reject) => { const url = `//192.168.1.6:9999/qhtx/${moduleName}.js?direct=true&t=${Date.now()}`; console.log(`[模块加载] 使用GM_xmlhttpRequest直接加载模块: ${url}`); if (typeof GM_xmlhttpRequest !== 'function') { console.error('[模块加载] GM_xmlhttpRequest不可用,无法直接加载模块'); reject('GM_xmlhttpRequest不可用'); return; } GM_xmlhttpRequest({ method: 'GET', url: url, onload: function(response) { if (response.status >= 200 && response.status < 300) { console.log(`[模块加载] 成功获取模块 ${moduleName}.js 内容,长度: ${response.responseText.length}字节`); try { // 创建一个新的script元素 const script = document.createElement('script'); script.textContent = response.responseText; document.head.appendChild(script); console.log(`[模块加载] 模块 ${moduleName}.js 已注入到页面`); resolve(true); } catch (error) { console.error(`[模块加载] 注入模块 ${moduleName}.js 时出错:`, error); reject(error); } } else { console.error(`[模块加载] 获取模块 ${moduleName}.js 失败: HTTP ${response.status}`); reject(`HTTP错误: ${response.status}`); } }, onerror: function(error) { console.error(`[模块加载] 请求模块 ${moduleName}.js 时出错:`, error); reject(error); } }); }); } // 检查所有模块 function checkAllModules() { console.log('[模块检查] 开始检查所有模块文件'); // 创建一个模块检查队列 const moduleCheckPromises = Array.from(window.moduleStatus.pending) .map(module => { return checkModuleFile(module) .then(result => { console.log(`[模块检查] 模块文件 ${module}.js 检查成功:`, { size: result.content.length, preview: result.content.substring(0, 50) + '...' }); return { module, status: 'success' }; }) .catch(error => { console.error(`[模块检查] 模块文件 ${module}.js 检查失败:`, error); return { module, status: 'error', error }; }); }); // 等待所有模块检查完成 return Promise.all(moduleCheckPromises) .then(results => { const successModules = results.filter(r => r.status === 'success').map(r => r.module); const failedModules = results.filter(r => r.status === 'error').map(r => r.module); console.log(`[模块检查] 模块检查完成:`, { total: results.length, success: successModules.length, failed: failedModules.length, successModules, failedModules }); return results; }); } // 加载所有模块 function loadAllModules() { console.log('[模块加载] 开始加载所有模块'); // 创建一个模块加载队列 const moduleLoadPromises = Array.from(window.moduleStatus.pending) .map(module => { return loadModuleWithGM(module) .then(() => { console.log(`[模块加载] 模块 ${module} 加载成功`); setTimeout(() => checkModuleLoaded(module), 500); return { module, status: 'success' }; }) .catch(error => { console.error(`[模块加载] 模块 ${module} 加载失败:`, error); return { module, status: 'error', error }; }); }); // 等待所有模块加载完成 return Promise.all(moduleLoadPromises) .then(results => { const successModules = results.filter(r => r.status === 'success').map(r => r.module); const failedModules = results.filter(r => r.status === 'error').map(r => r.module); console.log(`[模块加载] 模块加载完成:`, { total: results.length, success: successModules.length, failed: failedModules.length, successModules, failedModules }); return results; }); } // 直接注入模块函数到全局作用域 function injectModuleFunctions() { console.log('[调试加载器] 开始注入模块函数到全局作用域'); // 注入styles模块 if (!window.applyStyles) { window.applyStyles = function() { console.log('[模块注入] 执行注入的 applyStyles 函数'); GM_addStyle(` .qh-assistant-panel { position: fixed; top: 100px; right: 10px; width: 280px; background: linear-gradient(135deg, #00a8cc, #0062bd); border-radius: 12px; padding: 15px; color: white; z-index: 9999; font-size: 14px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); } .qh-assistant-title { font-size: 18px; font-weight: bold; text-align: center; margin-bottom: 12px; border-bottom: 2px solid rgba(255, 255, 255, 0.3); padding-bottom: 8px; } .qh-assistant-content { margin-bottom: 12px; } .qh-assistant-btn { background: linear-gradient(90deg, #4CAF50, #45a049); border: none; color: white; padding: 8px 12px; text-align: center; display: block; width: 100%; margin: 5px 0; cursor: pointer; border-radius: 4px; } `); console.log('[模块注入] applyStyles 函数执行完成'); }; console.log('[模块注入] 已注入 applyStyles 函数'); } // 注入ui模块 if (!window.createPanel) { window.createPanel = function() { console.log('[模块注入] 执行注入的 createPanel 函数'); // 检查是否已经创建过面板 if (document.querySelector('.qh-assistant-panel')) { console.log('[模块注入] 面板已存在,不重复创建'); return; } const panel = document.createElement('div'); panel.className = 'qh-assistant-panel'; panel.innerHTML = ` <div class="qh-assistant-title">岐黄天使刷课助手 v1.3.0</div> <div class="qh-assistant-content"> <div>状态: 调试模式</div> <div>当前页面: ${window.location.href}</div> </div> <button class="qh-assistant-btn" id="qh-debug-btn">调试信息</button> `; document.body.appendChild(panel); // 添加调试按钮事件 document.getElementById('qh-debug-btn').addEventListener('click', function() { console.log('[调试] 当前页面信息:', { 'URL': window.location.href, '已加载模块': Array.from(window.moduleStatus.loaded), '待加载模块': Array.from(window.moduleStatus.pending), 'window.qh': window.qh }); alert('调试信息已输出到控制台'); }); console.log('[模块注入] createPanel 函数执行完成'); }; console.log('[模块注入] 已注入 createPanel 函数'); } // 注入utils模块 if (!window.checkPageType) { window.checkPageType = function() { console.log('[模块注入] 执行注入的 checkPageType 函数'); console.log('[页面检查] 当前页面URL:', window.location.href); }; console.log('[模块注入] 已注入 checkPageType 函数'); } console.log('[调试加载器] 模块函数注入完成'); } // 导出模块函数 window.debugLoader = { checkModuleLoaded, checkModuleFile, loadModuleWithGM, checkAllModules, loadAllModules, injectModuleFunctions }; // 自动执行检查和加载 setTimeout(() => { console.log('[调试加载器] 开始自动检查和加载模块'); // 先注入基本函数 injectModuleFunctions(); // 然后检查和加载模块 checkAllModules() .then(() => loadAllModules()) .then(() => { console.log('[调试加载器] 模块检查和加载完成'); // 如果仍有未加载的模块,使用注入的函数 if (window.moduleStatus.pending.size > 0) { console.log('[调试加载器] 仍有未加载的模块,使用注入的函数'); window.moduleStatus.loaded.add('styles'); window.moduleStatus.loaded.add('ui'); window.moduleStatus.loaded.add('utils'); window.moduleStatus.pending.delete('styles'); window.moduleStatus.pending.delete('ui'); window.moduleStatus.pending.delete('utils'); } }) .catch(error => { console.error('[调试加载器] 模块检查和加载出错:', error); console.log('[调试加载器] 使用注入的函数作为备用'); injectModuleFunctions(); }); }, 1000); console.log('[调试加载器] 模块已加载'); })();