一个Tampermonkey油猴脚本用于嗅探m3u8链接

目标:

找到N_m3u8DL-CLI这个项目可以下载m3u8链接的视频资源并利用fmpeg转化为mp4格式,然后就用deepseek试了把水,写了一个油猴脚本来嗅探m3u8链接,代码逻辑比较清晰易懂(但真让我自己写写不出来),

功能:

嗅探网页内的所有".m3u8"链接,如果有会在页面右下角浮动一个文本框显示嗅探到的结果,单击每一条链接都会复制到剪贴板,可以搭配N_m3u8DL项目下载到本地转换为Mp4视频观看,也可以复制到potplayer之类的播放器内播放{我自己这边网络环境不太好,所以习惯下载下来看。}

// ==UserScript==
// @name         M3U8 Link Copy to Clipboard
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  在页面右下角浮动显示所有.m3u8链接,点击链接时复制到剪贴板
// @author       DeepSeek
// @match        *://*/*
// @grant        GM_setClipboard
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    // 添加自定义样式
    GM_addStyle(`
        #m3u8-floating-box {
            position: fixed;
            bottom: 20px;
            right: 20px;
            width: 300px;
            max-height: 200px;
            overflow-y: auto;
            background-color: #f1f1f1;
            border: 1px solid #ccc;
            padding: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            z-index: 10000;
            font-family: Arial, sans-serif;
            font-size: 14px;
            color: #333;
        }
        #m3u8-floating-box h3 {
            margin: 0 0 10px 0;
            font-size: 16px;
            color: #000;
        }
        #m3u8-floating-box a {
            display: block;
            margin-bottom: 5px;
            color: #06c;
            text-decoration: none;
            cursor: pointer;
        }
        #m3u8-floating-box a:hover {
            text-decoration: underline;
        }
    `);

    // 防抖函数,减少频繁操作
    function debounce(func, delay) {
        let timer;
        return function(...args) {
            clearTimeout(timer);
            timer = setTimeout(() => func.apply(this, args), delay);
        };
    }

    // 查找所有.m3u8链接
    function findM3U8Links() {
        const links = new Set(); // 使用Set去重
        const regex = /https?:\/\/[^\s]+\.m3u8/g; // 匹配.m3u8链接的正则表达式

        // 查找页面中所有文本内容
        const walker = document.createTreeWalker(
            document.body,
            NodeFilter.SHOW_TEXT,
            null,
            false
        );

        while (walker.nextNode()) {
            const node = walker.currentNode;
            if (node.nodeValue) {
                const matches = node.nodeValue.match(regex);
                if (matches) {
                    matches.forEach(link => links.add(link));
                }
            }
        }

        return Array.from(links); // 将Set转换为数组
    }

    // 创建浮动显示框
    function createFloatingBox() {
        const box = document.createElement('div');
        box.id = 'm3u8-floating-box';
        box.innerHTML = '<h3>找到的.m3u8链接:</h3>';
        document.body.appendChild(box);
        return box;
    }

    // 更新浮动显示框内容
    function updateFloatingBox(box, links) {
        if (links.length > 0) {
            box.innerHTML = '<h3>找到的.m3u8链接:</h3>';
            links.forEach(link => {
                const linkElement = document.createElement('a');
                linkElement.textContent = link;
                linkElement.addEventListener('click', () => {
                    GM_setClipboard(link); // 复制链接到剪贴板
                    console.log(`已复制链接到剪贴板: ${link}`);
                });
                box.appendChild(linkElement);
            });
        } else {
            //box.innerHTML = '<h3>未找到.m3u8链接</h3>';
        }
    }

    // 初始化浮动显示框
    const floatingBox = createFloatingBox();

    // 监听DOM变化
    const observer = new MutationObserver(debounce(() => {
        const m3u8Links = findM3U8Links();
        updateFloatingBox(floatingBox, m3u8Links);
    }, 500)); // 防抖延迟500ms

    observer.observe(document.body, {
        childList: true, // 监听子节点变化
        subtree: true,   // 监听整个子树
        characterData: true // 监听文本内容变化
    });

    // 初始化时查找一次
    const initialLinks = findM3U8Links();
    updateFloatingBox(floatingBox, initialLinks);
})();

使用方法:

复制上述代码,在油猴里新建脚本,并将代码复制覆盖,然后保存脚本,并刷新目标网页即可。

弊端:

因为不同网站可能的代码策略不一样,加载M3U8链接的活动不确定是否能在第一次加载网页的时候完成,所以本脚本是循环不断运行的,存在对系统资源的消耗,故建议平时保持脚本关闭不运行,仅在需要嗅探复制下载时打开运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值