Skip to content

jf3096/bilibili-live-video-noty

Repository files navigation

bilibili-live-video-noty (Bilibili直播下载)

来源

由于我家妹纸需要学习B站直播画画(需求),她跟我说无法下载, 只能录屏。可是我是拯救世界的程序员,怎么可能手动做这玩意呢。于是开始研究(分析),发现首先视频木有加密(不像能力天空)。万恶的主播时不时早上6点直播,要么就下班的路上一言不合又直播,我靠!!! 哎, 于是就开始挨喷。宝宝心里苦:(所以就花了一下午冲冲忙忙做了这么一个玩意)。测试了一周没问题,后来发现B站动态回收直播服务器,换句话说地址必须动态获取,稍微研究了一下就以迅雷不及掩耳滴速度搞定了。 现在挂在在自己的VPS服务器上, 稳定测试了半年了, 再也没有被家暴了~

原理

整个应用挂在在VPS上, 使用PM2维护应用

  1. 创建一个Schedule定时器

  2. 请求确定Package.json配置的下载直播列表的状态是<直播中>

  3. 动态获取下载地址, 返回了XML直播服务器列表与备用直播服务器列表

  4. 创建文件流并下载

要求

  • NodeJS < 10

语言

  • Typescript
  • Javascript (TS会编译成JS, 所以想用JS也可以直接用, 代码我也编译成JS了)

快速开始

在Package.json中配置需要下载的用户列表, 其中VideoId在直播URL中获得 (e.g. http://live.bilibili.com/20375), 20375为VideoId, 该VideoId是绝对唯一不变的.

配置案例例如: (Name用于创建文件名)

    "users": [
      {
        "name": "雷涟漪の日常",
        "videoId": 20375
      },
      {
        "name": "离城的直播间",
        "videoId": 61132
      },
      {
        "name": "艾伦测试",
        "videoId": 288546
      }
    ]

下载目标文件夹: (默认ftp)

    "downloadFolder": "ftp",

下载NPM依赖关系, 启动Server

$ npm install
$ npm start

##注意事项 1) 执行开始之后, 只有时间例如13:01 00:00才执行检测, 设定是每分钟执行一次检查 (妹纸说直播的每分钟都很重要)

  1. 在经过多个VPS使用后,大部分VPS会认为每分钟同样的请求这样的traffic存在SPAM的嫌疑,所以检查时间改为10分钟。 

  2. 下载的FLV文件由于主播可能网络环境不好,出现断断续续,导致下载多个小文件是正常的。 还有一种情况出现多个几百B的文件是由于主播网络问题导致直播API返回是直播进行中,但实际上文件流已经关闭。

  3. 由于视频文件是直播形式,所以下载的文件自身没有结束符,这导致在部分视频工具无法调节进度条。但大多数视频工具可以调整。 这个问题的解决方式需要理解视频文件的构造(我研究了一下,有点麻烦需要检测最后几位二进制的特征做修复)。 

ChangeLog

1.0.1 (2018-02-15)

  • bug: 由于B站改版,目前发现视频可能潜在加密,其次下载视频需要secret授权,所以工具失效。已通过更新“获取视频下载地址”适配修正该问题,待稳定测试。

Demo

alt tag

alt tag

About

bilibili直播下载

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published