bilibili 获取直播流
// ==UserScript== // @name 直播流获取 // @namespace mscststs // @version 0.62 // @description bilibili 获取直播流 // @author mscststs // @match https://live.bilibili.com/blanc/* // @match https://live.bilibili.com/* // @require https://greasyfork.org/scripts/38220-mscststs-tools/code/MSCSTSTS-TOOLS.js?version=713767 // @require https://cdn.bootcss.com/jquery/3.3.1/jquery.js // @grant GM_setValue // @grant GM_getValue // @grant GM_addValueChangeListener // @grant GM_registerMenuCommand // ==/UserScript== (function() { 'use strict'; /** 工具库,拷贝 */ const valueKey = "bilibili_live_stream_invisible" let showBtn = 0, closeBtn = 0; if(GM_getValue(valueKey,0)){ $("body").append(`<style>#helper_stream{display:block}</style>`) showBtn = GM_registerMenuCommand( "隐藏右下角菜单",()=>{ GM_setValue(valueKey,false); location.reload(); }); }else{ $("body").append(`<style>#helper_stream{display:none}</style>`) closeBtn = GM_registerMenuCommand( "显示右下角菜单",()=>{ GM_setValue(valueKey,true); location.reload(); }); } GM_registerMenuCommand( "设置外部播放器协议",()=>{ const f = prompt("请输入你的播放器协议,例如: potplayer:// \n 配置此项后就可以在复制直播流时按住 Ctrl 直接拉起外部播放器",GM_getValue("bilibili_live_stream_outer_proto","")); if(f){ GM_setValue("bilibili_live_stream_outer_proto",f); } }); function msg(text,level,time,left,top){ text=text||"这是一个提示"; level=level||"success"; time=time||2000; if(level!="success"){ console.log(text); } var id = (new Date()).valueOf(); $("body").append('<div class="link-toast '+level+'"data-id="'+id+'" style="left: '+left+'; top: '+top+';"><span class="toast-text">'+text+'</span></div>'); $("div.link-toast[data-id='"+id+"']").slideDown("normal",function(){setTimeout(function(){$("div.link-toast[data-id='"+id+"']").fadeOut("normal",function(){$("div.link-toast[data-id='"+id+"']").remove();});},time);}); } window.copy = window.copy || function (url) { const input = document.createElement('input'); input.setAttribute('value', url); input.setAttribute('readonly', 'readonly'); document.body.appendChild(input); input.select(); input.setSelectionRange(0, 99999999999); if (document.execCommand('copy')) { document.execCommand('copy'); console.log('复制成功',url); } document.body.removeChild(input); } let roomid = (()=>{ try{ let [[,roomid]] = [...window.location.pathname.matchAll(/\/(\d{1,})/g)] return roomid }catch(e){ return false; } })() console.log("roomid >>>>",roomid ) if(roomid){ (async ()=>{ $("body").append(` <style> #helper_stream{ border: 1px solid #e9eaec; border-radius: 12px; font-size: 12px; padding: 16px 12px 24px 12px; margin: 0; margin-bottom: 24px; background-color: #fff; user-select:none; } #helper_stream .title{ margin-top: 0; font-size: 20px; color: #333; } #helper_stream ul{ padding:0 0 0 20px; list-style-type: none; font-size:16px; color:rgb(35, 173, 229); line-height:26px; } #helper_stream li, #helper_stream a{ color:rgb(35, 173, 229); cursor:pointer; } #helper_stream li:hover{ text-shadow:0 0 0.5px #00f; } </style> `) let {data:{play_url}} = await (await fetch(`https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomPlayInfo?room_id=${roomid}&play_url=1&mask=1&qn=20000&platform=web`)).json() console.log(play_url.durl[0].url) $("div.right-container").prepend( ` <div id="helper_stream"> <p class="title">直播流获取器</p> <ul class="link-list"> ${play_url.durl.map((d,i)=>{ return `<a class="stream_link" data-url="${d.url}" href="${d.url}"> 直播流链接 ${i+1}</a>` }).join("\n")} <ul> </div> `) let contextMenu = await mscststs.wait("ul[class^=_web-player-context-menu_]"); const hash = contextMenu.className.split("_").reverse()[0]; $(contextMenu).prepend(` <li class="_context-menu-item_${hash}"> <span class="_context-menu-text_${hash}"> 复制直播流地址 </span> <div class="_context-menu-right-arrow_${hash}"></div> <ul class="_context-sub-menu_${hash}"> ${play_url.durl.map((d,i)=>{ return `<li class="_context-sub-menu-item_${hash} stream_link" data-url="${d.url}"> 直播流链接 ${i+1}</li>` }).join("\n")} </ul></li> `) $("body").on("click",".stream_link",function(e){ var url = $(this).attr("data-url"); console.log("url",url,e) window.copy(url); if(e.ctrlKey || e.metaKey){ let proto = GM_getValue("bilibili_live_stream_outer_proto", ""); if(proto){ location.href = (proto + url); } } e.preventDefault(); msg("复制成功","success",2000,e.pageX+"px",e.pageY+"px") document.querySelector(("ul[class^=_web-player-context-menu_]")).style.opacity=0 // 隐藏contextMenu }); })() } })();