之前自己试着发的第一篇视频文章还被锁了,找站长问了问最后才给解了,LOL
实战原理前往第三个标题
Iwara
一个全球最大的MMD视频分享平台。
虽然站内优质MMD视频数不胜数,但碍于DNS污染,时常你是没法进入的|(connect_abroad)。
既然网站时常没法进入,那何不自己搭建一份数据备份站呢?——IwaraCollector应运而生
IwaraCollector
IwaraCollector是我基于Iwara网站特性而编写的网站数据采集程序。
其中涵盖了:
- 爬取视频列表
- 爬取单份视频数据(作者、预览图、简介、发布日期、下载地址)
- 数据的可视化
- 下载地址的获取与缓存
虽然这些功能的实现经历了很多有趣的事情,但这不是文章的重点,故不赘述。
原理剖析
基础数据的爬取
Iwara网站网页是基于PHP编写的,其网页绝大多数数据由服务器渲染提供。
因此,视频标题、作者、作者链接、作者头像、视频封面、视频简介、视频上传日期 均可采集到。
另外,有一个很有趣的现象,那就是iwara的视频预览图片不止一张,根据爬取的预览图url可见:
/sites/default/files/videos/thumbnails/446193/thumbnail-446193_0003.jpg?itok=15PqZcc9
thumbnail-446193_{{ Number }}.jpg
是存在多张预览图的。
而这个Number的值一般不少于5张,不多于15张。由四个数字组成,空位补0。
但是,只有一个非常重要的数据是ajax动态获取的——视频下载链接。
视频数据的动态获取
Iwara使用了一个GET请求来获取下载地址:https://{{网站类型}}.iwara.tv/api/video/{{视频ID}}
访问这个地址,它会提供如下格式的JSON:
[ { "resolution":"Source", "uri":"","mime":"video/mp4" }, { "resolution":"540p", "uri":"","mime":"video/mp4" }, { "resolution":"360p", "uri":"","mime":"video/mp4" } ] 其中,resolution代表分辨率,url代表对应的视频链接。
url示例://mikoto.iwara.tv/file.php?expire=1651217152%26hash=6dd27b94c9d6170dd31d36ae733a8bee52d1301e%26file=2018%2F11%2F28%2F1543407273_Nrm1bugrGgipoWrrD_Source.mp4%26op=dl%26r=0
//mikoto.iwara.tv/ 是存储服务器域名
/file.php 附带以下参数:
- expire=1651217152 //下载时间戳
- hash=6dd27b94c9d6170dd31d36ae733a8bee52d1301e //经过加密的hash值,是限制链接有效时间的值
- file=2018%2F11%2F28%2F1543407273_Nrm1bugrGgipoWrrD_Source.mp4 //文件
- op=dl //应该是打开方式 dl可能代表下载,没找到其他值
- r=0 //1 会报403 不知道什么意义
因为技术不精,hash值加密原理没有找到。所以视频在国内播放采用了另一条路子——CloudFlare代理
CloudFlare代理借道翻墙
我已经不记得从哪篇文章中提及,iwara的CDN使用的是cloudflare,
而使用cloudflare的CDN都有一个特点:你可以向任意cloudflare的服务器发送Host为挂载在cloudflare CDN上的域名的请求,并获取到和访问该域名时相同的数据。(这个方法同样适用于某些网站被墙了,但是可以用改hosts的IP为cloudflare的服务器来访问)
利用这个方法,你只需要在cloudflare中依次添加CNAME记录,将你的域名指向到对应的iwara资源服务器域名,
示例:
我将mikoto.wobbay.xyz指向mikoto.iwara.tv
此时,你访问
与
是等效的。前者可以直接访问,后者有时有DNS污染,没法访问。
这样,就实现了在线播放。
结语
这就是大体的原理和实现方法。有其他疑问和建议可通过邮箱问我或者在Github给我发issue
但我看着站内也已经有在用我的程序来发布资源的兄弟了,我还是建议用我提供的视频外链弄在线播放,而不是跳转到我的程序再播放。
程序demo:https://iwara.wobbay.xyz/
程序开源地址:https://github.com/liuyi0501/IwaraCollector
大佬牛逼
不知咋的,程序走的漏洞被官方堵了,整个程序寄了。我单方面宣布程序寄了
大佬666 [好样的]