Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

请教:如何解析视频地址的

About: bilibili merged flv+mp4+ass+enhance
之前在用you-get,结合自己的shell script进行批量下载。结果今天突然用不了(403),然后发现了这个,非常直观好用啊。

遗憾的是这个脚本需要直接在浏览器运行,好像也不能批量处理。我不懂js,看到4000多行的代码头皮发麻,所以想请教一下是如何解析b站视频地址的,我想自己试着用python重现一下。

谢谢各位大神!!!

Comments

  • 之前在用you-get,结合自己的shell script进行批量下载。结果今天突然用不了(403),然后发现了这个,非常直观好用啊。

    遗憾的是这个脚本需要直接在浏览器运行,好像也不能批量处理。我不懂js,看到4000多行的代码头皮发麻,所以想请教一下是如何解析b站视频地址的,我想自己试着用python重现一下。

    谢谢各位大神!!!

    作为用户的话

    PR2555:已经有人修复了you-get,他的fork安装方法

    作为开发者的话

    这个脚本并没有破解B站的密钥;相反,它调用B站原生的方法,然后监听/替换B站的响应。这被称为hook或者hijack。原因是

    • “用B站原生播放器播放下载好的缓存”只能用替换响应的方法实现
    • B站半年就会换一次密钥

    因此,必须要有一个能运行B站原生方法的js环境,才能监听到B站的响应。

    懒得加的功能:

    • 多P解析
      接口已经留好了,但自己没这需求。因为用的是原生appsecret,需要iframe真的去访问多P,小心内存爆炸。

    所以Python的实作仍然需要phantomjs,之后拦截interface.bilibili.com/playurl?或者bangumi.bilibili.com/player/web_api/v2/playurl?这两个地址的请求就可以了。

    实际上,如果拿到视频地址之后马上删库释放页面,8G内存可以处理100P以内的批量下载,但自己没需求所以懒得做(●′ω`●) 而且会被B站当做ddos的吧


    除去ASS和MKV两个巨大无比的内嵌库,代码明明只有2800行的说~ BiliMonkey更是只有600行,而且全都是这个东西的变体

    async getNonCurrentFormat(format) {
      const jq = this.playerWin.jQuery;
      const _ajax = jq.ajax;
      const _setItem = this.playerWin.localStorage.setItem;
    
      let pendingFormat = this.lockFormat(format);
      let self = this;
      jq.ajax = function (a, c) {
        if (typeof c === 'object') { if (typeof a === 'string') c.url = a; a = c; c = undefined };
        if (a.url.includes('interface.bilibili.com/playurl?') || a.url.includes('bangumi.bilibili.com/player/web_api/v2/playurl?')) {
          self.cidAsyncContainer.resolve(a.url.match(/cid=\d+/)[0].slice(4));
          let _success = a.success;
          _success({});
          a.success = res => self.resolveFormat(res, format);
          jq.ajax = _ajax;
        }
        return _ajax.call(jq, a, c);
      };
      this.playerWin.localStorage.setItem = () => this.playerWin.localStorage.setItem = _setItem;
      this.playerWin.document.querySelector(`div.bilibili-player-video-btn-quality > div ul li[data-value="${BiliMonkey.formatToValue(format)}"]`).click();
      return pendingFormat;
    }
    
  • 之前在用you-get,结合自己的shell script进行批量下载。结果今天突然用不了(403),然后发现了这个,非常直观好用啊。 遗憾的是这个脚本需要直接在浏览器运行,好像也不能批量处理。我不懂js,看到4000多行的代码头皮发麻,所以想请教一下是如何解析b站视频地址的,我想自己试着用python重现一下。 谢谢各位大神!!!

    sigh 我想,我见到大家这样热情啊,一行代码不写也不好

    已经增加了批量功能。欢迎阁下试试开发版本:https://github.com/liqi0816/bilitwin/raw/batch-download/biliTwin.user.js

    这项功能并一定会加到正式版中。

Sign In or Register to comment.