Greasy Fork 还支持 简体中文。

智慧树半自动刷课(动态标题和一次性通知)

根据 XPath 设置标签页标题和一次性通知

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         智慧树半自动刷课(动态标题和一次性通知)
// @version      0.9.2
// @description  根据 XPath 设置标签页标题和一次性通知
// @match        *://hike.zhihuishu.com/aidedteaching/sourceLearning/*
// @grant        GM_notification
// @grant        unsafeWindow
// @license      MIT
// @namespace https://greasyfork.org/users/718156
// ==/UserScript==

(function () {
    'use strict';

    const $ = unsafeWindow.jQuery;
    const emojiAlert = "❗"; // 彩色emoji 感叹号
    let notified = false; // 标记是否已通知

    // 延迟 2 秒后获取 XPath 路径中的标题内容
    setTimeout(() => {
        const titleNode = document.evaluate('//*[@id="sourceTit"]/span', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        const videoTitle = titleNode ? titleNode.textContent.trim() : "刷课视频";

        // 设置标签页标题
        document.title = videoTitle;

        console.log("标签页标题设置为:", document.title);

        // 初始化播放设置
        $(".volumeIcon").click();           // 静音
        $(".speedTab15").click();           // 1.5倍速播放
        $(".bigPlayButton.pointer").click(); // 开始播放
        $(".line1bq").click();              // 播放课程视频

        // 定时检测播放状态
        setInterval(() => {
            const activeItem = $("div.file-item.active");

            // 若 icon-finish 不存在时,打印 activeItem 内文本并追加到标签页标题
            if (activeItem.find("i.icon-finish").length < 0) {
                const activeText = activeItem.text().trim();
                console.log("当前标签页内所有文本内容:", activeText);

                // 更新标签页标题
                document.title = `${videoTitle} - ${activeText}`;
            }

            // 检查视频是否完成
            if (!notified && activeItem.find("i.icon-finish").length > 0) {
                notified = true; // 设置为已通知

                // 视频播放完毕时发送一次性通知
                GM_notification({
                    title: videoTitle,
                    text: "视频播放结束,请手动切换到下一个视频",
                    timeout: 5000,
                    onclick: () => window.focus()  // 点击通知时聚焦当前标签页
                });

                // 修改标签页标题为已完成状态
                document.title = `${emojiAlert}已刷完${emojiAlert} ${videoTitle}`;
            }

            // 若播放按钮显示为“可点击”,则点击继续播放
            if ($(".bigPlayButton.pointer").css("display") === "block") {
                $(".bigPlayButton.pointer").click();
            }
        }, 2000);
    }, 2000);
})();