• Home
  • Blog
  • CS
  • EE/CE/RF
  • Networking
  • Event Repo

Quick Link 链接

  • Contact Us 联系我们
  • Calendar 日历

Niconico生放源抓流详解

Posted in Computer Science 软件工程 {{ "2018-11-10T17:00:00+00:00" | date "longDate" }}

ssysm|美东矿业

me@theeditorstudio.com

最近正在做一个流获取工具,正好也碰到了niconico直播的抓流方法,那么这篇文章就来讲一讲他是怎么实现的。

Ok,那么首先我们在niconico上找一个直播, 我这次找了一个股市的直播,因为这个直播时间很长,很利于我们边看边debug.

QQ%E6%88%AA%E5%9B%BE20181029164814

那么首先就是先打开我们的 F12开发者工具大法

QQ%E6%88%AA%E5%9B%BE20181029172832

下一步,切换至Network(网络) 然后刷新一下页面并在页面加载完之后停止捕捉活动

QQ%E6%88%AA%E5%9B%BE20181029173022

在停止捕捉后,我们可以用自带的过滤器过滤出 .m3u8的播放列表

QQ%E6%88%AA%E5%9B%BE20181029173042

为了验证我们获取到的m3u8播放列表是正确的,我们可以使用ffplay播放一下,应该是会和网页端同步的。

QQ%E6%88%AA%E5%9B%BE20181029173400

那么到这时候可能就会问 已经获取到播放链接了,这不就完事了么? 那么你就大错特错了,试试把浏览器关掉?

QQ%E6%88%AA%E5%9B%BE20181029173819

可以看见,在浏览器关掉后,niconico服务器端失去前端心跳包,对当前的直播流切断并返回403。那么接下来我们来看看个心跳包是如何产生的吧!


再次刷新并记录网络活动,在加载完后点击 WS 类型过滤器

QQ%E6%88%AA%E5%9B%BE20181029174626

在停止后会看见两个WebSocket链接

Socket1

Socket2

那么我们来仔细看一下这两个WebSocket连接内容是什么吧

那么首先第一个endpoint为websocket的socket内是所有的实时弹幕信息,这个可以用来录源时记录弹幕,但是并不影响心跳包。

QQ%E6%88%AA%E5%9B%BE20181029175002

第二个endpoint为 lvxxxxxxxx的连接就比较关键了,这时客户端对niconico服务器直播流的控制,那么一共有两个关键的sequences需要注意一下

第一个是很普通的心跳包,类似于echo请求

QQ%E6%88%AA%E5%9B%BE20181029175638

第二个是类似于时间回响的“心跳包”

QQ%E6%88%AA%E5%9B%BE20181029184801

那么我们获取了这两个非常关键的数据,我们可以开始写一点脚本来模拟一个观看者了!

但是在这之前,我们看看如何将直播数据传给niconico服务端,从而达到一个完全自动的级别。

那么首先我们右键查看源代码

QQ%E6%88%AA%E5%9B%BE20181029185435

那么在这里很多人可能就对铺面而来的乱七八糟的源码乱了手脚,但是不要急,我们慢慢来理解他们。

ctrl+F 或 command+F呼出浏览器内置搜索并输入 embedded-data

QQ%E6%88%AA%E5%9B%BE20181029185648

到这里可能很多有对这个数据格式就比较眼熟了,没错 他就是JSON!,我们只需要将他JSON.parse一下就可以使用它了!

QQ%E6%88%AA%E5%9B%BE20181029190114

那么我们在浏览器内 JSON.parse(document.querySelector('#embedded-data').getAttributes('data-props')) 就可以得到JSON数据了~

那么在这么大的一个JSON数据块里,我们只需要寻找两个关键的数值

第一个是 broadcastId,可以在 program.broadcastId中获取

QQ%E6%88%AA%E5%9B%BE20181029190556

第二个是Websocket的入口URL,这样子我们就可以进行WebSocket通信来获取我们的m3u8播放列表和心跳包

QQ%E6%88%AA%E5%9B%BE20181029190732

那么在这里放一张如果没有回复心跳包的服务器回复

QQ%E6%88%AA%E5%9B%BE20181029180233


Talk is cheap, show me the code.

GitHub Gist


结束语:

niconico的防抓流做的很不错,继续努力。

Facebook Share
Twitter Share
Google + Share

Offcanvas Menu

  • Home
  • Blog
  • CS
  • EE/CE/RF
  • Networking
  • Event Repo