bilibili merged flv+mp4+ass+enhance

bilibili/哔哩哔哩:超清FLV下载,FLV合并,原生MP4下载,弹幕ASS下载,MKV打包,播放体验增强,原生appsecret,不借助其他网站

< 脚本bilibili merged flv+mp4+ass+enhance的反馈

评价:好评 - 脚本运行良好

§
发表于:2018-01-12

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

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

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

谢谢各位大神!!!

qli5作者
§
发表于:2018-01-13
之前在用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;
}
qli5作者
§
发表于:2018-01-13
之前在用you-get,结合自己的shell script进行批量下载。结果今天突然用不了(403),然后发现了这个,非常直观好用啊。 遗憾的是这个脚本需要直接在浏览器运行,好像也不能批量处理。我不懂js,看到4000多行的代码头皮发麻,所以想请教一下是如何解析b站视频地址的,我想自己试着用python重现一下。 谢谢各位大神!!!

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

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

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

发表回复

登录以发表回复。