// ==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 + "&section=" + 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("============================================");
})();


点赞(0)

备注