Cxxdgc's Site

Back

使用说明#

本文使用edge浏览器进行演示,其他浏览器可自行安装“[篡改猴]”(英文TamperMonkey)拓展,google浏览器可点击此处安装篡改猴拓展

打开拓展

alt text

点击“获取 Microsoft Edge 扩展”

alt text

搜索篡改猴并点击获取

alt text

在弹出的窗口中点击“添加拓展”

alt text

依次操作打开拓展选项

alt text

有插件文件#

点击已安装脚本

alt text

将插件文件拖拽到此处即可,点击安装

alt text

安装完成!打开蕉学网回放页面即可见“复制下载地址”按钮!

无插件文件#

点击最左侧的加号

alt text

到如下界面

alt text

复制下面这段代码,并覆盖粘贴到其中

// ==UserScript==
// @name         蕉学网回放2025秋季更新回退插件
// @version      1.3
// @description  回退蕉学网2025秋季更新
// @author       cxxdgc
// @match        https://onlineroomse.pku.edu.cn/player?course_id*
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @connect      resourcese.pku.edu.cn
// @connect      course.pku.edu.cn
// ==/UserScript==

(function() {
    'use strict';

    let downloadUrl = "";
    let fileName = "";

    // 拦截XHR请求获取视频信息
    const originalSend = XMLHttpRequest.prototype.send;
    const originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;

    XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
        this._requestHeaders = this._requestHeaders || {};
        this._requestHeaders[header] = value;
        originalSetRequestHeader.apply(this, arguments);
    };

    XMLHttpRequest.prototype.send = function(body) {
        const url = this._url || "";
        if (url && url.includes("get-sub-info-by-auth-data")) {
            this.addEventListener("load", function() {
                try {
                    const response = JSON.parse(this.response);
                    console.log('[蕉学网回放2025秋季更新回退插件] 成功获取视频信息');

                    const courseName = response.list[0].title || "未知课程";
                    const subTitle = response.list[0].sub_title || "未知章节";
                    const lecturerName = response.list[0].lecturer_name || "未知讲师";
                    fileName = `${courseName} - ${subTitle} - ${lecturerName}.mp4`;

                    const filmContent = JSON.parse(response.list[0].sub_content);
                    const isM3u8 = filmContent.save_playback.is_m3u8;

                    if (isM3u8 == "yes") {
                        const m3u8 = filmContent.save_playback.contents;
                        const m3u8Pattern = /https:\/\/resourcese\.pku\.edu\.cn\/play\/0\/harpocrates\/\d+\/\d+\/\d+\/([a-zA-Z0-9]+)(\/.+)\/playlist\.m3u8.*/;
                        const match = m3u8.match(m3u8Pattern);
                        if (match) {
                            const hash = match[1];
                            downloadUrl = `https://course.pku.edu.cn/webapps/bb-streammedia-hqy-BBLEARN/downloadVideo.action?resourceId=${hash}`;
                            console.log('[蕉学网回放2025秋季更新回退插件] M3U8链接转换成功');
                        }
                    } else {
                        downloadUrl = filmContent.save_playback.contents;
                    }

                    console.log('[蕉学网回放2025秋季更新回退插件] 下载链接解析成功:', downloadUrl);
                } catch (error) {
                    console.error('[蕉学网回放2025秋季更新回退插件] 解析视频信息失败:', error);
                }
            });
        }
        originalSend.apply(this, arguments);
    };

    // 创建并注入按钮
    function addDownloadButtons() {
        const footer = document.querySelector(".course-info__wrap .course-info__footer");
        if (!footer) return;

        // 检查是否已添加过按钮
        if (document.querySelector('.pku-copy-btn')) return;

        // 创建复制链接按钮
        const copyBtn = document.createElement("button");
        copyBtn.className = "el-button el-button--default el-button--medium pku-copy-btn";
        copyBtn.innerHTML = '<i class="el-icon-link"></i> 复制下载地址';
        copyBtn.style.marginLeft = "10px";
        copyBtn.onclick = handleCopyLink;

        // 添加到footer
        footer.appendChild(copyBtn);

        console.log('[蕉学网回放2025秋季更新回退插件] 按钮添加完成');
    }

    // 处理复制链接
    function handleCopyLink() {
        if (!downloadUrl) {
            alert("正在获取下载链接,请稍等...");
            return;
        }

        if (typeof GM_setClipboard !== 'undefined') {
            GM_setClipboard(downloadUrl);
            alert('下载链接已复制到剪贴板');
        } else if (navigator.clipboard?.writeText) {
            navigator.clipboard.writeText(downloadUrl)
                .then(() => alert('下载链接已复制到剪贴板'))
                .catch(err => {
                    console.error('[蕉学网回放2025秋季更新回退插件] 复制失败:', err);
                    fallbackCopy(downloadUrl);
                });
        } else {
            fallbackCopy(downloadUrl);
        }
    }

    // 回退复制方法
    function fallbackCopy(text) {
        const textArea = document.createElement("textarea");
        textArea.value = text;
        textArea.style.position = "fixed";
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();
        try {
            document.execCommand('copy');
            alert('下载链接已复制到剪贴板');
        } catch (err) {
            console.error('[蕉学网回放2025秋季更新回退插件] 回退复制失败:', err);
            prompt('请手动复制以下链接', text);
        }
        document.body.removeChild(textArea);
    }

    // 初始化
    function init() {
        // 监听XHR的open方法以获取URL
        const originalOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function(method, url) {
            this._url = url;
            return originalOpen.apply(this, arguments);
        };

        // 添加按钮
        addDownloadButtons();

        // 设置定时器,确保按钮被添加
        const interval = setInterval(() => {
            const footer = document.querySelector(".course-info__wrap .course-info__footer");
            if (footer && !document.querySelector('.pku-download-btn')) {
                addDownloadButtons();
            }
        }, 1000);

        // 5秒后清除定时器
        setTimeout(() => clearInterval(interval), 5000);
    }

    // 页面加载完成后初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();
plaintext

点击文件-保存(或按ctrl-s(windows)) alt text

安装完成!

alt text

打开蕉学网回放页面即可见“复制下载地址”按钮!

蕉学网回放2025秋季更新回退插件
https://www.cxxdgc.cn/blog/project/videodownload2025autumn_addition
Author Cxxdgc
Published at 2025年12月22日
Comment seems to stuck. Try to refresh?✨