// ==UserScript==
// @name 记者之家合体版2.0 修复版(改进)
// @namespace http://tampermonkey.net/
// @version 2.3
// @description 自动回答记者之家的问题和视频操作(修复章节跳转逻辑)
// @author You
// @match *://jzzj-h5.zgjx.cn/*
// @match *://*.zgjx.cn/*
// @match *://*/*
// @grant GM_xmlhttpRequest
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
console.log("============================================");
console.log("记者之家自动答题脚本已启动!");
console.log("当前网址:", window.location.href);
console.log("============================================");
// 检查视频是否正在播放,并快速跳转
function isVideoPlaying() {
var videos = document.getElementsByTagName("video");
console.log("找到视频数量:", videos.length);
for (var i = 0; i < videos.length; i++) {
console.log("视频" + i + "状态 - 暂停:", videos[i].paused, "当前时间:", videos[i].currentTime, "总时长:", videos[i].duration);
if (!videos[i].paused) {
console.log("✓ 视频正在播放!当前时间:", videos[i].currentTime, "总时长:", videos[i].duration);
// 如果视频还没接近结尾,就跳转到结尾
if (videos[i].currentTime < videos[i].duration - 2) {
var targetTime = videos[i].duration - 1;
videos[i].currentTime = targetTime;
console.log("✓ 已跳转到:", targetTime);
}
return true;
}
}
return false;
}
// 自动关闭完成弹窗
function closeCompletionPopup() {
var closeSelectors = [
'.close_btn',
'.uni-icons.uniui-closeempty',
'[class*="close"]',
'.popup-content .close_btn',
'uni-view[class*="close"]'
];
for (var i = 0; i < closeSelectors.length; i++) {
var closeBtn = document.querySelector(closeSelectors[i]);
if (closeBtn) {
console.log("✓ 找到关闭按钮,准备点击:", closeSelectors[i]);
setTimeout(function() {
closeBtn.click();
console.log("✓ 已点击关闭按钮");
// 关闭弹窗后,尝试跳转下一课程
setTimeout(jumpToNextCourse, 1500);
}, 500);
return true;
}
}
var popup = document.querySelector('.uni-popup, .popup-content, [class*="popup"]');
if (popup && popup.style.display !== 'none') {
console.log("✓ 发现弹窗,查找关闭按钮");
var closeBtnInPopup = popup.querySelector('[class*="close"], .uni-icons');
if (closeBtnInPopup) {
setTimeout(function() {
closeBtnInPopup.click();
console.log("✓ 已点击弹窗内的关闭按钮");
// 关闭弹窗后,尝试跳转下一课程
setTimeout(jumpToNextCourse, 1500);
}, 500);
return true;
}
}
return false;
}
// 检测视频是否结束
var lastVideoEndCheck = 0;
function checkVideoEnded() {
var videos = document.getElementsByTagName("video");
if (videos.length > 0) {
var video = videos[0];
// 如果视频暂停且已到结尾(或接近结尾)
if (video.paused && video.currentTime >= video.duration - 2) {
var now = Date.now();
// 防止重复触发,5秒内只触发一次
if (now - lastVideoEndCheck > 5000) {
lastVideoEndCheck = now;
console.log("📹 视频已结束,准备跳转下一课程");
setTimeout(jumpToNextCourse, 2000);
}
}
}
}
// 定期检查是否有视频在播放(3秒检查一次)
console.log("开始定时检查视频状态...");
setInterval(function() {
var isPlaying = isVideoPlaying();
console.log("=> 是否有视频在播放:", isPlaying);
closeCompletionPopup();
autoStartFirstCourse();
checkVideoEnded(); // 检查视频是否结束
}, 3000);
/** 自动开始第一个课程 */
function autoStartFirstCourse() {
const current = document.querySelector('.course_houre_item_current');
if (current) return; // 已在学习中
const first = document.querySelector('.course_houre_item');
if (first) {
console.log("📖 自动开始第一个课程");
first.click();
}
}
/**
* 改进的跳转逻辑:
* 1. 先检查当前章节下是否还有未完成的子课程
* 2. 如果当前章节全部完成,再跳转到未学课程列表的下一个章节
*/
function jumpToNextCourse() {
console.log("🔍 开始检查下一个课程...");
// 1. 先检查当前章节内的课程列表
var currentChapterCourses = document.querySelectorAll('.course_bottom_container .group_6');
console.log("当前章节共有", currentChapterCourses.length, "个子课程");
if (currentChapterCourses.length === 0) {
console.log("⚠️ 未找到当前章节的课程列表,可能不在学习页面");
return;
}
// 查找当前章节中未完成的课程
var nextUnfinishedCourse = null;
currentChapterCourses.forEach(function(course, index) {
// 检查进度条,寻找未完成的课程(进度不是100%)
var progressText = course.querySelector('.font_3');
if (progressText) {
var progressValue = progressText.innerText.trim();
console.log("第", index + 1, "个课程进度:", progressValue);
// 如果进度不是100%,且还没找到未完成课程,就记录这个
if (progressValue !== '100%' && !nextUnfinishedCourse) {
nextUnfinishedCourse = course;
console.log("✓ 找到当前章节未完成的课程(第", index + 1, "个)");
}
}
});
// 2. 如果当前章节还有未完成课程,点击它
if (nextUnfinishedCourse) {
console.log("➡️ 继续学习当前章节的下一个课程");
setTimeout(function() {
nextUnfinishedCourse.scrollIntoView({ behavior: "smooth", block: "center" });
nextUnfinishedCourse.click();
console.log("✅ 已点击当前章节的下一个课程");
}, 800);
return;
}
// 3. 如果当前章节全部完成,才跳转到未学课程列表
console.log("🎉 当前章节全部完成!查找下一个章节...");
var nextChapter = document.querySelector('.my_class_container .new_course_item');
if (nextChapter) {
console.log("➡️ 检测到未学章节,自动跳转中...");
setTimeout(function() {
nextChapter.scrollIntoView({ behavior: "smooth", block: "center" });
nextChapter.click();
var chapterTitle = nextChapter.querySelector('.new_course_title');
var title = chapterTitle ? chapterTitle.innerText.trim().slice(0, 30) : "未知章节";
console.log("✅ 已点击下一个章节:", title);
}, 800);
} else {
console.log("🟢 所有课程已完成!");
}
}
// 检查页面是否存在 dati_container 类
function checkForDatiContainer() {
var datiContainer = document.querySelector('.dati_container[style*="display: block"], .dati_container:not([style*="display: none"])');
if (datiContainer) {
console.log("发现 dati_container,执行答题逻辑");
var currentURL = window.location.href;
console.log(currentURL);
var urlParts = currentURL.split('/');
var courseIdIndex = urlParts.indexOf('learning-course') + 1;
var courseId = null;
if (courseIdIndex > 0 && courseIdIndex < urlParts.length) {
var courseIdWithQuery = urlParts[courseIdIndex];
courseId = courseIdWithQuery.split('=')[1];
console.log("课程ID:", courseId);
} else {
console.log("未找到课程ID");
return;
}
var section = 1;
var videoItems = document.querySelectorAll('.course_houre_item');
videoItems.forEach(function(videoItem, index) {
var isCurrent = videoItem.classList.contains('course_houre_item_current');
if (isCurrent) {
section = index + 1;
console.log("当前正在播放的是第", section, "个视频");
}
});
var token = localStorage.getItem('token');
console.log('从 Local Storage 中获取的 token:', token);
GM_xmlhttpRequest({
method: "GET",
url: "https://jzzj-api.zgjx.cn/api/course_questions?course_id=" + courseId + "§ion=" + section,
headers: {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "https://jzzj-h5.zgjx.cn",
"Referer": "https://jzzj-h5.zgjx.cn/",
"Token": token,
"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 MicroMessenger/6.0.2.56_r958800.520 NetType/WIFI"
},
onload: function(response) {
console.log("API响应:", response.responseText);
try {
var quizData = JSON.parse(response.responseText);
processQuizData(quizData);
} catch (e) {
console.error("解析响应失败:", e);
}
},
onerror: function(error) {
console.error("获取问题数据时出错:", error);
}
});
}
}
// 处理问题数据并选择正确答案的函数
function processQuizData(quizData) {
console.log("开始处理问题数据:", quizData);
if (!quizData.data || quizData.data.length === 0) {
console.log("没有问题数据");
// 没有问题时,尝试跳转下一个课程
setTimeout(jumpToNextCourse, 1000);
return;
}
var question = quizData.data[0];
console.log("问题信息:", question);
var correctAnswers = question.item.filter(function(option) {
return option.answer === "1";
});
console.log("正确答案:", correctAnswers);
setTimeout(function() {
var selectors = [
'.daan_item',
'[class*="daan"]',
'[class*="option"]',
'[class*="answer"]'
];
var answerOptions = null;
for (var i = 0; i < selectors.length; i++) {
answerOptions = document.querySelectorAll(selectors[i]);
if (answerOptions.length > 0) {
console.log("使用选择器找到选项:", selectors[i], answerOptions.length);
break;
}
}
if (!answerOptions || answerOptions.length === 0) {
console.log("未找到答案选项元素");
var clickableElements = document.querySelectorAll('[class*="item"], [class*="option"]');
console.log("可能的选项元素:", clickableElements);
}
answerOptions.forEach(function(option) {
var optionText = option.innerText || option.textContent || '';
var textElement = option.querySelector('.text, [class*="text"], span, div');
if (textElement) {
optionText = textElement.innerText || textElement.textContent || optionText;
}
console.log("检查选项:", optionText.trim());
correctAnswers.forEach(function(correctAnswer) {
if (optionText.trim() === correctAnswer.option.trim()) {
console.log("找到正确答案,点击:", optionText.trim());
option.click();
}
});
});
setTimeout(function() {
var submitSelectors = [
'.dati_submit',
'[class*="submit"]',
'button[class*="submit"]',
'[class*="提交"]'
];
var submitButton = null;
for (var i = 0; i < submitSelectors.length; i++) {
submitButton = document.querySelector(submitSelectors[i]);
if (submitButton) {
console.log("找到提交按钮,使用选择器:", submitSelectors[i]);
submitButton.click();
console.log("已点击提交按钮");
// 提交后等待一段时间再跳转下一个课程
setTimeout(jumpToNextCourse, 2000);
break;
}
}
if (!submitButton) {
console.log("未找到提交按钮");
}
}, 500);
}, 1000);
}
console.log("记者之家视频加速脚本加载完成!");
console.log("============================================");
})();