抓觅知网素材网站下载接口的记录

 Hygge   2021-03-12 08:15   220 人阅读  0 条评论

前言

    最近接了单子,客户网站是解析各大素材网站的一个中间商。


    我负责去抓以下几个素材站(昵图网,字魂网,摄图网,觅知网)的资源下载接口。


    本文重点说下觅知网,其他几个网站没有难度。

image.png

觅知网

听说是有什么防盗链和下载协议,过程刚开始挺顺利的

image.png

我以为这么简单就结束了...没想到这才是开始。


得到的下载地址无法使用,直接访问 or postman发包 都是403 无权限。


后来洗头的时候灵感来了,用laravel写了个中转或者说是代理的网站(具体的实现细节 不方便透露),可以实现下载


测试的网址是我本地搭建的,不支持外网访问。


image.png

当我以为没问题的时候,就上传到服务器中了,然后就有问题,laravel的项目 上线 除了 / 之外的路由访问都是404,好吧,我想这可能是重定向的问题。 


image.png


按照上图中配置后,就可以进行访问了。


第一版测试


刚开始构思这个中转的时候就想如何优雅的设计一个转发?


好吧,刚开始确实没想起来好的解决方案,于是乎。。 直接将文件缓存到内存中 然后返回给客户端的浏览器。

// 以下是第一版的部分关键代码:
Header ( "Content-type: application/octet-stream" );
//请求范围的度量单位 
Header ( "Accept-Ranges: bytes" ); 
//Content-Length是指定包含于请求或响应中数据的字节长度   
Header ( "Accept-Length: 555"  ); 
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header ( "Content-Disposition: attachment; filename={$title}.zip");   
$data = curl_exec($curl);
echo $data;

缺点:

  1. 响应非常非常慢,约等于是将文件下载到服务器,然后从服务器返回给用户。

  2. 要是等于的话还好,但是是约等于,因为是下载到内存中,所以等下载的文件大小超出的话,就会造成内存溢出。

测试时 服务器只支持10m左右的文件。


第二版测试

 经历了第一版后可以把问题定位在文件转发这边了。


 想着有没有如java那般的缓冲区,或者nodejs那般的输出流管道直接对接写入流?


 可以避免大文件的缓存,实现边转发边下载?


 终于终于,百度了一下 还是有人和我有同样的需求,也感谢前辈们铺下的路

header('Content-Description: File Transfer');
header('Content-Type: application/vnd.android.package-archive');
header('Content-Disposition: attachment; filename=' . $title.'.zip');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0);
// 关键代码
curl_setopt($curl, CURLOPT_WRITEFUNCTION, function ($ch, $buffer) {
    echo $buffer;
    return strlen($buffer);
});
curl_exec($curl);
curl_close($curl);

image.png


实现了 服务器端 边转发  客户端 边下载,而不用去把整个文件都下载完再传给客户端。


速度是没有限制的或者可能隐藏的限制就是php内部设计CURLOPT_WRITEFUNCTION 时所设置的$buffer的大小


不过已经很满意了,网站上线之后测试下载大文件可以跑到10m/s ,我知道这个速度差不多是我家的极限啦。


总历时 一天多的难题到此就结束啦。

本文地址:https://blog.lisok.cn/post/32.html
版权声明:本文为原创文章,版权归 Hygge 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?