// ==UserScript==
// @name 芯位教育新界面自动下一集,自动答题
// @namespace https://github.com/poi-yee/51xinweiauto
// @version 0.3.15
// @description 新版界面的芯位自动下一集也能自动刷作业(自动刷作业失效了,无法获取到答案了
// @author PoiYee,Code-dogcreatior
// @match *://*.51xinwei.com/*
// @icon *://*.51xinwei.com/*
// @grant none
// @run-at document-end
// @license GPL License
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// 创建控制面板
var controlPanel = document.createElement('div');
controlPanel.innerHTML = `
`;
document.body.appendChild(controlPanel);
// 控制面板拖动功能
var isDragging = false;
var offsetX, offsetY;
var controlPanelElement = document.getElementById('controlPanel');
controlPanelElement.addEventListener('mousedown', function(event) {
isDragging = true;
offsetX = event.clientX - controlPanelElement.getBoundingClientRect().left;
offsetY = event.clientY - controlPanelElement.getBoundingClientRect().top;
});
document.addEventListener('mousemove', function(event) {
if (isDragging) {
var x = event.clientX - offsetX;
var y = event.clientY - offsetY;
controlPanelElement.style.left = x + 'px';
controlPanelElement.style.top = y + 'px';
}
});
document.addEventListener('mouseup', function() {
isDragging = false;
});
// 控制面板默认显示在网页的右下角
window.addEventListener('load', function() {
var windowHeight = window.innerHeight;
var windowWidth = window.innerWidth;
controlPanelElement.style.left = windowWidth - controlPanelElement.offsetWidth - 20 + 'px';
controlPanelElement.style.top = windowHeight - controlPanelElement.offsetHeight - 20 + 'px';
});
// 创建全屏覆盖的页面
var aboutPage = document.createElement('div');
aboutPage.id = 'aboutPage';
aboutPage.style.cssText = 'display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 2000;';
aboutPage.innerHTML = `
`;
document.body.appendChild(aboutPage);
// 倒计时函数
var countdownInterval;
function startCountdown() {
clearInterval(countdownInterval); // 清除之前的定时器
var timeLeft = 0;
var countdownElement = document.getElementById('countdown');
var agreeCheckbox = document.getElementById('agreeCheckbox');
countdownInterval = setInterval(function() {
if (timeLeft <= 0) {
clearInterval(countdownInterval);
countdownElement.innerHTML = '';
agreeCheckbox.disabled = false;
document.getElementById('closeAboutPageButton').disabled = false;
} else {
countdownElement.innerHTML = '倒计时: ' + timeLeft + ' 秒';
timeLeft--;
}
}, 1000);
}
// 关于按钮点击事件
var aboutButton = document.getElementById('aboutButton');
aboutButton.addEventListener('click', function() {
document.getElementById('aboutPage').style.display = 'block';
startCountdown(); // 开始倒计时
});
// 关闭关于页面按钮点击事件
var closeAboutPageButton = document.getElementById('closeAboutPageButton');
closeAboutPageButton.addEventListener('click', function() {
document.getElementById('aboutPage').style.display = 'none';
clearInterval(countdownInterval); // 清除倒计时
var agreeCheckbox = document.getElementById('agreeCheckbox'); // 获取“我已同意以上条款并已诚信付款”复选框元素
var autoAnswerSwitch = document.getElementById('autoAnswerSwitch'); // 获取“自动答题”复选框元素
localStorage.setItem('agreedTerms', agreeCheckbox.checked); // 存储按钮状态
// 启用或禁用“自动答题”按钮
autoAnswerSwitch.disabled = !agreeCheckbox.checked;
// 如果用户同意条款并启用了自动答题功能,则存储其状态
if (agreeCheckbox.checked) {
autoAnswerEnabled = autoAnswerSwitch.checked;
localStorage.setItem('autoAnswerEnabled', autoAnswerEnabled);
} else {
// 如果用户取消同意条款,则同时取消勾选自动答题按钮
autoAnswerSwitch.checked = false;
localStorage.setItem('autoAnswerEnabled', false);
}
});
// 检查本地存储中的状态并更新按钮状态
var agreeCheckbox = document.getElementById('agreeCheckbox');
var autoAnswerSwitch = document.getElementById('autoAnswerSwitch');
if (localStorage.getItem('agreedTerms') === 'true') {
agreeCheckbox.checked = true;
autoAnswerSwitch.disabled = false; // 如果已同意条款,启用“自动答题”按钮
// 如果用户已同意条款并启用了自动答题功能,则更新自动答题按钮状态
if (localStorage.getItem('autoAnswerEnabled') === 'true') {
autoAnswerSwitch.checked = true;
}
} else {
startCountdown(); // 开始倒计时
autoAnswerSwitch.disabled = true; // 如果未同意条款,禁用“自动答题”按钮
}
// 恢复开关状态
var autoClickAndMoveEnabled = localStorage.getItem('autoClickAndMoveEnabled') === 'true';
var autoMuteEnabled = localStorage.getItem('autoMuteEnabled') === 'true';
var autoAnswerEnabled = localStorage.getItem('autoAnswerEnabled') === 'true';
document.getElementById('autoClickAndMoveSwitch').checked = autoClickAndMoveEnabled;
document.getElementById('autoMuteSwitch').checked = autoMuteEnabled;
document.getElementById('autoAnswerSwitch').checked = autoAnswerEnabled;
// 监听开关变化并保存状态
document.getElementById('autoClickAndMoveSwitch').addEventListener('change', function() {
autoClickAndMoveEnabled = this.checked;
localStorage.setItem('autoClickAndMoveEnabled', autoClickAndMoveEnabled);
});
document.getElementById('autoMuteSwitch').addEventListener('change', function() {
autoMuteEnabled = this.checked;
localStorage.setItem('autoMuteEnabled', autoMuteEnabled);
});
document.getElementById('autoAnswerSwitch').addEventListener('change', function() {
autoAnswerEnabled = this.checked;
localStorage.setItem('autoAnswerEnabled', autoAnswerEnabled);
});
// 检查当前网页URL是否匹配
if (!/^https:\/\/www\.51xinwei\.com\/student\/#\/courseInfo\//.test(window.location.href)) {
console.log('脚本已停止,当前网页不匹配指定的URL。');
return;
}
// 自动下一集并模拟鼠标移动
function autoClickAndMove() {
if (!autoClickAndMoveEnabled) return;
var nextChapterButton = document.querySelector('.button-box > .left');
if (nextChapterButton) {
nextChapterButton.click();
console.log('Next chapter button clicked.');
}
// 模拟鼠标移动
}
// 每分钟执行一次点击和模拟鼠标移动
setInterval(autoClickAndMove, 60000); // 60秒 * 1000 毫秒
// 使用 MutationObserver 监听 DOM 变化,以备不时之需
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
// element added to DOM
autoClickAndMove();
// 检查是否有视频元素
var videoElement = document.querySelector('video');
if (videoElement && autoMuteEnabled) {
// 检查静音按钮的标题是否为 "静音"
var muteButton = document.querySelector('.vjs-mute-control');
if (muteButton && muteButton.getAttribute('title') === '静音') {
// 如果静音按钮的标题为 "静音",则点击它
muteButton.click();
console.log('Video muted.');
}
}
}
});
});
var config = {
childList: true,
subtree: true
};
observer.observe(document.body, config);
// 单选题和判断题的按钮JS路径
var singleChoiceButtonSelectors = {
'A': "label:nth-child(1) > span.el-radio__input > span",
'B': "label:nth-child(2) > span.el-radio__input > span",
'C': "label:nth-child(3) > span.el-radio__input > span",
'D': "label:nth-child(4) > span.el-radio__input > span",
'E': "label:nth-child(5) > span.el-radio__input > span",
'T': "label:nth-child(1) > span.el-radio__input > span",
'F': "label:nth-child(2) > span.el-radio__input > span"
};
// 多选题的按钮JS路径
var multipleChoiceButtonSelectors = {
'A': "label:nth-child(1) > span.el-checkbox__input > span",
'B': "label:nth-child(2) > span.el-checkbox__input > span",
'C': "label:nth-child(3) > span.el-checkbox__input > span",
'D': "label:nth-child(4) > span.el-checkbox__input > span",
'E': "label:nth-child(5) > span.el-checkbox__input > span",
'F': "label:nth-child(6) > span.el-checkbox__input > span",
'G': "label:nth-child(7) > span.el-checkbox__input > span"
};
// 下一题按钮的JS路径
var nextButtonSelector = "#app > section > main > div > div > div.loading-container > div.content-area > div.content > div.toggle-box > button:nth-child(2)";
// 延迟函数
function delay(duration) {
return new Promise(resolve => setTimeout(resolve, duration));
}
// 模拟点击函数
async function simulateClick(selector) {
await delay(500); // 延迟0.5秒
var button = document.querySelector(selector);
if (button) {
button.click();
console.log('Clicked:', selector);
} else {
console.log('Button not found for selector:', selector);
}
}
// 监听XHR请求
window.addEventListener('load', function() {
console.log('Script loaded successfully.');
var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.log('XHR open event triggered.');
this.addEventListener('load', async function() {
console.log('XHR load event triggered.');
if (this.responseURL && this.responseURL.includes('/api/learning-service/xinwei_exam/student/unSubmit/')) {
console.log('XHR URL matched:', this.responseURL);
var responseData = JSON.parse(this.responseText);
if (responseData && responseData.code === 200 && responseData.data) {
console.log('XHR 响应数据:', responseData.data);
await processHomework(responseData.data);
} else {
console.log('XHR response data is invalid or incomplete.');
}
} else if (this.responseURL && this.responseURL.includes('/api/learning-service/admin/studentLearning/getHomeworkPaperDetail/')) {
// 处理旧的API端点
console.log('Old XHR URL matched:', this.responseURL);
var oldResponseData = JSON.parse(this.responseText);
if (oldResponseData && oldResponseData.code === 200 && oldResponseData.data) {
console.log('Old XHR 响应数据:', oldResponseData.data);
await processOldHomework(oldResponseData.data);
} else {
console.log('Old XHR response data is invalid or incomplete.');
}
} else {
console.log('XHR URL did not match the required pattern.');
}
});
open.apply(this, arguments);
};
});
// 自动答题主处理函数
async function processHomework(homeworkData) {
if (!autoAnswerEnabled) return;
await delay(3000); // 开始答题前延迟3秒
for (const topic of homeworkData.questionAndAnswerList) {
var buttonSelectors = topic.topicType === 'duoxuan' ? multipleChoiceButtonSelectors : singleChoiceButtonSelectors;
var correctAnswers = topic.topicQuestionCoreDtoList.filter(q => q.isAnswer);
for (const answer of correctAnswers) {
var buttonSelector = buttonSelectors[answer.index];
if (buttonSelector) {
await simulateClick(buttonSelector);
}
}
// 点击下一题按钮
await simulateClick(nextButtonSelector);
}
// 自动答题完成后弹出提示框
alert('自动答题已完成!请务必核对答案是否全部填入且答案是否合理!');
}
// 处理旧作业的函数
async function processOldHomework(oldHomeworkData) {
if (!autoAnswerEnabled) return;
await delay(3000); // 开始答题前延迟3秒
for (const topic of oldHomeworkData.homeworkTopicList) {
var buttonSelectors = topic.topicType === 'duoxuan' ? multipleChoiceButtonSelectors : singleChoiceButtonSelectors;
var correctAnswers = topic.topicQuestionCoreDtoList.filter(q => q.isAnswer);
for (const answer of correctAnswers) {
var buttonSelector = buttonSelectors[answer.index];
if (buttonSelector) {
await simulateClick(buttonSelector);
}
}
// 点击下一题按钮
await simulateClick(nextButtonSelector);
}
// 自动答题完成后弹出提示框
alert('自动答题已完成!请务必核对答案是否全部填入且答案是否合理!');
}
})();