[web.rest] 解析bilibili分享链接,获取视频的MP4直链

Mr_MAO 1天前 100


import win.ui;
import win.clip;
import web.rest.jsonClient;
import process;
import thread.command;
/*DSG{{*/
var winform = win.form(text="Bilibili 视频直链解析工具 (By:Mr_MAO)";right=743;bottom=527)
winform.add(
btnClipboard={cls="button";text="从剪贴板读取并解析";left=552;top=448;right=720;bottom=500;color=0xD77800;db=1;dr=1;z=3};
btnCopy={cls="button";text="复制直链";left=184;top=448;right=334;bottom=500;db=1;disabled=1;dl=1;z=7};
btnOpen={cls="button";text="浏览器打开";left=24;top=448;right=174;bottom=500;db=1;disabled=1;dl=1;z=8};
btnParse={cls="button";text="立即解析";left=368;top=448;right=536;bottom=500;db=1;dr=1;z=2};
editInput={cls="edit";left=24;top=40;right=719;bottom=125;autohscroll=false;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1};
editOutput={cls="edit";left=24;top=168;right=719;bottom=435;autohscroll=false;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=4};
static={cls="static";text="请输入或粘贴 Bilibili 分享链接:";left=24;top=16;right=293;bottom=34;dl=1;dt=1;transparent=1;z=5};
static2={cls="static";text="解析结果:(解析成功后可点击下方按钮打开视频或复制url链接)";left=24;top=144;right=550;bottom=158;dl=1;dr=1;dt=1;transparent=1;z=6}
)
/*}}*/

var lastVideoUrl = "";

winform.updateResult = function(videoUrl, title){
    if(videoUrl){
        lastVideoUrl = videoUrl;

        winform.btnCopy.disabled = false;
        winform.btnOpen.disabled = false;

        winform.editOutput.text = "";
        winform.editOutput.print("视频标题: " ++ title);
        winform.editOutput.print("解析成功!真实 MP4 直链如下:");
        winform.editOutput.print("------------------------------------------------------------");
        winform.editOutput.print(videoUrl);
        winform.editOutput.print("------------------------------------------------------------");
        winform.editOutput.print("提示:您可以点击下方按钮直接复制或打开。");
    }
    else {
        winform.btnCopy.disabled = true;
        winform.btnOpen.disabled = true;
    }
}

var runParser = function(text){
    if(!text || #text == 0){
        winform.msgboxErr("内容不能为空!");
        return;
    }

    var bvid = string.match(text, "(BV\w+)");
    if(!bvid){
        winform.msgboxErr("未找到有效的 BVID!");
        return;
    }

    lastVideoUrl = "";
    winform.btnCopy.disabled = true;
    winform.btnOpen.disabled = true;
    winform.editOutput.text = "";
    winform.editOutput.print("正在连接 Bilibili 服务器解析: " ++ bvid);

    winform.btnParse.disabledText = {"✶";"✸";"✹";"✺";"✹";"✷"};

    thread.invoke( 
        function(winform, bvid){
            import thread.command;
            import web.rest.jsonClient;

            var http = web.rest.jsonClient();
            http.addHeaders = {
                ["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36";
                ["Referer"] = "https://www.bilibili.com/video/" ++ bvid;
            }

            // 获取 CID
            var viewApi = http.api("https://api.bilibili.com/x/web-interface/view");
            var viewData = viewApi.get( bvid = bvid );

            if(!viewData ? viewData.code != 0){
                winform.editOutput.print("API 报错: " ++ (viewData ? viewData.message : "请求失败"));
                winform.btnParse.disabledText = null;
                return;
            }

            var aid = viewData.data.aid;
            var cid = viewData.data.cid;
            var title = viewData.data.title;

            // 获取播放地址
            var playApi = http.api("https://api.bilibili.com/x/player/playurl");
            var playData = playApi.get(
                avid = aid;
                bvid = bvid;
                cid = cid;
                qn = 16; 
                fnval = 0; 
                fnver = 0; 
                platform = "html5"; 
                high_quality = 1
            );

            winform.btnParse.disabledText = null;

            if(playData ? playData.code == 0){
                var durl = playData.data ? playData.data.durl;
                if(durl && #durl > 0){
                    var videoUrl = durl[1].url;
                    winform.updateResult(videoUrl, title);
                }
                else {
                    winform.editOutput.print("解析失败:未返回有效的视频直链。");
                }
            }
            else {
                winform.editOutput.print("获取地址失败: " ++ (playData ? playData.message : "未知错误"));
            }

        }, winform, bvid
    )
}

// 按钮点击:立即解析
winform.btnParse.oncommand = function(id,event){
    runParser(winform.editInput.text);
}

// 按钮点击:复制直链
winform.btnCopy.oncommand = function(id,event){
    if(#lastVideoUrl > 0){
        win.clip.write(lastVideoUrl);
        winform.msgbox("解析出的视频直链已复制!", "成功");
    }
}

// 按钮点击:浏览器打开
winform.btnOpen.oncommand = function(id,event){
    if(#lastVideoUrl > 0){
        import process;
        process.execute(lastVideoUrl);
    }
}

// 按钮点击:从剪贴板解析
winform.btnClipboard.oncommand = function(id,event){
    var clipText = win.clip.read();
    if(clipText){
        winform.editInput.text = clipText;
        runParser(clipText);
    }
}

winform.editInput.text = `https://www.bilibili.com/video/BV17yH8znEpx?vd_source=2a9d62ca9035cfb6a0494ff0fae12e69`;

winform.show();
win.loopMessage();
最新回复 (5)
  • netfox 1天前
    2 2
    老阿姨值得顶上去
  • 光庆 23小时前
    0 3
    图很给力。涨知势了。
  • Mr_MAO 23小时前
    1 4
    代码很普通没什么营养,但配图一定要能提神!😊
  • mfk 23小时前
    0 5
  • netfox 21小时前
    0 6
    Mr_MAO 代码很普通没什么营养,但配图一定要能提神!😊
    前晚的快手直播才提神🥱
返回