白嫖?妙用Nginx的proxy_buffer实现Pornhub视频反代
一直都没想到去年随手写的Pornhub视频下载插件在谷歌商店这么受大家欢迎,目前已有4w+的用户量了,不时回想起来还是蛮有成就感的一件事呢。不过从P站利用JS混淆视频接口信息可以看出P站对网站的管理上更严格了,最早P站是可以直接被反向代理的,并且视频也能播放,也就是国内也可以通过反代P站观看上面的视频,之后可以反代但视频播放不了,到现在P站通过各种限制连反代都不行了。那么如何绕过这种限制白嫖视频呢?
毕竟我依旧是喜欢搞事情嘛,站在对立的角度思考问题,如果我是做灰产的,想要白嫖P站的视频该如何实现呢?为什么说是白嫖,假如一个porn网站(单纯为了引流)本身不提供视频资源,那就需要从别处拿到资源可以播放,这样就节省了自身大量的带宽和硬盘来存储资源,这也是为什么P站不让反代的原因之一吧。
趁着现在寒假在家的时间,就研究了一番,先看一下以前是如何反代P站的。
修改nginx的配置文件,并对里面的视频链接里的域名替换为当前的域名。以前这样一点问题都没有,加上视频资源的域名phncdn本身没被墙,国内可以直接播放视频。再看下P站是如何禁止反代的。
一开始发现能加载,但是一旦网站加载完成就会出现下面的页面了。
跳转到了pornhub的首页,这里没挂代理也就无法显示了,既然是页面先加载后再跳转的可以猜测是用js实现的,虽然也可以通过反代的时候替换js来绕过,但是js可以随时改,一旦改了就又失效了,之前我在其他网站上试过,事实证明这样并不可行。因为视频本身也做了限制,我们在不完整加载页面的情况下接着看。
打开控制台观察请求信息,发现m3u8的请求是403也就是被拒绝,因为现在P站也改成视频流了,把一个视频文件拆分成了很多个ts文件。而m3u8就是ts的索引文件,有这个文件就能拿到所有的ts链接。
同样对视频本身的请求也是403。这里说明一下,这也是为什么使用我插件的小伙伴为什么出现403的原因,因为你没有开全局代理,请求视频的时候是你自己的ip而不是代理服务器的ip,自然就被拒绝了。那么该如何绕过重重限制呢?
一开始我尝试了一下网上小伙伴的思路,通过替换m3u8文件内的域名实现反代,但是在P站这里并不适合。因为要对m3u8替换,就要先替换phncdn的域名才行,由于P站对视频接口信息进行了js混淆,无法直接替换。
既然这样不行,所以我思考能不能在视频本身上想办法。用我自己的插件提取先从提取出链接,观察视频的加载情况,有趣的是用插件提取出来的视频链接并不是视频流。
这里还是以考研视频为例,206是什么意思呢?
- 解决大文件下载问题
- 解决CDN和原始HTTP服务器问题
- 使用工具例如lftp,wget,telnet测试断电续传
所以我就在想为什么不直接代理用nginx代理这个视频本身呢?而且我之前用Python写过P站混淆的url提取代码,这里就可以直接用上了。
这里我线尝试了在不设置其他参数的情况下直接代理视频链接,然后就报错了。
我仔细思考后觉得因为是视频的缘故,而视频文件本身也很大,直接反代肯定会出现传输上速度的差异,那么nginx是否可以实现代理缓存呢?一番谷歌之后发现确实可以,也就是设置proxy_buffering,先看几个关键的参数。
代理缓冲区
代理服务器可以缓存一些响应数据,来减少I/O损耗,数据默认存储在内存中,当内存不够时,会存储到硬盘上。
proxy_buffering
proxy_buffering这个参数用来控制是否打开后端响应内容的缓冲区。proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。 临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定的。
proxy_buffers
proxy_buffers的缓冲区大小一般会设置的比较大,以应付大网页。 proxy_buffers当中单个缓冲区的大小是由系统的内存页面大小决定的,Linux系统中一般为4k。 proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘。
proxy_busy_buffers_size
proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的
那么该如何设置呢,下面是我写的配置文件,因为通过观察P站原视频的链接发现,都是phncdn的子域名,那么我也用相同的子域名来代替。
server { listen 80; server_name cv.zgao.site; location / { proxy_pass https://cv.phncdn.com/; proxy_buffering on; proxy_buffer_size 32k; proxy_buffers 4 4m; proxy_busy_buffers_size 8m; proxy_max_temp_file_size 256m; } } server { listen 80; server_name dv.zgao.site; location / { proxy_pass https://dv.phncdn.com/; proxy_buffering on; proxy_buffer_size 32k; proxy_buffers 4 4m; proxy_busy_buffers_size 8m; proxy_max_temp_file_size 256m; } }
不过我在写nginx配置文件的时候也踩过一些坑,大家可以参考一下。
错误提示:“proxy_busy_buffers_size” must be less than the size of all “proxy_buffers” minus one buffer
这个的意思是即大于等于proxy_buffer_size和proxy_buffers的一块缓存区大小中的最大值,小于proxy_buffers总容量减去一块缓冲区的大小。
我的子域名是用的zgao.site,所以cv.zgao.site对应的就是https://cv.phncdn.com/ ,依次对应,同样在域名控制台添加解析记录。
将这些子域名同时解析到当前的反代服务器ip,就可以反代pornhub的视频了。这里我在测试的时候顺便写了个简单前端页面来接收视频id。
后端我用Python脚本请求P站该视频页面,从混淆代码中提取出视频URL,再进行替换。
对应的链接也是我们的子域进行反向代理。
视频成功加载,这样无需翻墙也可在国内观看Pornhub了。
这里我是用的阿里云香港节点的vps来做的测试,带宽为30M。使用Nginx的缓存还有一个好处就是视频的加载速度更快了,因为服务器的入口带宽都是上G的,他帮我们请求P站视频的速度要快的多,又恰好利用Nginx缓存来处理这个速度差,观看体验就舒服多了。
同理,国内的一些porn网站要想白嫖P站的视频同样可以用这个思路来实现。所以为了避免被黑灰产利用,文中的部分部分代码我没有展示,仅作为我想到的一种思路分享。
赞赏微信赞赏支付宝赞赏
34条评论