// ==UserScript==
// @name 智慧树刷课脚本(增强版)
// @namespace http://tampermonkey.net/
// @version 2.0
// @description 智慧树自动刷课程序,支持自动获取课程信息和控制功能
// @author Anony
// @match http://www.learning.mil.cn/student/study
// @grant GM_xmlhttpRequest
// @connect armystudy.zhihuishu.com
// @connect www.learning.mil.cn
// @run-at document-end
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
let courses = [];
let currentTask = null;
// 添加控制面板
function addPanel() {
const panel = document.createElement('div');
panel.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #fff;
padding: 15px;
border: 1px solid #ccc;
border-radius: 5px;
z-index: 9999;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
width: 300px;
`;
const panelHTML = `
`;
panel.innerHTML = panelHTML;
document.body.appendChild(panel);
}
// 获取课程列表
async function fetchCourseList() {
try {
const response = await makeRequest('http://www.learning.mil.cn/api/web/student/enrollment/course/?limit=7&offset=0', {
method: 'GET',
headers: {
'Cookie': document.cookie
}
});
courses = response.results.filter(course => course.platform === 33); // 只保留智慧树课程
updateCourseList();
} catch (error) {
addLog('获取课程列表失败: ' + error.message);
}
}
// 更新课程列表显示
function updateCourseList() {
const courseListElement = document.getElementById('courseList');
if (!courseListElement) return;
courseListElement.innerHTML = courses.map((course, index) => `
${course.course_title}
进度: ${course.learned_process}
`).join('');
// 添加按钮事件监听
courses.forEach((_, index) => {
const btn = document.getElementById(`courseBtn_${index}`);
if (btn) {
btn.addEventListener('click', () => toggleCourse(index));
}
});
}
// 切换课程状态
function toggleCourse(index) {
if (currentTask && currentTask.courseIndex === index) {
// 停止当前任务
currentTask = null;
updateCourseList();
addLog(`停止处理课程: ${courses[index].course_title}`);
} else {
// 开始新任务
if (currentTask) {
currentTask = null;
updateCourseList();
}
const course = courses[index];
currentTask = {
courseIndex: index,
userId: course.user_id,
courseId: course.course_id
};
updateCourseList();
addLog(`开始处理课程: ${course.course_title}`);
zhihuishu(course.user_id, course.course_id);
}
}
// 添加日志
function addLog(message) {
const logElement = document.getElementById('log');
if (logElement) {
const logEntry = document.createElement('div');
logEntry.style.marginBottom = '5px';
logEntry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
logElement.insertBefore(logEntry, logElement.firstChild);
}
}
// 更新状态显示
function updateStatus(message) {
const statusElement = document.getElementById('status');
if (statusElement) {
statusElement.textContent = message;
}
addLog(message);
}
// 使用GM_xmlhttpRequest进行请求
function makeRequest(url, options) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: options.method || 'GET',
url: url,
headers: options.headers || {},
data: options.body,
responseType: 'json',
onload: function(response) {
if (response.status >= 200 && response.status < 300) {
resolve(response.response);
} else {
reject(new Error('请求失败: ' + response.status));
}
},
onerror: function(error) {
reject(error);
}
});
});
}
// 主处理函数
async function zhihuishu(userId, courseId) {
if (!currentTask) return;
const queryUrl = `http://armystudy.zhihuishu.com/armystudy/queryChapterInfos?userId=${userId}&courseId=${courseId}&ts&token`;
const setWichTime = 'http://armystudy.zhihuishu.com/armystudy/stuRecord';
try {
updateStatus('正在获取课程信息...');
const chapterInfo = await makeRequest(queryUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
userId: userId.toString(),
courseId: courseId.toString()
}).toString()
});
if (!chapterInfo.chapterInfoDtoList) {
throw new Error('获取课程信息失败,请检查ID是否正确');
}
const chapterInfoDtoList = chapterInfo.chapterInfoDtoList;
let totalLessons = 0;
let completedLessons = 0;
// 计算总课程数
chapterInfoDtoList.forEach(chapter => {
totalLessons += chapter.lessonInfoDtos.length;
});
// 处理每个章节
for (const chapter of chapterInfoDtoList) {
if (!currentTask) return; // 检查是否已停止
for (const lesson of chapter.lessonInfoDtos) {
if (!currentTask) return; // 检查是否已停止
const videoTime = lesson.videoTime;
let s = videoTime.split(':')[0];
let watchTime = 0;
if (s.startsWith('0')) {
watchTime = (parseInt(s.replace('0', '')) + 1) * 60;
} else {
watchTime = (parseInt(s) + 1) * 60;
}
let hh = Math.floor(watchTime / 3);
// 处理每个视频
for (let i = 0; i < 3; i++) {
if (!currentTask) return; // 检查是否已停止
updateStatus(`正在处理: ${lesson.lessonName} (${++completedLessons}/${totalLessons}课)`);
addLog(`视频--${lesson.lessonName}--观看进度: ${i + 1}/3`);
const formData = new URLSearchParams({
userId: userId.toString(),
courseId: courseId.toString(),
videoId: lesson.videoId.toString(),
exitwatchTime: '0',
lessonId: lesson.lessonId.toString(),
measureId: lesson.measureId.toString(),
videoNum: '53',
watchTime: hh.toString()
}).toString();
const result = await makeRequest(setWichTime, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: formData
});
addLog(`视频--${lesson.lessonName}--观看结果: ${JSON.stringify(result)}`);
hh++;
// 添加随机延时(2-4秒)
await new Promise(resolve => setTimeout(resolve, 2000 + Math.random() * 2000));
}
}
}
addLog('课程处理完成!');
updateStatus('完成!');
currentTask = null;
updateCourseList();
} catch (error) {
console.error('处理过程中出错:', error);
addLog('处理过程中出错: ' + error.message);
updateStatus('出错: ' + error.message);
currentTask = null;
updateCourseList();
}
}
// 初始化
addPanel();
fetchCourseList();
})();