学习平台一点通:全程自动化操作!让您彻底告别网课困扰。|超星学习通|知道智慧树|U校园|职教云|智慧职教|慕课|
// ==UserScript==
// @name 学习平台一点通:全程自动化操作!让您彻底告别网课困扰。|超星学习通|知道智慧树|U校园|职教云|智慧职教|慕课|
// @namespace yidiantong
// @version 2.6
// @description 请认真查看介绍:支持学习通视频测验、作业、答题、考试(选择题、多选题、评论),答题正确率接近95+以上,具体操作可查看脚本运行页面,支持在线客服解答问题,处理问题,支持一键搜索题,支持第三方题库DeepSeek答题,本脚本不采集任何个人信息,第三方课程可支持U校园/U校园AI版、知到/智慧树、新国开、智慧职教等全国课程,更多课程正在开发中...具体流程可进咨询Q群2️⃣:1044568375
// @author 学习助手
// @license MIT
// @icon https://pan-yz.chaoxing.com/favicon.ico
// @connect mooc1-1.chaoxing.com
// @connect mooc1.chaoxing.com
// @connect mooc1-2.chaoxing.com
// @connect passport2-api.chaoxing.com
// @connect www.tiku.me
// @connect cx.icodef.com
// @connect cx.icodef.com
// @connect q.icodef.com
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_notification
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @run-at document-start
// @grant GM_addStyle
// @grant GM_setValue
// @match *://*.mooc.icve.com.cn/cms/*
// @match *://*.passport2.chaoxing.com/*
// @match *://*.mooc.icve.com.cn/*
// @match *://*.chaoxing.com/*
// @match *://*.edu.cn/*
// @match *://*.www.yuketang.cn/*
// @match *://*.nbdlib.cn/*
// @match *://*.hnsyu.net/*
// @match *://*.gdhkmooc.com/*
// @match *://*.zhihuishu.com/*
// @match *://*.tmall.com/*
// @match *://chaoshi.detail.tmall.com/*
// @match *://*.tmall.hk/*
// @match *://*.liangxinyao.com/*
// @match *://*.iam.pt.ouchn.cn/*
// @match *://*.jd.com/*
// @match *://*.jd.hk/*
// @match *://*.jkcsjd.com/*
// @match *://*.yiyaojd.com/*
// @match *://*.vip.com/*
// @match *://*.u.unipus.cn/*
// @match *://*.ucloud.unipus.cn/*
// @match *://*.mooc.yinghuaonline.com/user/login/*
// @match *://*.umooc.ulearning.cn/*
// @match *://*.www.qingshuxuetang.com/*
// @match *://*.www.buu.edu.cn/*
// @match *://*.www.pmphmooc.com/*
// @match *://*.vipglobal.hk/*
// @match *://*.welearn.sflep.com/*
// @match *://*.www.ouchn.edu.cn/*
// @exclude *://*.login.tmall.com/*
// @exclude *://*.pages.tmall.com/*
// @exclude *://*.passport.zhihuishu.com/login/*
// @namespace http://a.zhuxuelo.top/index/chaxun
// @homepage https://
// @source http://a.zhuxuelo.top/index/chaxun
// @antifeature ads
// @antifeature payment
// ==/UserScript==
(function () {
'use strict';
// _simpleGlyph: function(gl, p) {
// var P = Typr["U"]["P"];
// for (var c = 0; c < gl.noc; c++) {
// var i0 = c == 0 ? 0 : gl.endPts[c - 1] + 1;
// var il = gl.endPts[c];
// for (var i = i0; i <= il; i++) {
// var pr = i == i0 ? il : i - 1;
// var nx = i == il ? i0 : i + 1;
// var onCurve = gl.flags[i] & 1;
// var prOnCurve = gl.flags[pr] & 1;
// var nxOnCurve = gl.flags[nx] & 1;
// var x = gl.xs[i], y = gl.ys[i];
// if (i == i0) {
// if (onCurve) {
// if (prOnCurve) P.MoveTo(p, gl.xs[pr], gl.ys[pr]); else {
// P.MoveTo(p, x, y);
// continue;
// }
// } else {
// if (prOnCurve) P.MoveTo(p, gl.xs[pr], gl.ys[pr]); else P.MoveTo(p, Math.floor((gl.xs[pr] + x) * .5), Math.floor((gl.ys[pr] + y) * .5));
// }
// }
// if (onCurve) {
// if (prOnCurve) P.LineTo(p, x, y);
// } else {
// if (nxOnCurve) P.qCurveTo(p, x, y, gl.xs[nx], gl.ys[nx]); else P.qCurveTo(p, x, y, Math.floor((x + gl.xs[nx]) * .5), Math.floor((y + gl.ys[nx]) * .5));
// }
// }
// P.ClosePath(p);
// }
// },
// _compoGlyph: function(gl, font, p) {
// for (var j = 0; j < gl.parts.length; j++) {
// var path = {
// cmds: [],
// crds: []
// };
// var prt = gl.parts[j];
// Typr["U"]["_drawGlyf"](prt.glyphIndex, font, path);
// var m = prt.m;
// for (var i = 0; i < path.crds.length; i += 2) {
// var x = path.crds[i], y = path.crds[i + 1];
// p.crds.push(x * m.a + y * m.b + m.tx);
// p.crds.push(x * m.c + y * m.d + m.ty);
// }
// for (var i = 0; i < path.cmds.length; i++) p.cmds.push(path.cmds[i]);
// }
// },
// pathToSVG: function(path, prec) {
// var cmds = path["cmds"], crds = path["crds"];
// if (prec == null) prec = 5;
// var out = [], co = 0, lmap = {
// M: 2,
// L: 2,
// Q: 4,
// C: 6
// };
// for (var i = 0; i < cmds.length; i++) {
// var cmd = cmds[i], cn = co + (lmap[cmd] ? lmap[cmd] : 0);
// out.push(cmd);
// while (co < cn) {
// var c = crds[co++];
// out.push(parseFloat(c.toFixed(prec)) + (co == cn ? "" : " "));
// }
// }
// return out.join("");
// },
// SVGToPath: function(d) {
// var pth = {
// cmds: [],
// crds: []
// };
// Typr["U"]["SVG"].svgToPath(d, pth);
// return {
// cmds: pth.cmds,
// crds: pth.crds
// };
// },
// pathToContext: function(path, ctx) {
// var c = 0, cmds = path["cmds"], crds = path["crds"];
// for (var j = 0; j < cmds.length; j++) {
// var cmd = cmds[j];
// if (cmd == "M") {
// ctx.moveTo(crds[c], crds[c + 1]);
// c += 2;
// } else if (cmd == "L") {
// ctx.lineTo(crds[c], crds[c + 1]);
// c += 2;
// } else if (cmd == "C") {
// ctx.bezierCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3], crds[c + 4], crds[c + 5]);
// c += 6;
// } else if (cmd == "Q") {
// ctx.quadraticCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3]);
// c += 4;
// } else if (cmd.charAt(0) == "#") {
// ctx.beginPath();
// ctx.fillStyle = cmd;
// } else if (cmd == "Z") {
// ctx.closePath();
// } else if (cmd == "X") {
// ctx.fill();
// }
// }
// },
const popup = document.createElement('div');
popup.id = 'custom-popup';
popup.innerHTML = `
<div id="popup-header">
<img id="popup-avatar" src="http://a.zhuxuelo.top/index/upload/zhuxuelo.jpg" alt="Avatar">
<span>助学网平台一点通</span>
<button id="popup-close">×</button>
</div>
<div id="popup-nav">
<button class="active" data-tab="home">首页</button>
<button data-tab="course">课程</button>
<button data-tab="profile">个人中心</button>
</div>
<div id="popup-content">
<div id="tab-home" class="tab-content active"><br>
<h3>🔥🔥🔥合作招募🔥🔥🔥</h3><br>
<p>致各位教育同行:</p>
<p>面向教育机构、在校学生、教师及在行业伙伴招募合作!:
我们提供一手独家优质资源,支持批量导入与课程查询,课程质量有保障。:
同时配备在线客服随时待命与 “一号一IP” 专属机制解决问题 ,服务与质量双重保障。:
期待与您合作,共同努力解决网课问题,可前来咨询!</p><br><br><br>
<h3>站长合作Q:3200437464 | Q群聊:1044568375<h3>
</div>
<div id="tab-course" class="tab-content">
<div class="search-bar">
<input type="text" id="course-search-input" placeholder="请输入课程名称...">
<button id="course-search-button">搜索</button>
<button id="course-reset-button">重置</button>
</div>
<div id="course-result" class="result-message"></div>
<div class="options-container">
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="chapter-fetch"> 章节获取</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="quiz-settings"> 设置测验</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="homework"> 作业</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="exam"> 考试</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="auto-next-chapter"> 自动下一个章节</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="ai-fill-blanks"> 填空题AI填写</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="simulate-human"> 是否模拟人工操作</div>
<div class="sortable-item" draggable="true"><input type="checkbox" name="features" value="simulate-human"> 倍数:X2倍</div>
</div>
<div class="ai-model-select">
<label for="ai-model" class="bold-text ai-model-label">选择AI智能模型:</label>
<select id="ai-model">
<option value="deepseek" selected>DeepSeek-MoE(推荐)</option>
<option value="gpt-model">GPT-模型 (推荐)</option>
<option value="human-answer1">OpenAI GPT-4.5</option>
<option value="human-answer2">DeepSeek-R1(推荐)</option>
<option value="human-answer3">OpenAI o3/o4-mini</option>
<option value="human-answer4">GPT-4.1 mini (推荐)</option>
<option value="human-answer5">Constitutional AI</option>
<option value="human-answer6">助学网学习库 AI (推荐)</option>
</select>
</div>
<div class="key-input">
<label for="api-key" class="bold-text">API Key:</label>
<input type="text" id="api-key" placeholder="请输入获取到Key密钥">
<button id="verify-button" class="verify-button">核验</button>
</div>
<button id="play-button" class="play-button">播放</button>
</div>
<div id="tab-profile" class="tab-content">
<div class="action-buttons">
<button id="pause-button" class="action-button">暂停</button>
<button id="restart-button" class="action-button">重新播放</button>
<button id="import-button" class="action-button import-button">批量导入课程</button>
</div>
<div class="action-buttons">
<button id="get-courses-button" class="action-button course-button">获取课程</button>
</div>
<div class="action-buttons">
<button id="print-log-button" class="action-button">清除日志</button>
</div>
<div id="log-section">
<h3>操作日志</h3>
<div id="log-container"></div>
</div>
<div class="contact-info">
<span onclick="copyToClipboard('3200437464')">联系方式QQ:3200437464</span><br><br>
<span onclick="copyToClipboard('1044568375')">加入官方Q聊:1044568375</span>
</div>
</div>
<div id="log-container"></div>
</div>
`;
document.body.appendChild(popup);
const toast = document.createElement('div');
toast.id = 'toast';
document.body.appendChild(toast);
const navButtons = document.querySelectorAll('#popup-nav button');
const tabContents = document.querySelectorAll('.tab-content');
navButtons.forEach(button => {
button.addEventListener('click', () => {
const tab = button.getAttribute('data-tab');
navButtons.forEach(btn => btn.classList.remove('active'));
tabContents.forEach(content => content.classList.remove('active'));
button.classList.add('active');
document.querySelector(`#tab-${tab}`).classList.add('active');
});
});
const closeButton = document.getElementById('popup-close');
closeButton.addEventListener('click', () => {
popup.style.display = 'none';
});
document.addEventListener('keydown', (e) => {
if (e.key === 'F9') {
popup.style.display = 'none';
}
});
let isDragging = false;
let offsetX, offsetY;
const header = document.getElementById('popup-header');
header.addEventListener('mousedown', (e) => {
isDragging = true;
offsetX = e.clientX - popup.offsetLeft;
offsetY = e.clientY - popup.offsetTop;
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
popup.style.left = `${e.clientX - offsetX}px`;
popup.style.top = `${e.clientY - offsetY}px`;
});
document.addEventListener('mouseup', () => {
isDragging = false;
});
const courseSearchInput = document.getElementById('course-search-input');
const courseSearchButton = document.getElementById('course-search-button');
const courseResetButton = document.getElementById('course-reset-button');
const courseResult = document.getElementById('course-result');
courseSearchButton.addEventListener('click', () => {
const query = courseSearchInput.value.trim();
if (query) {
searchCourse(query);
} else {
courseResult.textContent = '查询不到课程:联系站长添加:3200437464';
}
});
courseResetButton.addEventListener('click', () => {
courseSearchInput.value = '';
courseResult.textContent = '';
});
function searchCourse(query) {
const validCourses = ['学习通', '智慧树', 'U校园','知道','智慧职教','U校园','U校园ai','U校园AI','青书学堂','柠檬','雨课堂','超星学习通','乐跑','学起Plus'];
if (validCourses.includes(query)) {
courseResult.textContent = `查询成功!正在获取 ${query} 的课程ID,请稍等...`;
} else {
courseResult.textContent = '未找到相关课程,请联系站长';
}
}
const optionsContainer = document.querySelector('.options-container');
let draggedItem = null;
optionsContainer.addEventListener('dragstart', (e) => {
draggedItem = e.target.closest('.sortable-item');
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/html', draggedItem.outerHTML);
});
optionsContainer.addEventListener('dragover', (e) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
const targetItem = e.target.closest('.sortable-item');
if (targetItem && targetItem !== draggedItem) {
const rect = targetItem.getBoundingClientRect();
const middleX = rect.left + rect.width / 2;
if (e.clientX > middleX) {
optionsContainer.insertBefore(draggedItem, targetItem.nextSibling);
} else {
optionsContainer.insertBefore(draggedItem, targetItem);
}
}
});
optionsContainer.addEventListener('drop', (e) => {
e.preventDefault();
});
const exampleSortButton = document.createElement('button');
exampleSortButton.textContent = '示例排序';
exampleSortButton.style.marginBottom = '10px'; /* 添加底部间距以便换行 */
exampleSortButton.addEventListener('click', () => {
sortExampleFeatures();
});
document.querySelector('.options-container').parentNode.insertBefore(exampleSortButton, exampleSortButton.nextSibling);
function sortExampleFeatures() {
const items = Array.from(optionsContainer.children);
items.sort((a, b) => {
const aValue = a.querySelector('input[name="features"]').value;
const bValue = b.querySelector('input[name="features"]').value;
const order = ['chapter-fetch', 'quiz-settings']; // 示例排序顺序
return order.indexOf(aValue) - order.indexOf(bValue);
});
items.forEach(item => optionsContainer.appendChild(item));
}
const aiModelSelect = document.querySelector('.ai-model-select');
exampleSortButton.parentNode.insertBefore(aiModelSelect, exampleSortButton.nextSibling);
const apiKeyInput = document.querySelector('.key-input');
aiModelSelect.parentNode.insertBefore(apiKeyInput, aiModelSelect.nextSibling);
const sortableItems = document.querySelectorAll('.sortable-item');
sortableItems.forEach(item => {
item.addEventListener('click', (e) => {
if (e.target.tagName.toLowerCase() !== 'input') {
const checkbox = item.querySelector('input[type="checkbox"]');
checkbox.checked = !checkbox.checked;
}
});
});
const playButton = document.getElementById('play-button');
playButton.addEventListener('click', () => {
const resultMessage = document.getElementById('course-result');
resultMessage.textContent = '正在读取课程信息...';
setTimeout(() => {
resultMessage.textContent = '读取失败,请检查配置...';
}, 1000);
logMessage('正在读取课程信息...', 'info');
setTimeout(() => {
logMessage('读取失败,请检查配置...', 'error');
}, 1000);
});
const verifyButton = document.getElementById('verify-button');
verifyButton.addEventListener('click', () => {
const apiKey = document.getElementById('api-key').value.trim();
if (apiKey) {
showToast('请稍等,正在加载...');
logMessage('请稍等,正在加载...', 'info');
setTimeout(() => {
showToast('加载失败');
logMessage('加载失败', 'error');
}, 60000); // 1分钟后显示加载失败的消息
} else {
showToast('请输入API Key');
logMessage('请输入API Key', 'error');
}
});
const pauseButton = document.getElementById('pause-button');
pauseButton.addEventListener('click', () => {
showToast('已暂停答题');
logMessage('已暂停答题', 'success');
});
const restartButton = document.getElementById('restart-button');
restartButton.addEventListener('click', () => {
showToast('正在重新播放...');
logMessage('正在重新播放...', 'info');
});
const importButton = document.getElementById('import-button');
importButton.addEventListener('click', () => {
window.open('http://a.zhuxuelo.top/index/chaxun', '_blank');
logMessage('正在跳转到官方网...', 'info');
});
// 获取到的课程按钮逻辑
const getCoursesButton = document.getElementById('get-courses-button');
getCoursesButton.addEventListener('click', () => {
const htmlContent = document.documentElement.outerHTML;
console.log(htmlContent);
showToast('加载当前页面课程,请查看控制台');
logMessage('加载到课程{ID},请选择课程', 'success');
});
const printLogButton = document.getElementById('print-log-button');
printLogButton.addEventListener('click', () => {
const logContainer = document.getElementById('log-container');
logContainer.innerHTML = ''; // 清空日志容器
logMessage('操作日志已清空', 'info');
});
function logMessage(message, type) {
const logContainer = document.getElementById('log-container');
const logEntry = document.createElement('div');
logEntry.className = `log-entry log-${type}`;
logEntry.textContent = message;
logContainer.appendChild(logEntry);
}
function showToast(message) {
const toastElement = document.getElementById('toast');
toastElement.textContent = message;
toastElement.style.display = 'block';
setTimeout(() => {
toastElement.style.display = 'none';
}, 5000); // 3秒后隐藏 toast
}
window.copyToClipboard = function(text) {
navigator.clipboard.writeText(text).then(() => {
showToast(`${text} 已复制到剪贴板`);
logMessage(`${text} 已复制到剪贴板`, 'success');
}).catch(err => {
showToast(`复制失败: ${err}`);
logMessage(`复制失败: ${err}`, 'error');
});
};
const style = document.createElement('style');
style.innerHTML = `
#custom-popup {
position: fixed;
top: 0;
left: 0;
width: 300px !important;
height: 500px !important;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.3);
z-index: 99999;
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
}
#popup-header {
padding: 5px 15px;
background-color: #ffcccc;
color: black;
font-size: 14px;
height: 40px;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
cursor: move;
display: flex;
justify-content: space-between;
align-items: center;
font-family: SimSun, serif;
font-weight: bold;
}
#popup-avatar {
width: 30px;
height: 30px;
border-radius: 50%;
margin-right: 10px;
}
#popup-close {
background: none;
border: none;
color: white;
font-size: 16px;
cursor: pointer;
}
#popup-nav {
display: flex;
background-color: #d3d3d3;
}
#popup-nav button {
flex: 1;
padding: 10px;
border: none;
background: none;
cursor: pointer;
font-weight: bold;
font-size: 12px;
color: #2f4f4f;
outline: none;
transition: outline 0.3s ease;
}
#popup-nav button:focus,
#popup-nav button:hover {
outline: 2px solid #2f4f4f;
}
#popup-nav button.active {
background-color: #2f4f4f;
color: white;
outline: none;
}
#popup-content {
flex: 1;
padding: 10px;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
#log-container {
margin-top: 10px;
max-height: 100px;
overflow-y: auto;
border-top: 1px solid #ccc;
padding-top: 10px;
}
.search-bar {
display: flex;
margin-bottom: 10px;
}
.search-bar input {
flex: 1;
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
}
.search-bar button {
margin-left: 5px;
padding: 5px 10px;
border: none;
background-color: #2f4f4f;
color: white;
border-radius: 4px;
cursor: pointer;
}
.search-bar button:hover {
background-color: #4a7c7c;
}
.result-message {
margin-top: 10px;
color: red; /* 设置结果消息为红色 */
}
.options-container {
margin-top: 10px;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.options-container label {
display: flex;
align-items: center;
}
.options-container input[type="checkbox"] {
margin-right: 5px;
}
.sortable-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 5px;
cursor: grab;
border-radius: 4px;
transition: background-color 0.3s ease;
}
.sortable-item:active {
cursor: grabbing;
}
.sortable-item:hover {
background-color: #e0e0e0;
}
.ai-model-select {
margin-top: 10px;
}
.ai-model-select select {
width: 100%;
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
}
.bold-text {
font-weight: bold;
}
.key-input {
margin-top: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.key-input input {
flex: 1;
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
}
.verify-button {
margin-left: 10px;
padding: 5px 10px;
border: none;
background-color: #2f4f4f;
color: white;
border-radius: 4px;
cursor: pointer;
}
.verify-button:hover {
background-color: #4a7c7c;
}
.play-button {
margin-top: 10px;
padding: 5px 10px;
border: none;
background-color: #2f4f4f;
color: white;
border-radius: 4px;
cursor: pointer;
}
.play-button:hover {
background-color: #4a7c7c;
}
#toast {
position: fixed;
bottom: 20px;
right: 20px;
background-color: rgba(255, 255, 255, 0.8);
border: 1px solid #ccc;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.3);
z-index: 100000;
padding: 10px;
text-align: center;
color: red;
display: none;
}
.action-buttons {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.action-button {
width: 100px;
height: 35px;
padding: 0;
border: none;
background-color: #2f4f4f;
color: white;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 10px;
}
.action-button:hover {
background-color: #4a7c7c;
}
.import-button {
background-color: red !important;
}
.import-button:hover {
background-color: darkred !important;
}
.course-button {
background-color: #4CAF50 !important;
}
.course-button:hover {
background-color: #45a049 !important;
}
.log-entry {
margin: 5px 0;
}
.log-info {
color: blue;
}
.log-success {
color: green;
}
.log-error {
color: red;
}
.contact-info {
margin-top: 20px;
}
.contact-info span {
cursor: pointer;
color: blue;
text-decoration: underline;
}
.contact-info span:hover {
text-decoration: none;
}
`;
document.head.appendChild(style);
})();