// ==UserScript== // @name fanxing-m3u8-live // @namespace https://greasyfork.org/zh-CN/users/135090 // @version 0.53.0 // @description 酷狗繁星HLS提取 // @author zwb83925462 // @license CC // @match https://fanxing.kugou.com/1* // @match https://fanxing.kugou.com/2* // @match https://fanxing.kugou.com/3* // @match https://fanxing.kugou.com/4* // @match https://fanxing.kugou.com/5* // @match https://fanxing.kugou.com/6* // @match https://fanxing.kugou.com/7* // @match https://fanxing.kugou.com/8* // @match https://fanxing.kugou.com/9* // @match https://fanxing.kugou.com/channel/* // @icon https://fanxing.kugou.com/favicon.ico // @grant none // @run-at document-end // ==/UserScript== function fxapi(rid) { let fxurl = `https://fx1.service.kugou.com/video/mo/live/pull/h5/v3/streamaddr`; fxurl += `?roomId=${rid}`; fxurl += `&streamType=2-3-5-6&liveType=1-2-5`; fxurl += `&platform=12&version=1000&ch=fx&ua=fx-mobile-h5&kugouId=0&layout=1&appid=2815`; return fxurl; } function loop() { let rid = 0; const isChannel = location.pathname.indexOf("channel") > -1; if (isChannel) { rid = liveInitData?.liveStarRoomId; } else { rid = liveInitData?.roomId; } // 如果 liveInitData 还没准备好,继续等待重试(不创建元素) if (liveInitData?.liveStatus === undefined) { setTimeout(loop, 1500); return; } // 避免重复插入:已存在则复用 let link = document.getElementById("m3u8"); if (!link) { link = document.createElement("a"); link.id = "m3u8"; link.style.position = "fixed"; link.style.top = "10%"; link.style.left = "0"; link.style.display = "block"; link.style.color = "#23ade5"; document.body.append(link); } link.textContent = liveInitData?.liveName; if (!isChannel) { console.log("RoomID=" + rid); const fxurl = fxapi(rid); if (liveInitData?.liveStatus > 0) { fetch(fxurl).then(response => response.json()) .then(result => { console.log('success:', result?.data); const fxdata = result?.data; const fxhv = fxdata?.horizontal?.length > 0 ? fxdata?.horizontal[0] : fxdata?.vertical?.[0]; const linezero = fxhv?.httpshls?.[0]; link.href = linezero; }) .catch(err => console.error("fetch streamaddr failed:", err)); } else { link.textContent = liveInitData?.liveStatus; const flv = liveInitData?.httpflv?.[0]; link.href = flv ? flv.replace(".flv", ".m3u8") : "#"; } } else { console.log("RoomID=" + rid); let url = "https://fx1.service.kugou.com/video/pc/live/pull/mutiline/streamaddr?std_rid="; url = url.concat(rid); url = url.concat("&version=1.0&streamType=2-3-5-6&targetLiveTypes=1-2-3-4-5-6&ua=fx-h5"); if (liveInitData?.channelRoomInfo?.roomType > 0) { fetch(url).then(response => response.json()) .then(result => { console.log('success:', result); const fxdatalist = result?.data?.lines?.[0]?.streamProfiles?.[0]; const linezero = fxdatalist?.httpsHls?.[0]; link.href = linezero; link.textContent = fxdatalist?.streamName; }) .catch(err => console.error("fetch channel streamaddr failed:", err)); } else { link.textContent = "未开播"; link.href = "#"; } } } loop();