AdGame 发表于 2025-12-28 08:50:32

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

https://bbs.chengxu.online/upload/files/20251223/1766472446.png
https://aar.chengxu.online/upload/files/20251223/1766472336.png
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.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/B ... 6a0494ff0fae12e69`;

winform.show();
win.loopMessage();


页: [1]
查看完整版本: [web.rest] 解析bilibili分享链接,获取视频的MP4直链