白嫖?妙用Nginx的proxy_buffer实现Pornhub视频反代

白嫖?妙用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是什么意思呢?

HTTP 206 Partial Content 成功状态响应代码表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 Range 首部指定的。如果只包含一个数据区间,那么整个响应的 Content-Type 首部的值为所请求的文件的类型,同时包含  Content-Range 首部。HTTP/1.1 206状态码表示的是:”客户端通过发送范围请求头Range抓取到了资源的部分数据”,一般用来

  • 解决大文件下载问题
  • 解决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站的视频同样可以用这个思路来实现。所以为了避免被黑灰产利用,文中的部分部分代码我没有展示,仅作为我想到的一种思路分享。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

34条评论

www 发布于7:30 下午 - 7月 9, 2021

想只反代网站,有什么好方法吗
另外博主这个saveporn.net已经实现好久了

瑞克亨特 发布于4:33 下午 - 4月 3, 2021

所以大佬最终实现的是在知道P站视频ID的情况下实现视频反代直连的是吗,但是,正常用户逻辑来看是不可能在未翻墙的情况下(如果无法实现正常反代网站的话)知道视频ID的也就无法填写对应ID进行视频直连,所以这个在反代的角度来说是个死胡同呢。所以现在的问题依然是卡在如何完整反代网站上吧额。

    Zgao 发布于7:10 下午 - 4月 7, 2021

    是真的反代了视频本身。

匿名 发布于3:42 下午 - 9月 5, 2020

插件被封了,能拯救下么

duohub 发布于10:58 上午 - 8月 13, 2020

如果很多子域名的话,这样一个个配置有点麻烦,不如传参方式转发

匿名 发布于12:29 下午 - 5月 11, 2020

干得漂亮,思路不错,收藏了

365cent 发布于10:52 上午 - 4月 13, 2020

呐,我的反代https://vu.qnid.cc
(虽然p站电脑版还没修好

    22 发布于2:18 下午 - 4月 29, 2020

    666666666666

    wow 发布于9:38 上午 - 5月 10, 2020

    牛逼,已收藏。

    kidcools 发布于7:57 下午 - 11月 14, 2020

    你好 https://vu.qnid.cc 很不错 能一起参与你的项目中合作开发么?

      kidcools 发布于7:58 下午 - 11月 14, 2020

      你好 https://vu.qnid.cc 很不错 能一起参与你的项目中合作开发么? 不好意思刚才的邮箱弄错了 我的V:kidcools

匿名 发布于12:16 上午 - 4月 13, 2020

学习了

addice1019 发布于4:11 上午 - 4月 2, 2020

大神太强了,放出张宇数学来迷惑我!

    匿名 发布于12:00 下午 - 4月 2, 2020

    chajianguale

無助 发布于9:30 下午 - 4月 1, 2020

大神,插件不能用了,快幫忙啊

插件挂了 发布于11:10 上午 - 4月 1, 2020

大神啊~!插件挂逼了!!!你快回来啊!

    阿中 发布于4:09 下午 - 4月 1, 2020

    插真的挂了…….

mao 发布于10:47 上午 - 4月 1, 2020

大神,插件不能用了,能更新吗?感谢

Doe Boy 发布于10:01 上午 - 4月 1, 2020

Well, It was Great while it lasted!! Hope you update it Quickly!

续一秒 发布于8:58 上午 - 4月 1, 2020

昨晚还可以的,今早插件就不能用了。。。

    匿名 发布于9:01 上午 - 4月 1, 2020

    用idm抓取可以抓取所有清晰度

    匿名 发布于9:16 上午 - 4月 1, 2020

    我很多收藏都变ts了,一些不热门的还能下,正在拼命拯救。用vps上的aria2下下来传gdrive

      格拉条 发布于5:24 下午 - 4月 27, 2020

      可以用ffmpeg来把ts拉下来

匿名 发布于6:34 上午 - 4月 1, 2020

不能用了~~四月1号6:34分

匿名 发布于6:20 上午 - 4月 1, 2020

不能用了emm

yn 发布于6:19 上午 - 4月 1, 2020

今天早上不能用了

地方 发布于5:14 上午 - 4月 1, 2020

突然不能用了

匿名 发布于12:53 下午 - 3月 31, 2020

接受我的膜拜

匿名 发布于3:25 下午 - 3月 27, 2020

请求来一个破解下载版。收费也可以

匿名 发布于12:00 下午 - 3月 26, 2020

谢谢分享

虚幻 发布于8:47 下午 - 3月 24, 2020

虽然完全看不懂 但还是顶一下
大佬 你有没有爬pixiv的教程

哈哈色 发布于8:41 下午 - 3月 19, 2020

虽然看不懂,但是不凡爱我膜拜一下

卢本伟 发布于5:08 下午 - 3月 12, 2020

表示 很NIUPI

西丽西丽 发布于9:13 下午 - 3月 10, 2020

表示完全看不懂………

回复 哈哈色 取消回复