借用别人的,比自己做更麻烦……

今天,学而思结课了。这个星期以来过得也算是挺充实的,下午去图书馆的时候借了两本 C# 的书,比起语法方面,更头疼的是 .net 里各种奇怪的控件以及交互。

回到家后便习惯性地打开了 Visual Studio,戴上耳机写代码。

(话说每次都把真白给忽略了…)

最近是重写了几个之前写的逻辑比较混乱的类,比如那个获取番剧信息的,我本来是打算全部集中在一个类里面的。但是我却在首页窗体里直接写了调用 json 获取番剧……这一点都不 OOP 。

嘛,不扯这个了。这几天尝试着在做最难得一个部分——番剧的播放,还要带弹幕……

完全没有头绪啊。

上 GitHub 搜了一波,还真别说,睿站这知名度真不是吹的。

 

1000+的 repo,107000+的代码量,看的都可怕。其中有爬虫,客户端源码,弹幕屏蔽正则表达式等…… 然而一筛选 C# 的 repo,瞬间就少了很多。运气特别好的是,我居然找到了一个用 C# 写的b站弹幕获取并播放的工程。兴奋地二话不说直接fork过来。

Clone 下来后一跑,效果很理想。很开心,然而……

当我输入的URL是番剧地址时:它却不能用了!!

这里需要说明的是,b站的视频页的URL在普通视频中都是av号,然而在番剧页面就是番剧的 episode_id ,即使你访问它的av号URL,也还是会被强行转过去。嘛,这就十分麻烦了。

b站的每个视频的弹幕文件都是一个xml文件,地址十分简单:http://comment.bilibili.com/{cid}.xml。其中最麻烦的是 cid ,b站视频对用户使用的编号是视频的avid,即av号。然而牵扯到弹幕文件,视频原始URL都是需要视频的 cid 的。它们之间并不是通过特定的算法得到的。

网络上流传的一个比较广的方法,是打开视频的播放页,然后在 swf 的播放器的参数中可以得到,然而现在b站已经淘汰掉了 swf 播放器,全部转为了新版H5播放器,这都得益于前阵子b站的热门开源项目的 flv.js 。然而视频页的H5播放器虽然是包含了 cid 参数,但播放器是通过 iframe 框架调用的,如果只是单纯获取网站源代码并不能得到 iframe 里面的内容;目前我所知道的好像也就只有 Python 的爬虫可以爬取框架内的内容。这和网易云音乐防爬虫爬取的做法是类似的。

十分难受啊。这时,我想起了之前提供 pixiv API 的那位大佬。他好像还做了b站的 API。上他的站一看,文档还挺全的,结果居然还真让我找到了。

这个是可以返回b站番剧的 cid 的。这个问题解决了!然而在改 BKlink 这个弹幕播放器的时候我也是心累,因为有很多完全用不到的功能,要将它们都注释掉,但又可能会影响到正常的功能。

就比如这个弹幕播放器原本是支持分P弹幕播放的,但我的番剧弹幕播放只有1P,所以这个功能可以删除。但是原作者为此创建了个分P的数组,我注释掉了数组,然后主功能找不到这个数组了,又要报错,我只能在不删掉这个数组的情况下,使 for 循环每次都循环一次,也就是只读取第一P的数据就可以了……

这也让我深深的感觉改别人的代码真的难受,况且原作者还没写任何注释,我几乎是从头到尾通读了两遍,但有些地方的功能还是没有摸清。费了好大心思删除了它自带的找 cid 的功能后,我让这个播放器直接读取我给它的 cid 的视频弹幕,最后总算是实现了。真的是大脑都在颤抖。

 

(大概就是这个效果,我一直都是拿妹抖龙来测试的… 真的是被郭德纲支配的恐惧。)

弹幕的问题解决了,那么下面就是视频播放的问题了。

还是一样的思路,看 GitHub 上的前辈都是怎么做的,然后我发现大多数人都推荐 APlayer 这个视频引擎。查了一下,居然还是迅雷的!!

说真的,我真的挺佩服迅雷的,之前又听说过他将自己的 UI 库也开源了,大家也都知道迅雷的 UI 水平,以及安装界面的那个宇宙飞船。这个 APlayer 正是迅雷看看以及迅雷影音所在用的,又是一次把老本拿出来啊!诚意满满!!

照样找了个 Demo 文件,然后大概熟悉了一下这个引擎,确实设计的都挺科学的,各个方法也是通俗易懂。然而,当我输入b站的视频播放链接时,它居然没反应!!

什么鬼??当时我完全是懵逼的。将 URL 复制到 Chrome 直接访问,结果出现 403 拒绝访问?!

狡猾~狡猾~ b站在用户信息方面不加强保护,对于这些视频资源倒是防的挺严的。大概是要在请求头中加上 referer:http://www.bilibili.com/。然而我并不知道怎样让 APlayer 带 HTTP 请求头加载啊!迅雷那边的人肯定都不会考虑到我这种要加 referer 的需求啊……

心态瞬间就崩了。上百度搜了下,结果在 APlayer 的官方论坛的一个帖子的最底部看到了这个回答:

???

APlayer 的文档?就是那个看起来low到爆炸的 chm 文件?我打开了那个文档。瞬间发现了新世界!

 

功能十分的全,并且调用的方法十分简单,

Aplayer.SetConfig(ConfigID,value);

也就是只需要填入所需功能的编号,以及想要赋予的值就好。讲真,这种设置方式真的是十分的科学!!我也在文档下面找到了我要的:

功能一应俱全,不仅仅是 referer,几乎所有可能用到的 HTTP Header 都包含了!!向迅雷大佬低头!!中国良心企业!中国人民实现富强中国梦的奠基者!秒杀锤子!(你知道我指的是什么事) 。

设置好 referer 后,视频成功打开!

(别笑!但时我脑海中蹦出的第一个av号就是170001。然后就用它来测试了……)

最后,就到了最后的梦魇。我到现在写这篇文的时候依旧没有解决——播放视频的时候弹幕居然在视频的后面!!我尝试许多办法,比如将视频控件强行设置到最底层。但依然没用,那个弹幕是以一种非常奇怪的方式调用的,并不是定义一个类再将其实例化这种。

实在没有什么好办法的,那我就只能到 GitHub 上给原作者发 issue 了。

我觉得他并不能看见……

这次真的试一次十分烧脑的尝试。第一次将被人的东西拿来改成自己的,但发现并没有那么容易,我甚至在想如果自己写一个会不会更简单些。(想太多)

别人的,到底还是别人的。

我还得理解他的思路,然后顺应他设立的规则。

唉……

2 条评论

昵称
  1. 灏瀚

    大佬,你这个网站是在租用的服务器上吗?

    1. John

      嗯,是的。租的是老薛主机的香港虚机。