Contents
  1. 1. 初到 Bilibili
  2. 2. Bilibili 这几年
  3. 3. 我上大学了
  4. 4. 我的解决方案

初到 Bilibili

我第一次来到B站还是在 2013 年,算起来那时应该是高一下半学期暑假。那时候的B站人还比较少,我来B站也只是看游戏区的(现在也是)。那时候B站还有很多直接外链别的视频网站的视频,也就是说片源在别人的服务器上,但是却没有广告。这也必将引起侵权纠纷,事实上也是如此。我当初看好B站就是因为它没有广告,还有弹幕,看起来就很爽,现在也大体保持免费无广告,还是挺好的。

我在 2013 年 7 月 30 日注册了B站会员,当时注册成为正式会员需要答卷子,及格才能通过。卷子的内容大部分都是二次元相关,那时候的我根本不会啊(现在的我也应该不会)。因此我是靠百度苟活了下来。

来到B站 4 年了,我也陆陆续续关注了许多UP主。第一个应该是逍遥散人吧。我应该是通过第六天堂认识的他。当时我沉迷 terraria 不能自拔,因而就去找视频看。当时做这个视频的人很少,就找到了第六天堂,之后就在新浪游戏看他的直播。后来他玩以撒,有意无意地提到了逍遥散人,说他玩以撒欧洲人,运气好。再后来我就在新浪游戏看他的直播以撒之类的游戏。不久之后,新浪游戏好像 GG 了,散人也不在那播了。我自然而然地看到他的优酷频道:

简介:加油! 我的B站网址http://member.bilibili.tv/space?uid=168598 去那里看弹幕和吐槽吧

所以我就来到B站,看他的视频啦。

Bilibili 这几年

我来到B站的几年,正好是B占发展最快的几年。如今的B站已经成为中国最大的视频网站(戏称“世界最大同性交友网站”),说实在的我也没想到。前几年也有了自己的直播,视频播放也都便成了领先国内的 html5 技术了。

然而,所谓树大招风,如此庞大的视频网站也自然不能再做那种“盗片”的事了。随着国内版权意识的提升,也或许是因为B站服务器带宽的不足,总之B站会限制国外,尤其是日本地区的访问速度。

http://interface.bilibili.com/player?id=cid:22435723&aid=13716817 此网址会根据访问者的 IP 来判别访问者的地区。如果它认为你是来自日本的,它就会在之后返回的视频真实地址中加入速度限制。比如下面这个地址里的 rate=7000 ,这个时候你播放视频会非常卡顿。

http://tx.acgvideo.com/23/57/22435723/22435723-1-80.flv?txTime=1503631888&platform=pc&txSecret=2b28aef6ba0e1ba2d14ea070383437a0&oi=1760469024&**rate=7000**&hfb=b99ffc3c5c68f00a33123bb25f882d5b

可是这何在中国的我,又有什么关系呢?

我上大学了

2015 年,我来到了东北大学。东北大学的网还是不错的,有 ipv6 这种好东西。我们学校网络套餐是每月 20 元 30GB ,超出部分 1 元 1G 。可是像我这种看视频大户,正常每月七八十 G 大概。这我哪用得起啊,再也不能开心的看B站了!

后来,我在网上注意到了可以用 Showsocks + ipv6 来做代理,使用免费的 ipv6 来访问 ipv4 的网络。具体就是本地通过 ipv6 访问远程服务器,服务器同时支持 ipv6 和 ipv4 ,服务器通过 ipv4 访问网站,再把内容通过 ipv6 发回来。这其中远程服务器是关键,它要满足以下条件:

  • 支持 ipv6
  • 要能访问“不能访问”的网站
  • 与本地有较低的延迟
  • 有足够的带宽
  • 价格便宜

要找到同时满足这么多条件的服务器可不容易。最后,我选择了 Vultr 的 $5/mo 版本,地区日本,每月 5 美金,流量 1000 GB !延迟也比较低,在 90ms 左右,虽然玩游戏肯定不行,但是网页还是可以妙开的。终于可以愉快的玩耍了,然而,B站不同意。

我的解决方案

对于看B站视频的卡顿,我想了很多办法。比较好的办法是下载下来,用 bililocal 加载弹幕看。然而我还是不爽,为什么不能在线愉快的看!终于,在不久之前,我灵光一闪,突然想到:我不能流畅的看是因为服务器认为我是来自日本的,我不得不用日本的服务器访问是因为视频流量太大。然而,检测我的地区的流量消耗又不大,我可以直接访问那个地址,用代理访问视频真实地址啊。

要实现这点,只需要使用白名单,把需要直接访问的域名加入,不在名单中的域名使用代理访问。想到这,我稍微修改了 ss 的 pac.txt ,把它从黑名单改成了白名单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// pac.txt
var domains = {
"interface.bilibili.com": 1,
"google.com.hk": 1,
"google.com": 1,
"google.com.jp": 1,
"youtube.com": 1,
"googlevideo.com": 1,
"neu.edu.cn": 1,
"neu6.edu.cn": 1,
"wikipedia.org": 1,
"npupt.com": 1
};
var neuIPv4 = [
x => (202118000000 <= x && 202118031255 >= x),
x => (219216064000 <= x && 219216127255 >= x),
x => (210030192000 <= x && 210030207255 >= x),
x => (202199000000 <= x && 202199015255 >= x),
x => (58154160000 <= x && 58154255255 >= x),
x => (118202000000 <= x && 118202047255 >= x),
x => (192168000000 <= x && 192168255255 >= x)
];
var proxy = "__PROXY__";
var direct = 'DIRECT;';
var hasOwnProperty = Object.hasOwnProperty;
function FindProxyForURL(url, host) {
if (neuIPv4.map(x => x(host.split('.')
.reduce((x,y) => x * 1000 + y * 1))).reduce((x,y) => x || y)) {
return direct;
}
var suffix;
var pos = host.lastIndexOf('.');
pos = host.lastIndexOf('.', pos - 1);
while (1) {
if (pos <= 0) {
if (hasOwnProperty.call(domains, host)) {
return direct;
} else {
return proxy;
}
}
suffix = host.substring(pos + 1);
if (hasOwnProperty.call(domains, suffix)) {
return direct;
}
pos = host.lastIndexOf('.', pos - 1);
}
}

除了B站要用的 interface.bilibili.com ,我还加入了几个我常用的不需要代理的域名(有 ipv6 的和校内的)。这份文件中的domains对象的属性是全局域名包括子域名,比如 bilibili.com 包括 所有其下的域名(interface.bilibili.com, www.bilibili.com …)。neuIPv4 中设置的是校内的IPv4地址,我把它们换成了十进制数,用来判别访问的IP是不是在网段内。

我用这份 pac 文件试了试,果真可以,再也不会出现视频卡顿的状况了!这份 pac 文件由 js 写成,因此还可以实现更精细的控制,这种欺骗服务器的方法也可以用在其他对地域有限制的网站上。

Contents
  1. 1. 初到 Bilibili
  2. 2. Bilibili 这几年
  3. 3. 我上大学了
  4. 4. 我的解决方案