目标:
找到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链接的活动不确定是否能在第一次加载网页的时候完成,所以本脚本是循环不断运行的,存在对系统资源的消耗,故建议平时保持脚本关闭不运行,仅在需要嗅探复制下载时打开运行。

979

被折叠的 条评论
为什么被折叠?



