// ==UserScript==
// @name 山东省人工智能研修|希沃教育|一键运行|自动答题|稳定
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 带有授权机制的刷课助手,一小时后授权失效
// @author lzzzyyyyyyy
// @match https://study.seewoedu.cn/*
// @match https://cpb-m.cvte.com/*
// @match *://cpb-m.cvte.com/*
// @match *://study.seewoedu.cn/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_xmlhttpRequest
// @connect localhost
// @connect zhihuizhongxiaoxue2.a1.luyouxia.net
// @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
// ==/UserScript==
//请勿修改脚本,加了防破解,若触发机制,可能会导致封号
(function() {
'use strict';
// 脚本状态对象
const scriptState = {
authorized: false,
authKey: '',
licenseInfo: null,
initialized: false
};
// 初始化配置
const config = {
// 授权相关
authServerUrl: 'http://zhihuizhongxiaoxue2.a1.luyouxia.net:22897/verify', // 替换为你的授权服务器地址
authCheckInterval: 5 * 60 * 1000, // 每5分钟检查一次授权状态
// 加密相关
encryptionKey: 'eR7pK9mQ3sT6vX1z', // 用于加密本地存储的密钥
// 自动答题相关
autoSubmit: true, // 回答所有问题后自动提交
delayBetweenActions: 500, // 操作之间的延迟时间(毫秒)
delayBeforeSubmit: 1000, // 提交前的延迟时间(毫秒)
// 希沃学习相关
seewoKey: "zn196hue561909fc", // 16 字节密钥
seewoIv: "be43693939a3662f", // 16 字节 IV
seewoGroupCourseId: "5f15725bface42a9bee3be62340025bf",
seewoCourseIds: [
"d9c61e777b29495b8cad0f0e310176d4",
"b081e271c236426381e361d78f52e212",
"2bfc9a4249384796826213579efb7cd4",
"061c588f66a949288364cef932f15fc1",
"b2824333c9dd480c82da770b774d64b4",
"b9ee11b0ed21488f8abec1e066521556",
"a328e4ff9a30446cb4ee8bfbcc7b8e6e",
"7cce533a90a148fc8b812af9bb299cba",
"2447a2f87c514de68277654708a58f72",
"c5178af95dc04152953c822ae38aacb0",
"1b1df61bf7c545458bf07529f6dd9ebf",
"f653a43a583944f8b39a2a2601c66b95",
"5725152dc71e4ca6a81abf0004fcad46",
"1b5e7b0ca9f34349a113d5fbe2bc6262",
"b9d40a19d6c94c5c8f84c4856a726e10",
"b4370a501b744272ac50605fc84d33f1",
"d20930c5a713449ca3f5f500fffbb8c5",
"2dc270b60a3c4e989021bfc97613c326",
"031892fe1fac406a8c5c27f32636db94",
"42a9609eebdf4462becb6ef6e6ef9a0b",
"bfe0ad0f80664115aea64e304e2116cc",
"928e9e56b7d9486c9083c70668d95871",
"86f2674dd385499cbbb165aeefe85d27",
"7df456b7fc074d319861f00e2340d2dd",
"5c5c327319e3479694e106841cf974bc",
"92e0d78a4356484ebb2352ae37ef1523",
"1375b2bce8644c6995716aca59144f3f",
"68c7753f9b8649d1ac1a60729eaef74e",
]
};
// 题库 - 格式:{问题文本: {type: "单选/多选", answers: ["正确答案"]}}
let answerDatabase = {
"关于对AI的思考与反思,讲师提出了哪三条建议?": {
type: "多选",
answers: ["人类和人工智能是互补的,而非互相替代的关系。", "识别AI胡说八道是人类的必修课。", "避免“惰性”,没有思维力,不要轻易引导学生使用GAI。"]
},
"对教育工作者而言,人工智能(AI)可以分为哪几大类别?": {
type: "多选",
answers: ["文本生成", "图像生成", "音频生成","视频生成","课件生成"]
},
"关于人工智能工具的选择,以下策略错误的是?": {
type: "单选",
answers: ["越多越好"]
},
"下列与人工智能相关的短语中,匹配正确的有哪些?": {
type: "多选",
answers: ["AI——人工智能", "AIGC——人工智能生成内容", "LLM——大语言模型","Deep Learning——深度学习"]
},
"正确使用AI的原则是?": {
type: "多选",
answers: ["思维力原则", "创新性原则", "高效性原则","AI融合原则","安全性原则"]
},
//********************************************************************************//
"诸如秘塔AI等应用将大模型与外部数据库相连,基于检索到的内容生成答案,可以减少AI幻觉现象。": {
type: "单选",
answers: ["正确"]
},
"关于使用RAG(检索增强生成技术)来进行教学设计生成,讲师介绍了以下哪几种AI工具?": {
type: "多选",
answers: ["秘塔", "360AI", "天工AI","豆包AI"]
},
"使用AI准备课程相关的素材时,可以使用以下策略?": {
type: "多选",
answers: ["紧扣“可视化”原则进行设计与生成", "用好各种适合自己学科的智能体", "AI生成的素材要紧扣教学目标而设计"]
},
"希沃AI百宝箱有自带的一些提示语模版,在生成教案时还可以选择“细化教案”。": {
type: "单选",
answers: ["正确"]
},
"在使用AI生成课件时,可以应用以下哪些技巧?": {
type: "多选",
answers: ["希沃白板AI一键备课,生成课件和对应教学设计", "通过Kimi等工具分析教材,生成课件大纲和主要内容后,再用其他AI软件生成课件初稿,最后添加个性化元素"]
},
//********************************************************************************//
"在AI助力教学重难点突破的应用中,我们可以尝试以下哪几种应用路径。": {
type: "多选",
answers: ["借助AI生成功能,将重难点抽象内容可视化", "借助AI智能体功能,为重难点学习提供学习资源","借助AI大模型功能,为重难点知识应用设计场景"]
},
"在AI助力激发学生兴趣的课程中,介绍了以下哪几种AI工具应用?": {
type: "多选",
answers: ["kimi AI", "天工AI","即梦AI"]
},
"在语文学科中,针对古代经典篇章中的文字理解,我们可以利用即梦AI将抽象内容可视化呈现。": {
type: "单选",
answers: ["对"]
},
"以下关于AI助力教学重难点突破的应用中,描述正确的是?": {
type: "多选",
answers: ["英语学科中,学生可以通过与AI的对话,让智能体动态调整学习资源的难度和类型,实现个性化学习。", "物理学科中,智能体可以提供详细的物理原理和公式解释,帮助学生深入理解物理概念。","化学学科中,智能体可以提供化学方程式和物质性质的查询功能,方便学生自主学习。"]
},
"在AI助力练习设计多样化的应用中,要注意以下哪几个操作要点?": {
type: "多选",
answers: ["向AI提问获取丰富练习内容", "结合教学要求遴选练习内容","向AI深入追问练习实施过程"]
},
//********************************************************************************//
"在AI辅助下的学生综合素养提升课程中,重点介绍了哪几个方面的学生素养提升?": {
type: "多选",
answers: ["审美感知", "创新能力"]
},
"在AI助力学生观察能力培养与提升课程中,介绍了以下哪几种AI工具应用。": {
type: "多选",
answers: ["文心一言", "腾讯元宝","AI识别王","豆包"]
},
"在AI助力学生观察能力培养与提升应用中,我们可以尝试以下哪几种应用路径?": {
type: "多选",
answers: ["巧用智能图像识别技术,准确把握观察要点", "打造虚拟空间,突破观察条件限制","个性化助教陪练,切实提升观察能力"]
},
"在课程中,提及的AI辅助下的学生伴学资源的生成应用有哪几个方面?": {
type: "多选",
answers: ["AI辅助学生生成精准匹配的伴学资源", "AI辅助学生生成情境式认知进阶伴学资源","AI辅助学生生成实时互动的伴学资源"]
},
"在使用AI工具实施“以文生图”的应用时,要注意以下哪几个要点?": {
type: "多选",
answers: ["要解构文本,提炼绘画元素", "将文学语言再凝练为绘画语言"]
},
//********************************************************************************//
"以下对于班级优化大师的AI智能评语功能,描述正确的是?": {
type: "多选",
answers: ["会综合过往的点评数据记录自动生成", "生成的智能评语支持一键导出功能","可以查看每周的点评记录与具体评语"]
},
"在使用AI进行分层作业设计时,不仅要注意提供正确的提示语,还要注意根据学生的实际学情进行内容的甄别以及追问。": {
type: "单选",
answers: ["对"]
},
"对于分层作业的设计,我们遇到的实施难点有哪些?": {
type: "多选",
answers: ["基础型作业内容较为单一,难以激起学生完成作业的热情", "素养型作业设计较为复杂,需要教师投入更多的时间和精力","实践型作业,需要提供完整配套的实践步骤和说明,需要教师尝试后才可以设计"]
},
"我们可以使用班级优化大师助力学生有效精准的素质评价,以下相关应用描述正确的是?": {
type: "多选",
answers: ["创建多元评价标签,开展丰富且有针对性的行为评价", "随时随地开展评价,用过程数据保证评价精准","AI评语汇聚过程数据,用数据智能生成评价结果"]
},
"以下哪些AI工具,能够实现助力作业智能批改?": {
type: "多选",
answers: ["快对APP", "快问AI","光速写作","网易有道词典"]
},
//********************************************************************************//
"运用AI进行家校沟通时,有哪些好的策略?": {
type: "多选",
answers: ["用AI分析收集的家校沟通材料", "用AI分析真问题,提出精准建议", "用AI工具推送给家长,进行及时交流"]
},
"利用AI进行班级事务管理时,可以遵循以下哪些策略?": {
type: "多选",
answers: ["学会用数据投喂AI", "掌握几个核心AI工具", "应用为王,提高效率"]
},
"利用AI进行家长会相关设计和实施时,可以运用在以下哪些方面?": {
type: "多选",
answers: ["AI设计主题", "AI设计开场白", "AI制作海报","AI制作PPT","AI制作二维码,传达学生祝福"]
},
"利用AI进行班级活动的设计和实施时,有哪些好的策略?": {
type: "多选",
answers: ["给自己安排专属“AI智能体”", "用AI重构班级活动工作流程", "用AI与学生共同创建氛围"]
},
"在使用AI进行班级事务管理时,讲师提到了哪些应用场景?": {
type: "多选",
answers: ["填写各种工作表格", "填写学生评语", "进行学生表现分析","其他班级事务管理"]
},
//********************************************************************************//
"使用AI工具,可以解决以下哪几个和课题研究相关的难题?": {
type: "多选",
answers: ["课题选题方向模糊不明,无法确定是否科学", "文献综述时文献查找困难,阅读量大,文献矩阵分析不精准", "立项申请书无法高效完成,无直接参考对象,专业性强,撰写困难"]
},
"使用AI工具,可以解决以下哪几个写作难题?": {
type: "多选",
answers: ["写作灵感何处寻找", "文章如何智能生成", "文章校对如何开展"]
},
"在A赋能教育写作的课程中,介绍了以下哪几种AI工具应用?": {
type: "多选",
answers: ["kimi AI", "文案猫", "秘塔写作猫"]
},
"AI赋能下的教研活动是通过“人工智能(获取解决策略)—人(优选解决策略)—人+人工智能(追问解决策略)”的流程,在这个流程中人是策略的筛选者、判断者、决策者,AI是策略提供者,人机协同,提高教研的有效性。": {
type: "单选",
answers: ["对"]
},
"在提供AI提示语时,要注意必须包含以下哪几个要素?": {
type: "多选",
answers: ["角色", "任务", "要求"]
},
};
// ========================== 工具函数 ==========================
const utils = {
// AES加密函数
aesEncrypt: function(data, key, iv) {
// 将数据转为JSON字符串
const dataStr = typeof data === 'object' ? JSON.stringify(data) : String(data);
// 使用CryptoJS进行AES加密
const keyBytes = CryptoJS.enc.Utf8.parse(key);
const ivBytes = CryptoJS.enc.Utf8.parse(iv);
const encrypted = CryptoJS.AES.encrypt(dataStr, keyBytes, {
iv: ivBytes,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 返回大写的Hex字符串
return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase();
},
// AES解密函数
aesDecrypt: function(encryptedData, key, iv) {
try {
const keyBytes = CryptoJS.enc.Utf8.parse(key);
const ivBytes = CryptoJS.enc.Utf8.parse(iv);
// 创建CipherParams对象
const cipherParams = CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Hex.parse(encryptedData)
});
// 解密
const decrypted = CryptoJS.AES.decrypt(cipherParams, keyBytes, {
iv: ivBytes,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 转换为UTF-8字符串
return decrypted.toString(CryptoJS.enc.Utf8);
} catch (error) {
console.error('解密失败:', error);
return null;
}
},
// 生成时间戳
generateTime: function() {
return Date.now();
},
// 生成随机字符串
generateRandomString: function(length = 22) {
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
let result = '';
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
},
// 获取CSRF Token (适用于希沃学习平台)
getCsrfToken: function() {
const match = document.cookie.match(/csrfToken=([^;]+)/);
return match ? match[1] : '';
},
// 发送请求
sendRequest: async function(url, data, headers) {
try {
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
});
return await response.json();
} catch (error) {
console.error('请求失败:', error);
return null;
}
},
// 安全保存数据到GM存储
saveData: function(key, data) {
try {
const encryptedData = this.aesEncrypt(JSON.stringify(data), config.encryptionKey, config.encryptionKey);
GM_setValue(key, encryptedData);
return true;
} catch (error) {
console.error('保存数据失败:', error);
return false;
}
},
// 从GM存储中安全读取数据
loadData: function(key) {
try {
const encryptedData = GM_getValue(key);
if (!encryptedData) return null;
const decryptedData = this.aesDecrypt(encryptedData, config.encryptionKey, config.encryptionKey);
return JSON.parse(decryptedData);
} catch (error) {
console.error('读取数据失败:', error);
return null;
}
},
// 检查当前站点
getCurrentSite: function() {
const url = window.location.href;
if (url.includes('study.seewoedu.cn')) {
return 'seewo';
} else if (url.includes('cpb-m.cvte.com')) {
return 'cpb';
}
return 'unknown';
},
// 清理文本(移除多余空格和特殊字符)
cleanText: function(text) {
if (!text) return '';
return text.replace(/\s+/g, ' ').trim();
},
// 创建延迟
sleep: function(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
},
// 获取不重复的随机索引
getRandomIndices: function(max, count) {
const indices = Array.from({ length: max }, (_, i) => i);
for (let i = indices.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[indices[i], indices[j]] = [indices[j], indices[i]];
}
return indices.slice(0, count);
}
};
// ========================== 授权管理 ==========================
const authManager = {
// 验证授权
verifyLicense: function(licenseKey) {
return new Promise((resolve, reject) => {
// 获取设备信息用于验证
const deviceInfo = {
userAgent: navigator.userAgent,
screenSize: `${window.screen.width}x${window.screen.height}`,
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
language: navigator.language,
timestamp: new Date().getTime()
};
const payload = {
license_key: licenseKey,
device_info: deviceInfo
};
console.log('尝试发送授权验证请求到:', config.authServerUrl);
console.log('请求数据:', payload);
// 使用GM_xmlhttpRequest发送请求到验证服务器
GM_xmlhttpRequest({
method: 'POST',
url: config.authServerUrl,
data: JSON.stringify(payload),
headers: {
'Content-Type': 'application/json'
},
onload: function(response) {
console.log('收到服务器响应:', response.status, response.responseText);
try {
const result = JSON.parse(response.responseText);
if (result.success) {
resolve(result);
} else {
reject(new Error(result.message || '授权验证失败'));
}
} catch (error) {
console.error('解析响应失败:', error);
reject(new Error('授权服务器响应无效'));
}
},
onerror: function(error) {
console.error('请求错误:', error);
reject(new Error('无法连接到授权服务器'));
},
ontimeout: function() {
console.error('请求超时');
reject(new Error('授权服务器请求超时'));
}
});
});
},
// 保存授权信息
saveLicenseInfo: function(licenseKey, licenseInfo) {
utils.saveData('licenseKey', licenseKey);
utils.saveData('licenseInfo', licenseInfo);
utils.saveData('lastAuthCheck', new Date().getTime());
utils.saveData('authExpiry', licenseInfo.expiry_time);
// 更新脚本状态
scriptState.authorized = true;
scriptState.authKey = licenseKey;
scriptState.licenseInfo = licenseInfo;
},
// 从存储中加载授权信息
loadLicenseInfo: function() {
const licenseKey = utils.loadData('licenseKey');
const licenseInfo = utils.loadData('licenseInfo');
const lastAuthCheck = utils.loadData('lastAuthCheck');
const authExpiry = utils.loadData('authExpiry');
if (licenseKey && licenseInfo) {
// 检查授权是否过期
const now = new Date().getTime();
if (authExpiry && now < authExpiry) {
scriptState.authorized = true;
scriptState.authKey = licenseKey;
scriptState.licenseInfo = licenseInfo;
// 如果超过检查间隔,重新验证授权
if (!lastAuthCheck || (now - lastAuthCheck > config.authCheckInterval)) {
// 使用立即执行的async函数来等待重新验证结果
(async () => {
try {
const revalidated = await this.revalidateLicense(licenseKey);
if (!revalidated) {
// 如果重新验证失败,显示授权对话框
this.showAuthDialog();
}
} catch (error) {
console.error("重新验证失败:", error);
this.showAuthDialog();
}
})();
}
return true;
} else {
// 授权过期,清除存储的授权信息
GM_deleteValue('licenseKey');
GM_deleteValue('licenseInfo');
GM_deleteValue('lastAuthCheck');
GM_deleteValue('authExpiry');
scriptState.authorized = false;
console.log('授权已过期');
}
}
scriptState.authorized = false;
return false;
},
// 重新验证授权
revalidateLicense: async function(licenseKey) {
try {
const result = await this.verifyLicense(licenseKey);
if (result.success) {
this.saveLicenseInfo(licenseKey, result.data);
return true;
} else {
// 验证失败,撤销授权
scriptState.authorized = false;
GM_deleteValue('licenseKey');
GM_deleteValue('licenseInfo');
GM_deleteValue('lastAuthCheck');
GM_deleteValue('authExpiry');
console.log('授权验证失败,授权已撤销');
return false;
}
} catch (error) {
console.error('重新验证授权失败:', error);
// 验证失败,撤销授权
scriptState.authorized = false;
GM_deleteValue('licenseKey');
GM_deleteValue('licenseInfo');
GM_deleteValue('lastAuthCheck');
GM_deleteValue('authExpiry');
console.log('授权验证失败,授权已撤销');
return false;
}
},
// 显示授权对话框
showAuthDialog: function() {
// 如果已存在对话框,则不重复创建
if (document.getElementById('auth-dialog')) return;
const dialogHTML = `
<div id="auth-dialog" style="
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
">
<div style="
background-color: white;
border-radius: 5px;
padding: 20px;
width: 400px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
">
<h2 style="margin-top: 0; color: #333;">刷课助手授权验证,授权码在<a href="https://www.qianxun1688.com/links/E46F5C6A" target="_blank">这里获取</a>。注意不要选错商品,卡密不通用</h2>
<h2 style="margin-top: 0; color: #333;">注意授权码有一个小时时效,一个号需要6-7分钟。</a></h2>
<p>请输入您的授权码以继续使用刷课助手:</p>
<input type="text" id="license-key-input" placeholder="授权码" style="
width: 100%;
padding: 8px;
margin: 10px 0;
border: 1px solid #ddd;
border-radius: 3px;
box-sizing: border-box;
">
<div id="auth-message" style="
margin: 10px 0;
padding: 8px;
border-radius: 3px;
display: none;
"></div>
<div style="display: flex; justify-content: space-between; margin-top: 15px;">
<button id="hide-auth-dialog-btn" style="
background-color: #f44336;
color: white;
border: none;
padding: 8px 16px;
border-radius: 3px;
cursor: pointer;
">取消</button>
<button id="verify-license-btn" style="
background-color: #4CAF50;
color: white;
border: none;
padding: 8px 16px;
border-radius: 3px;
cursor: pointer;
">验证</button>
</div>
</div>
</div>
`;
// 添加对话框到DOM
const dialogContainer = document.createElement('div');
dialogContainer.innerHTML = dialogHTML;
document.body.appendChild(dialogContainer);
// 添加验证按钮事件处理
const verifyBtn = document.getElementById('verify-license-btn');
const licenseInput = document.getElementById('license-key-input');
const messageDiv = document.getElementById('auth-message');
const hideBtn = document.getElementById('hide-auth-dialog-btn');
// 绑定隐藏按钮事件
hideBtn.addEventListener('click', () => {
document.body.removeChild(dialogContainer);
});
verifyBtn.addEventListener('click', async () => {
const licenseKey = licenseInput.value.trim();
if (!licenseKey) {
showMessage('请输入授权码', 'error');
return;
}
showMessage('正在验证授权...', 'info');
verifyBtn.disabled = true;
try {
const result = await this.verifyLicense(licenseKey);
if (result.success) {
this.saveLicenseInfo(licenseKey, result.data);
showMessage('授权验证成功!', 'success');
// 关闭对话框,初始化脚本
setTimeout(() => {
document.body.removeChild(dialogContainer);
initScriptForCurrentSite();
}, 1000);
} else {
showMessage(result.message || '授权验证失败', 'error');
verifyBtn.disabled = false;
}
} catch (error) {
showMessage(error.message || '授权验证过程出错', 'error');
verifyBtn.disabled = false;
}
});
// 显示消息函数
function showMessage(text, type) {
messageDiv.style.display = 'block';
messageDiv.textContent = text;
// 根据消息类型设置颜色
switch (type) {
case 'error':
messageDiv.style.backgroundColor = '#ffebee';
messageDiv.style.color = '#c62828';
break;
case 'success':
messageDiv.style.backgroundColor = '#e8f5e9';
messageDiv.style.color = '#2e7d32';
break;
case 'info':
default:
messageDiv.style.backgroundColor = '#e3f2fd';
messageDiv.style.color = '#1565c0';
break;
}
}
}
};
// ========================== 希沃学习助手 ==========================
const seewoHelper = {
isRunning: false,
currentCourseIndex: 0,
logElement: null,
progressBar: null,
progressBarContainer: null,
progressText: null,
// 初始化请求头
initHeaders: function() {
const token = utils.getCsrfToken();
return {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
'Accept': "application/json, text/plain, */*",
'Accept-Encoding': "gzip, deflate, br, zstd",
'Content-Type': "application/json",
'sec-ch-ua-platform': "\"Windows\"",
'x-csrf-token': token,
'sec-ch-ua': "\"Not(A:Brand\";v=\"99\", \"Chromium\";v=\"133\"",
'sec-ch-ua-mobile': "?0",
'origin': "https://study.seewoedu.cn",
'sec-fetch-site': "same-origin",
'sec-fetch-mode': "cors",
'sec-fetch-dest': "empty",
'referer': "https://study.seewoedu.cn/tCourse/group/f34dfc60b67b460ebe2cb6c329f23038/course/ba1d548d6e8e4a5687a5dca8754bab72"
};
},
// 添加日志
log: function(message, isError = false) {
if (!this.logElement) return;
const logItem = document.createElement('div');
logItem.textContent = `${new Date().toLocaleTimeString()} - ${message}`;
if (isError) {
logItem.style.color = 'red';
}
this.logElement.appendChild(logItem);
this.logElement.scrollTop = this.logElement.scrollHeight;
},
// 更新进度条
updateProgress: function(current, total) {
if (!this.progressBar || !this.progressText) return;
const percent = Math.round((current / total) * 100);
this.progressBar.style.width = `${percent}%`;
this.progressText.textContent = `进度: ${current}/${total} (${percent}%)`;
},
// 处理单个课程
processCourse: async function(courseId) {
try {
const headers = this.initHeaders();
const timeStamp = utils.generateTime();
const randomString = utils.generateRandomString();
// 随机生成学习次数
const count = Math.floor(Math.random() * 21) + 40; // 40-60之间的随机数
this.log(`开始处理课程: ${courseId}, 刷取次数: ${count}`);
// 构建请求体
const body = {
courseGroupUid: config.seewoGroupCourseId,
courseUid: courseId,
duration: 30,
timestamp: timeStamp
};
// 加密请求体
const encryptedBody = utils.aesEncrypt(body, config.seewoKey, config.seewoIv);
const payload = {
body: encryptedBody,
timestamp: timeStamp
};
// 发送学习时长请求
for (let i = 0; i < count; i++) {
const url = `https://study.seewoedu.cn/pc/api/v2/course/study?time=${timeStamp}-${randomString}`;
await utils.sendRequest(url, payload, headers);
if (i % 10 === 0) {
this.log(`课程 ${courseId}: 已完成 ${i}/${count} 次请求`);
}
// 随机等待100-300毫秒
await utils.sleep(Math.floor(Math.random() * 200) + 100);
}
// 发送学习记录
const logUrl = `https://study.seewoedu.cn/pc/api/v1/studyLogs?time=${utils.generateTime()}-${utils.generateRandomString()}`;
const logData = {
courseGroupUid: config.seewoGroupCourseId,
courseUid: courseId,
last: 0
};
const logResult = await utils.sendRequest(logUrl, logData, headers);
this.log(`课程学习记录: ${logResult ? '成功' : '失败'}`);
// 完成标签
const completeUrl = `https://study.seewoedu.cn/pc/api/v1/studyLogs/study?time=${utils.generateTime()}-${utils.generateRandomString()}`;
const completeData = {
courseGroupUid: config.seewoGroupCourseId,
courseUid: courseId,
campUid: null
};
const completeResult = await utils.sendRequest(completeUrl, completeData, headers);
this.log(`课程完成标记: ${completeResult ? '成功' : '失败'}`);
return true;
} catch (error) {
this.log(`处理课程 ${courseId} 时出错: ${error.message}`, true);
return false;
}
},
// 开始学习
startLearning: async function() {
if (this.isRunning) return;
this.isRunning = true;
this.currentCourseIndex = 0;
try {
const totalCourses = config.seewoCourseIds.length;
this.log(`开始学习,共 ${totalCourses} 个课程`);
this.updateProgress(0, totalCourses);
for (let i = 0; i < totalCourses; i++) {
if (!this.isRunning) {
this.log('学习已停止');
break;
}
this.currentCourseIndex = i;
const courseId = config.seewoCourseIds[i];
this.updateProgress(i, totalCourses);
await this.processCourse(courseId);
// 随机等待1-3秒,模拟真实操作
const waitTime = Math.floor(Math.random() * 2000) + 1000;
await utils.sleep(waitTime);
}
if (this.isRunning) {
this.updateProgress(totalCourses, totalCourses);
this.log('所有课程学习完成!');
}
} catch (error) {
this.log(`学习过程中发生错误: ${error.message}`, true);
} finally {
this.isRunning = false;
}
},
// 停止学习
stopLearning: function() {
if (!this.isRunning) return;
this.isRunning = false;
this.log('正在停止学习...');
},
// 创建UI界面
createUI: function() {
// 创建面板容器
const panel = document.createElement('div');
panel.id = 'seewo-helper-panel';
panel.style.cssText = `
position: fixed;
bottom: 20px;
right: 20px;
width: 300px;
background-color: white;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
z-index: 9999;
font-family: Arial, sans-serif;
transition: all 0.3s ease;
`;
// 创建标题栏
const titleBar = document.createElement('div');
titleBar.style.cssText = `
padding: 10px;
background-color: #f0f0f0;
border-bottom: 1px solid #ccc;
cursor: move;
display: flex;
justify-content: space-between;
align-items: center;
`;
const title = document.createElement('div');
title.textContent = '希沃学习时长助手';
title.style.fontWeight = 'bold';
const closeBtn = document.createElement('button');
closeBtn.textContent = '×';
closeBtn.style.cssText = `
background: none;
border: none;
font-size: 20px;
cursor: pointer;
padding: 0 5px;
`;
closeBtn.onclick = () => {
panel.style.display = 'none';
toggleBtn.style.display = 'block';
};
titleBar.appendChild(title);
titleBar.appendChild(closeBtn);
// 创建内容区域
const content = document.createElement('div');
content.style.padding = '10px';
// 创建授权状态显示
const authStatus = document.createElement('div');
authStatus.id = 'auth-status';
authStatus.style.cssText = `
margin-bottom: 10px;
padding: 5px 10px;
background-color: #e8f5e9;
color: #2e7d32;
border-radius: 4px;
font-size: 12px;
`;
// 计算授权剩余时间
const expiryTime = utils.loadData('authExpiry');
if (expiryTime) {
const remainingTime = Math.max(0, expiryTime - Date.now());
const remainingMinutes = Math.floor(remainingTime / (60 * 1000));
authStatus.textContent = `授权状态: 有效 (剩余约 ${remainingMinutes} 分钟)`;
} else {
authStatus.textContent = '授权状态: 未知';
authStatus.style.backgroundColor = '#fff3e0';
authStatus.style.color = '#e65100';
}
// 创建进度条
this.progressBarContainer = document.createElement('div');
this.progressBarContainer.style.cssText = `
width: 100%;
height: 20px;
background-color: #f0f0f0;
border-radius: 10px;
margin: 10px 0;
overflow: hidden;
`;
this.progressBar = document.createElement('div');
this.progressBar.style.cssText = `
height: 100%;
width: 0%;
background-color: #4CAF50;
transition: width 0.3s;
`;
this.progressBarContainer.appendChild(this.progressBar);
// 创建进度文本
this.progressText = document.createElement('div');
this.progressText.style.fontSize = '14px';
this.progressText.textContent = '进度: 0/0 (0%)';
// 创建按钮区域
const buttonContainer = document.createElement('div');
buttonContainer.style.cssText = `
display: flex;
justify-content: space-between;
margin: 10px 0;
`;
const startBtn = document.createElement('button');
startBtn.textContent = '开始学习';
startBtn.style.cssText = `
padding: 8px 15px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
flex: 1;
margin-right: 5px;
`;
startBtn.onclick = () => this.startLearning();
const stopBtn = document.createElement('button');
stopBtn.textContent = '停止学习';
stopBtn.style.cssText = `
padding: 8px 15px;
background-color: #f44336;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
flex: 1;
margin-left: 5px;
`;
stopBtn.onclick = () => this.stopLearning();
buttonContainer.appendChild(startBtn);
buttonContainer.appendChild(stopBtn);
// 创建日志区域
const logContainer = document.createElement('div');
logContainer.style.cssText = `
margin-top: 10px;
border: 1px solid #ccc;
border-radius: 4px;
height: 150px;
overflow-y: auto;
padding: 5px;
font-size: 12px;
background-color: #f9f9f9;
`;
this.logElement = logContainer;
// 添加所有元素到内容区域
content.appendChild(authStatus);
content.appendChild(this.progressBarContainer);
content.appendChild(this.progressText);
content.appendChild(buttonContainer);
content.appendChild(logContainer);
// 添加标题栏和内容区域到面板
panel.appendChild(titleBar);
panel.appendChild(content);
// 添加面板到文档
document.body.appendChild(panel);
// 让面板可拖动
this.makeDraggable(panel, titleBar);
// 添加切换按钮
const toggleBtn = document.createElement('button');
toggleBtn.textContent = '学习助手';
toggleBtn.style.cssText = `
position: fixed;
bottom: 20px;
right: 20px;
padding: 8px 15px;
background-color: #2196F3;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
z-index: 9998;
`;
toggleBtn.onclick = () => {
if (panel.style.display === 'none') {
panel.style.display = 'block';
toggleBtn.style.display = 'none';
}
};
document.body.appendChild(toggleBtn);
// 初始添加一些日志
this.log('希沃学习时长助手已加载');
this.log('点击"开始学习"按钮开始自动学习');
// 更新授权状态显示
this.startAuthExpiryTimer(authStatus);
},
// 启动授权过期倒计时
startAuthExpiryTimer: function(statusElement) {
if (!statusElement) return;
const updateAuthStatus = () => {
const expiryTime = utils.loadData('authExpiry');
if (expiryTime) {
// 将UTC时间戳转换为本地时间
const remainingTime = Math.max(0, expiryTime - Date.now());
const remainingMinutes = Math.floor(remainingTime / (60 * 1000));
if (remainingTime <= 0) {
statusElement.textContent = '授权状态: 已过期';
statusElement.style.backgroundColor = '#ffebee';
statusElement.style.color = '#c62828';
// 授权过期,显示授权对话框
authManager.showAuthDialog();
return;
}
statusElement.textContent = `授权状态: 有效 (有效时间剩余约 ${remainingMinutes} 分钟)`;
statusElement.style.backgroundColor = '#e8f5e9';
statusElement.style.color = '#2e7d32';
} else {
statusElement.textContent = '授权状态: 未知';
statusElement.style.backgroundColor = '#fff3e0';
statusElement.style.color = '#e65100';
}
};
// 首次更新
updateAuthStatus();
// 每分钟更新一次
setInterval(updateAuthStatus, 60 * 1000);
},
// 使元素可拖动
makeDraggable: function(element, handle) {
let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
handle.onmousedown = dragMouseDown;
function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
// 获取鼠标初始位置
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
// 鼠标移动时调用elementDrag
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
e.preventDefault();
// 计算新位置
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
// 设置元素的新位置
element.style.top = (element.offsetTop - pos2) + "px";
element.style.left = (element.offsetLeft - pos1) + "px";
element.style.bottom = "auto";
element.style.right = "auto";
}
function closeDragElement() {
// 停止移动
document.onmouseup = null;
document.onmousemove = null;
}
},
// 初始化
init: function() {
this.createUI();
}
};
// ========================== CPB自动答题 ==========================
const cpbHelper = {
// 自动回答所有问题
autoAnswerAllQuestions: async function() {
// 获取页面上的所有问题容器
const questionContainers = document.querySelectorAll('.qn-container');
console.log(`找到 ${questionContainers.length} 个问题`);
// 扫描试卷中的所有问题,并尝试将未收集的问题添加到题库
await this.scanNewQuestions(questionContainers);
// 处理每个问题
for (let i = 0; i < questionContainers.length; i++) {
const container = questionContainers[i];
// 检查问题是否已回答
const isAnswered = container.querySelector('.van-checkbox--checked') ||
container.querySelector('.van-radio--checked');
if (!isAnswered) {
await this.processQuestion(container);
await utils.sleep(config.delayBetweenActions);
} else {
console.log(`问题 ${i+1} 已回答,跳过`);
}
}
// 根据配置决定是否自动提交
if (config.autoSubmit) {
await utils.sleep(config.delayBeforeSubmit);
const submitButton = document.querySelector('.btn-block .btn');
if (submitButton) {
console.log('提交答案...');
submitButton.click();
}
}
},
// 扫描试卷中的新问题
scanNewQuestions: async function(questionContainers) {
let newQuestionsFound = false;
for (const container of questionContainers) {
// 获取问题标题
const titleElement = container.querySelector('.qn-title');
if (!titleElement) continue;
// 清理问题文本
const questionText = utils.cleanText(titleElement.textContent);
if (!questionText) continue;
// 如果问题不在题库中,则添加到题库中
if (!answerDatabase[questionText]) {
const isMultipleChoice = !!container.querySelector('.checkbox');
const type = isMultipleChoice ? "多选" : "单选";
// 获取所有选项
const options = isMultipleChoice
? container.querySelectorAll('.van-checkbox')
: container.querySelectorAll('.van-radio');
// 创建答案占位符(这里不知道正确答案,所以都设为空)
answerDatabase[questionText] = {
type: type,
answers: [] // 空答案,等待用户导入正确答案
};
newQuestionsFound = true;
console.log(`发现新问题:${questionText}`);
}
}
// 如果发现新问题,保存更新后的题库
if (newQuestionsFound) {
utils.saveData('answerDatabase', answerDatabase);
console.log('已将新问题加入题库');
}
},
// 处理一个问题
processQuestion: async function(questionContainer) {
// 获取问题标题
const titleElement = questionContainer.querySelector('.qn-title');
if (!titleElement) return;
// 清理问题文本
const questionText = utils.cleanText(titleElement.textContent);
console.log('处理问题:', questionText);
// 确定问题类型(单选或多选)
const isMultipleChoice = !!questionContainer.querySelector('.checkbox');
// 在题库中查找答案
const answerData = answerDatabase[questionText];
if (answerData && answerData.answers && answerData.answers.length > 0) {
console.log(`找到答案: ${answerData.answers.join(', ')}`);
if (isMultipleChoice) {
await this.handleMultipleChoiceWithAnswer(questionContainer, answerData.answers);
} else {
await this.handleSingleChoiceWithAnswer(questionContainer, answerData.answers[0]);
}
} else {
console.log('题库中未找到答案,随机选择');
if (isMultipleChoice) {
await this.handleMultipleChoiceQuestion(questionContainer);
} else {
await this.handleSingleChoiceQuestion(questionContainer);
}
}
},
// 处理多选题(有答案)
handleMultipleChoiceWithAnswer: async function(questionContainer, answers) {
const options = questionContainer.querySelectorAll('.van-checkbox');
// 遍历所有选项
for (let i = 0; i < options.length; i++) {
const option = options[i];
const label = option.querySelector('.van-checkbox__label');
if (!label) continue;
const optionText = utils.cleanText(label.textContent);
// 如果选项文本在答案列表中,则选择该选项
if (answers.some(answer => optionText.includes(answer) || answer.includes(optionText))) {
console.log(`选择选项: ${optionText}`);
label.click();
await utils.sleep(250);
}
}
},
// 处理单选题(有答案)
handleSingleChoiceWithAnswer: async function(questionContainer, answer) {
const options = questionContainer.querySelectorAll('.van-radio');
// 遍历所有选项
for (let i = 0; i < options.length; i++) {
const option = options[i];
const label = option.querySelector('.van-radio__label');
if (!label) continue;
const optionText = utils.cleanText(label.textContent);
// 如果选项文本包含答案,或答案包含选项文本,则选择该选项
if (optionText.includes(answer) || answer.includes(optionText)) {
console.log(`选择选项: ${optionText}`);
label.click();
break; // 单选题只需选择一个选项
}
}
},
// 处理多选题(随机)
handleMultipleChoiceQuestion: async function(questionContainer) {
console.log('处理多选题(随机)');
// 获取所有选项
const options = questionContainer.querySelectorAll('.van-checkbox');
// 对于多选题,选择一半的选项(向上取整)
const optionsToSelect = Math.ceil(options.length / 2);
// 随机选择指定数量的选项
const selectedIndices = utils.getRandomIndices(options.length, optionsToSelect);
for (const index of selectedIndices) {
const option = options[index];
const label = option.querySelector('.van-checkbox__label');
if (label) {
label.click();
await utils.sleep(250); // 选择之间的小延迟
}
}
},
// 处理单选题(随机)
handleSingleChoiceQuestion: async function(questionContainer) {
console.log('处理单选题(随机)');
// 获取所有选项
const options = questionContainer.querySelectorAll('.van-radio');
if (options.length > 0) {
// 对于单选题,选择一个随机选项
const randomIndex = Math.floor(Math.random() * options.length);
const option = options[randomIndex];
const label = option.querySelector('.van-radio__label');
if (label) {
label.click();
}
}
},
// 导入题库
importAnswerDatabase: function() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.json';
input.onchange = function(event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(e) {
try {
const database = JSON.parse(e.target.result);
answerDatabase = database;
utils.saveData('answerDatabase', database);
alert('题库导入成功!共导入 ' + Object.keys(database).length + ' 个题目。');
} catch (error) {
alert('题库导入失败!请确保文件格式正确。');
console.error('题库导入错误:', error);
}
};
reader.readAsText(file);
};
input.click();
},
// 导出题库
exportAnswerDatabase: function() {
const dataStr = JSON.stringify(answerDatabase, null, 2);
const dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr);
const exportFileDefaultName = 'answer_database.json';
const linkElement = document.createElement('a');
linkElement.setAttribute('href', dataUri);
linkElement.setAttribute('download', exportFileDefaultName);
linkElement.click();
},
// 创建按钮函数修改
createAutoAnswerButton: function() {
console.log('尝试创建自动答题按钮');
// 更通用的选择器,适应不同页面结构
const container = document.body;
if (!container) {
console.error('找不到容器元素');
return;
}
// 检查按钮是否已存在
if (document.querySelector('.auto-answer-controls')) {
console.log('自动答题按钮已存在,不重复创建');
return;
}
const buttonDiv = document.createElement('div');
buttonDiv.style.position = 'fixed';
buttonDiv.style.top = '10px';
buttonDiv.style.right = '10px';
buttonDiv.style.zIndex = '9999';
buttonDiv.style.display = 'flex';
buttonDiv.style.flexDirection = 'column';
buttonDiv.style.gap = '10px';
buttonDiv.className = 'auto-answer-controls';
// 创建授权状态显示
const authStatus = document.createElement('div');
authStatus.id = 'auth-status-cpb';
authStatus.style.cssText = `
padding: 5px 10px;
background-color: #e8f5e9;
color: #2e7d32;
border-radius: 4px;
font-size: 12px;
text-align: center;
margin-bottom: 5px;
`;
// 计算授权剩余时间
const expiryTime = utils.loadData('authExpiry');
if (expiryTime) {
const remainingTime = Math.max(0, expiryTime - Date.now());
const remainingMinutes = Math.floor(remainingTime / (60 * 1000));
authStatus.textContent = `授权有效: 剩余${remainingMinutes}分钟`;
} else {
authStatus.textContent = '授权状态: 未知';
authStatus.style.backgroundColor = '#fff3e0';
authStatus.style.color = '#e65100';
}
const autoAnswerButton = document.createElement('button');
autoAnswerButton.textContent = '自动答题';
autoAnswerButton.style.backgroundColor = '#3388ff';
autoAnswerButton.style.color = 'white';
autoAnswerButton.style.border = 'none';
autoAnswerButton.style.borderRadius = '4px';
autoAnswerButton.style.padding = '8px 16px';
autoAnswerButton.style.cursor = 'pointer';
autoAnswerButton.style.fontWeight = 'bold';
autoAnswerButton.style.width = '100%';
autoAnswerButton.className = 'auto-answer-button';
autoAnswerButton.addEventListener('click', () => {
autoAnswerButton.disabled = true;
autoAnswerButton.textContent = '答题中...';
this.autoAnswerAllQuestions().then(() => {
autoAnswerButton.textContent = '已完成';
setTimeout(() => {
autoAnswerButton.textContent = '自动答题';
autoAnswerButton.disabled = false;
}, 2000);
});
});
buttonDiv.appendChild(authStatus);
buttonDiv.appendChild(autoAnswerButton);
document.body.appendChild(buttonDiv);
console.log('自动答题按钮创建成功');
// 启动授权倒计时
this.startAuthExpiryTimer(authStatus);
// 添加题库管理按钮
this.createDatabaseButtons(buttonDiv);
},
// 启动授权过期倒计时
startAuthExpiryTimer: function(statusElement) {
if (!statusElement) return;
const updateAuthStatus = () => {
const expiryTime = utils.loadData('authExpiry');
if (expiryTime) {
const remainingTime = Math.max(0, expiryTime - Date.now());
const remainingMinutes = Math.floor(remainingTime / (60 * 1000));
if (remainingTime <= 0) {
statusElement.textContent = '授权已过期';
statusElement.style.backgroundColor = '#ffebee';
statusElement.style.color = '#c62828';
// 授权过期,显示授权对话框
authManager.showAuthDialog();
return;
}
statusElement.textContent = `授权有效: 剩余${remainingMinutes}分钟`;
statusElement.style.backgroundColor = '#e8f5e9';
statusElement.style.color = '#2e7d32';
} else {
statusElement.textContent = '授权状态: 未知';
statusElement.style.backgroundColor = '#fff3e0';
statusElement.style.color = '#e65100';
}
};
// 首次更新
updateAuthStatus();
// 每分钟更新一次
setInterval(updateAuthStatus, 60 * 1000);
},
// 创建题库导入/导出按钮
createDatabaseButtons: function(controlsDiv) {
if (!controlsDiv) return;
// 创建按钮容器
const dbButtonsContainer = document.createElement('div');
dbButtonsContainer.style.cssText = `
display: flex;
justify-content: space-between;
margin-top: 5px;
`;
// 导入题库按钮
const importButton = document.createElement('button');
importButton.textContent = '导入题库';
importButton.style.cssText = `
background-color: #28a745;
color: white;
border: none;
border-radius: 4px;
padding: 5px 10px;
cursor: pointer;
font-size: 12px;
flex: 1;
margin-right: 5px;
`;
// 导出题库按钮
const exportButton = document.createElement('button');
exportButton.textContent = '导出题库';
exportButton.style.cssText = `
background-color: #ffc107;
color: black;
border: none;
border-radius: 4px;
padding: 5px 10px;
cursor: pointer;
font-size: 12px;
flex: 1;
margin-left: 5px;
`;
// 添加导入题库事件监听器
importButton.addEventListener('click', () => this.importAnswerDatabase());
// 添加导出题库事件监听器
exportButton.addEventListener('click', () => this.exportAnswerDatabase());
// 添加按钮到容器
dbButtonsContainer.appendChild(importButton);
dbButtonsContainer.appendChild(exportButton);
// 添加容器到控制面板
controlsDiv.appendChild(dbButtonsContainer);
},
// 初始化
// CPB自动答题 - 初始化函数修改
init: function() {
console.log('初始化CPB自动答题');
// 从存储中加载题库
// 立即尝试创建按钮
this.createAutoAnswerButton();
// 然后设置观察器,以防页面动态加载
this.observeDOMChanges();
},
// 监听DOM变化以处理动态加载的内容
observeDOMChanges: function() {
console.log('设置DOM观察器');
// 初始化一个计时器,定期检查是否需要添加按钮
setInterval(() => {
if (!document.querySelector('.auto-answer-button')) {
console.log('定期检查: 未找到按钮,尝试创建');
this.createAutoAnswerButton();
}
}, 2000); // 每2秒检查一次
// 同时使用MutationObserver监听DOM变化
const observer = new MutationObserver((mutations) => {
let shouldCreateButton = false;
for (const mutation of mutations) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
// 如果有新元素添加,考虑创建按钮
shouldCreateButton = true;
break;
}
}
if (shouldCreateButton && !document.querySelector('.auto-answer-button')) {
console.log('DOM变化: 尝试创建按钮');
this.createAutoAnswerButton();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
};
// ========================== 主函数 ==========================
// 初始化脚本
function init() {
console.log('智能刷课助手已初始化');
// 检查授权
if (!authManager.loadLicenseInfo()) {
console.log('未找到有效授权,显示授权对话框');
authManager.showAuthDialog();
return; // 确保在未授权时不会继续执行
}
// 确保授权状态是有效的
if (!scriptState.authorized) {
console.log('授权无效,显示授权对话框');
authManager.showAuthDialog();
return;
}
// 根据当前站点初始化对应的功能
initScriptForCurrentSite();
}
// 根据当前站点初始化对应的功能
function initScriptForCurrentSite() {
// 再次检查授权状态,以防万一
if (!scriptState.authorized) {
console.log('授权无效,无法初始化功能');
authManager.showAuthDialog();
return;
}
const currentSite = utils.getCurrentSite();
console.log(`当前站点: ${currentSite}`);
switch (currentSite) {
case 'seewo':
console.log('初始化希沃学习助手');
seewoHelper.init();
break;
case 'cpb':
console.log('初始化CPB自动答题');
cpbHelper.init();
break;
default:
console.log('未知站点,无法初始化');
}
}
// 等待页面完全加载后初始化
window.addEventListener('load', init);
// 如果页面已加载,立即初始化
if (document.readyState === 'complete') {
init();
}
})();