v1.1.1 2020.4.20 新增了批量获取直播源的功能
播放器没什么好说的,我也是用的PotPlayer。 虽然作者吃相,额,有些不雅(这人已经被钉在开源界的耻辱柱上了,前略,天国的KMPlayer),不过近几年的PotPlayer对一般群众来说,各方面综合是最好用的(至少比大部分内置播放器好用吧)。 如果你是爱好影音播放的发烧友,「VLC天下第一」「MPC-HC是天」之类一套一套的肯定比我懂得多,也没必要搁这听我这个半吊子吹牛批。
重点就在直播源上了。
斗鱼
十分感谢 「lyntal分享的现成接口」和「西恩赛斯提供的斗鱼解析API」免去了我再写一遍爬虫的工作,虽然写轮子很爽,但重复劳动太多就不爽了 以及「【直播源综合教程】斗鱼直播真实地址解析,直播源抓取方法,自抓直播源分享长期有效」一文详细解释了斗鱼长期直播源的解析方式
首先我们访问获得json格式的解析结果,如果房间未开播则返回:
本文大部分代码为了方便阅读已做格式化处理,可能与原始数据有出入,下同。
得,不用抓取了,抓了无法播放也没用。
如果房间是正常直播状态,则返回(用杨树直播间举个例子):
这段有点长,格式化后用图片展示: 原数据中的中文是unicode编码,图中是转码后的结果。
可以看到包括主播名字/头像、直播间名字/公告/即时画面等信息。 我们需要的只是这个字段的值,在本例中,就是
这个url(我这里贴出来的是转义后的结果,所以没有反斜杠了),就是时间加密后的临时直播源。 我们要做的是把他做成——不敢说永久——至少长期有效的直播源,免得没看一会又要重新抓取。
- 首先把(不一定是这个,也可能是或者别的什么,总之换掉它)这个加密后的二级域名替换成斗鱼的真实cdn域名
- 找到这个字段,截断它,后面是根据时间加密的参数,全部删掉
- 是清晰度设置,2200年了,还有谁家是4M小水管吗,没有吗,没有那就看原画,删掉它
长期直播源get。
现在回顾一下,我们做了什么? 其实就是把中间这段取出来,前面加上,后面加,拿直播源,就这么简单。(当然是建立在前人的成果上,再次感谢西恩赛斯提供的接口和zhmxubing提供的解析思路) 需要特别注意的一点,最后拿到的网址一定是HTTP而不是HTTPS协议。(只有B站的直播源是HTTPS,有钱就是可以为所欲为)
虎牙
十分感谢 「虎牙直播源提取/分类/可选清晰度/开源[更新] 」提供的思路(.e源码是二进制真的秀,为了看源码我还专门装了易语言5.8,进去一堆箭头把我看傻了) 然后我照着在服务器上用PHP实现了一遍,这里贴出来,有兴趣自行查看,没兴趣请跳过这段代码往下看,后来我找到了一种更便捷的方法。
十分感谢 「real-url」和「live-real-url」两个开源项目提供的更为便捷的思路
两个项目关于获取虎牙直播源的逻辑非常近似,可以视为同一种思路。 我们先看Python版:
再看JAVA版:
同样都是利用伪装手机去访问手机版虎牙,然后正则匹配这个字段的值,不用费老半天劲再组装,匹配出来直接就是直播源。 而且我猜测手机版页面应该是比电脑版要小的,那就相当于提高了处理效率,减少了响应时间。 提升的这部分也许没办法直观感受到,但打个比方,现在是爬一个直播源,假如我们要爬某个分区前一百个直播源呢,两百个呢,所有分区呢?
当然前一种思路我亲手测试也是可行的,解题思路永远不嫌少,这个方法在这里不是最优解,换个问题未必也不是。
Bilibili
B站的直播源就很神奇了,抓取难度处于困难和简单的叠加态。为什么这么说?
假如现在你就是爬虫(人形爬虫,听起来很好ch 可怕的样子),虽然你没有任何编程基础,你要做的是:
(不必照着做,如果只是想要B站直播源,后面有更简单的方式,这里是介绍一种比较通用的、手动获取直播源的方式)
- 打开你要抓取直播源的直播间
- F12打开「开发者工具」
- 切到「Network」标签
- 看到左上角的红点了吗,不是它,它的右边有个「Clear」按钮,点一下清空之前记录的数据
- F5刷新
- 等待10s左右,直到时间轴图像里有「长长的一条蓝线贯通左右」
- 拖动鼠标选中一段「只有这条蓝线」的区域
- 下面出现数个XHR,不用在意XHR是什么,滚轮滚到最上面,有一个开头的
- 点击它,弹出详情,你第一眼看到的,也就是「Header」标签的「General」项的「Request URL」,内容类似
- 只取这一段,在前面加,后面加,完成
很简单吧。
现在换成服务器自动化流程。 我做不到。
故技重施,curl直播间页面,B站只会给「出错了」的提示页面。 使用B站的官方接口,获取开播状态没什么问题,但是,两个接口获取到的(直播源)都是。 header改了个遍,改成手机,改成正经浏览器,因为本地的postman都能拿到数据我甚至假装过postman。 当然IP和来源都伪装过了,但就是拿不到,这玩意debug都很难找到方向。 不太清楚B站的反爬在业界内算不算强的,不过打我这个菜鸡是绰绰有余了。 所以目前我自己的API没有实现b站的直播源。 查了很多资料得知大概率是IP问题,因为一些国外IP也是同样的情况(拿不到durl这个字段)。 所以也许不是反爬有多厉害,是IP黑名单强? 我的腾讯云装的windows,于是我把脚本拿去服务器上简单试了一下。 同一时间同一直播间,本地没有任何问题,服务器上的会卡在某个阶段,具体哪个步骤懒得debug了。 我的网站放在阿里云,刚刚说过了也取不到关键值。 初步猜测重要数据接口把来自主流机房的IP的拉黑了,这部分有空我会持续跟进。 虽然我买不起群晖,但我可以把吃灰的树莓派翻出来啊。 实在没办法了,老老实实上代{过}{滤}理IP池也不是不行。 只要你有一颗爱折腾的心,办法总比困难多。 说话回来,这样大家对「大型爬虫为什么都要上分布式」也有一个形象的认识了,一是提高负载能力,二是反反爬。
当然我们本地PC,家用的宽带,本地的软件,这样的情况直接从B站官方接口拿数据是没问题的。 访问,返回的json->data->live_status就是当前直播状态,1开播0没有,我们叫它接口1。 访问,返回的json->data->durl就是各个画质的直播源,我们叫它接口2。 访问,可以看到返回的json->data里既有这个字段,还有个字段,也在这个里面,我们叫它接口3。 对比三个接口的数据,我们很容易就能得出「接口3」就是「接口1」+「接口2」的结论。 (其实从、、三个域名上就能初步猜测,不过大胆假设完还要小心求证嘛)
然后就看你的需求了,如果你只是想做一个开播提醒工具,tg机器人也好,qq机器人也好,微信公众号也好,邮件也好甚至短信也好,使用接口1就行了(反正接口2、3也没有更多的直播间标题等信息,还是要继续找其他接口)。
如果你想做一个开播查询工具,开播了就放没播就提示的话,用接口3避免了两次请求两个接口的繁琐步骤。
如果你只是单纯的想要直播源,打开浏览器访问接口2(),Ctrl + F 搜索,有四个结果(不用选,四个都是一样的),取到这一段,在前面加上,B站直播源get。 而且从「即使直播间没开播,接口2依然能够获取durl(接口3不行durl值为null)」这个现象来看,B站的直播源很可能是接近永久(没事不会变化)的长期直播源。 B站直播整活不太行,24小时直播的影视频道还是挺有价值的,当成没广告的电影台看没什么问题。而且类型相对集中,比方说你喜欢恐怖片,有些直播间就只放恐怖片。 电视剧、相声、电台同理,虽然不知道现在还有没有。
好了,三个直播站的直播源获取方式都介绍完了,那么有没有一个可以检测三个站开播状态,如果开播则返回直播源,并且既可以选择直接用指定的本地播放器播放,也可以选择将直播源生成asx文件的小工具呢? 巧了,我这里还真有一个,免费(废话都开源了),安全可靠,兼容性强。
用powershell写的,只要你是win10,不需要安装任何依赖,点开就能跑。 本质是脚本文件,用编辑器打开就能看到所有源码,不放心的话用电子显微镜一行一行检查都行。
本来是纯命令行,想想都用powershell写了,不说上wpf,整两个对话框不过分吧。 写着写着发现本来就没几个的功能完全可以都搬到对话框里完成,用起来居然还意外的顺手(至少比命令行舒服多了)。
食用方法
具体的基本用法打开工具一看就懂,此处不再赘述。 (小工具虽然很简陋,也有勉强还算友好的用户界面。) 这里介绍一下进阶用法。
命令行
默认直播间
如果你觉得用命令行还是太麻烦的话可以配置默认直播间。 初次运行脚本后会生成配置文件,里面的标签里有对,在里面填上直播间地址之后,如果不带参数地打开程序,就会自动指定配置文件里的网址,而不必再手动输入。
缺点是目前只能指定一个,暂时没有做顺序列表的预定
site和room_id是为了以后扩展更方便的输入方式(比如只需要输直播间房间号)用的,现在没用2020.2.10已更新v1.0.4
asx文件的玩法
asx其实就是一个功能特化的xml配置文件,它的默认打开方式是播放器,打开就会播放预先设定好的流媒体,乍一看非常神奇。 随便用什么文本编辑器打开这个文件,可以看到类似xml的结构,构成非常简单。 每个标签里面都是一个独立的流媒体源,是名字,里面是url,一看就明白。 所以你可以手动把改成你喜欢的名字,这样在播放器里哪个是哪个会更加一目了然。 另外同一个asx文件是可以包含若干个标签的,也就是说你可以手动编辑文件:
接下来只需要打开一个文件,所有流媒体源都被添加进来了,之后可以在播放器里选择播放哪个。 最后,asx文件和一切脚本文件一样,写好内容之后保存退出,把重命名成也能用。
下载方式
「蓝奏 密码52pojie」「度盘 提取码52pj」 「Github Repo Fragment」复制粘贴到本地新建文本文档,修改后缀名为.ps1即可
欢迎反映BUG或提出改进意见~
顺便提下用法,解压之后是.ps1文件(powershell脚本),win10当成exe直接执行就行 控制台和提示框都是中文,输出信息也尽量详尽,我实在不知道还要怎么说明了……
顺手编译了个exe版,因为编译后控制台输出中文乱码,暂时没找到解决方案,所以控制台没有输出 而且不会创建配置文件,所以会缺失部分进阶功能(好像对用不到进阶的用户来说反而更好了?) 仍然推荐ps1版,毕竟如果没有逆向基础,我在exe里塞了什么东西你也不知道 随便用个文本编辑器打开就看得到源码的东西用起来也更放心不是?
Tips:
Q:我不需要原画,我就是喜欢2000/4000(码率?)画质,行不行?
A:行,这一段可以保留,也可以自行替换成(大概代表蓝光4M?)。
Q:一定要改成格式才可以吗?
A:不是,它不是格不格式的问题,它真的是那种 它本质就是一个url,你把它看成一个网址,这个网址一直在推送视频流数据出来。现在我们拿个桶来接水,你用不一样的水龙头,它出来的水会不一样吗。你想改成也好,就不动也罢,水源已经找到了,想怎么接水你高兴就好。
Q:好乱啊,这么多启动方式如果同时使用,到底谁先谁后?
A:优先级从上至下:使用命令行参数启动,配置文件设置了default->url,启动时剪切板有合法的直播间地址,配置文件同时设置了default->site/room_id,前面说的都没有直接启动才会弹出输入框要求输入。
更新日志
2020.1.31 更新v1.0.3
- [新增]如果剪切板已有直播间地址,则打开工具后不再询问直接使用该地址进行解析
- [修复]某些斗鱼直播间去掉清晰度后缀后会无法播放,因此获取到的斗鱼直播源统一加上的清晰度后缀
- [优化]优化了提取直播间房间号的正则表达式
- [优化]优化了部分判断逻辑 重命名部分函数使得含义更易理解
- [优化]获取到的网页对象不再解析DOM树以提高运行效率(感谢strmoon的建议)
2020.2.10 更新v1.0.4
- [新增]如果配置文件设定了直播站,可以直接输入房间号进行解析;如果配置文件同时设定了直播站和房间号,则直接进行解析
- [新增]支持了网易cc的临时直播源,感谢「天川天音的提议」和「网易CC直播源抓取分析过程」一文提供的思路
- [修复]以各种方式启动后的直播间地址部分处理逻辑错误
2020.3.5 更新v1.0.5
- [修复]虎牙直播源失效
2020.3.26 更新v1.0.6
- [修复]顺手修复了之前有人提过的无法识别带空格的播放器路径(like )的bug,这个确实蛮蠢的
- 今天整理仓库顺便加的就不更新了,日后有重要修复或新功能再更新
2020.4.6 重构v1.1.0
- 重构了整个脚本
- [新增]现在可以设置成功获取直播源之后的默认行为了
- [修复]重写了正则来优化输入校验逻辑 修复了以前解析后的url带直播站关键字会被错误地识别为直播间的问题
- [优化]配置文件格式从臃肿的xml替换为简洁易懂的json
- [优化]优化了读取输入的直播间优先级顺序 以期更符合常识逻辑
- [优化]所有信息以utf8直接输出 不再做任何转换
- [优化]容错处理 取消了侵入式的也许会令人迷惑的提示框 以期些许提升用户体验(现在只要弹框就是获取成功了 不成功不弹框)
2020.4.20 更新v1.1.1
- [新增]tan01建议的功能:支持自定义和保存直播间信息和直播源(并且是批量) 原因是我觉得自己玩还行,看直播的话帝国时代2的直播效果对我来说没那么好,所以树哥挨打的时候就换频道到杰哥。 来回切并不麻烦,把想切的几个asx文件一起拖进播放器的播放列表就好,但问题是即时更新直播源和直播状态。 只有两三个房间还好,如果多看几个更新还是挺麻烦的,就把这个功能写出来了,相当于实现了批量获取直播源。