php批量下载图片

  某论坛上有个爆照帖,帖子都顶到一千多楼了。为了满足窥私欲,故需要设计一批量下载指定用户名图的程序。

  之前的想法是直接用js实现,查了下说是用fso可以实现,其实从来没用过,看了下应该是对文件的操作,我估计可能不行。用js可以提取出下载的url,然后再在服务端进行下载。而提取url可以采取ajax轮询的操作,对n页进行ajax轮询,返回网页源码,新建一个div标签,将源码作为div标签的innerHTML内容插入,接下去就是dom的操作了~


 

服务端图片下载php代码:

 1 <?php
 2 function downloadFile($url, $savePath, $name = ‘‘)
 3 {
 4   if ($name == ‘‘)
 5   {
 6     $header = get_headers($url, 1);
 7     // 如果链接进行过跳转则匹配 location 之后的链接中的文件名
 8     if (isset($header[‘Location‘])) {
 9       $name = basename(str_replace(strstr($header[‘Content-Type‘][1], ‘?‘), ‘‘, $header[‘Location‘]));
10       // 如果没有找到文件名则自动以当前时间为名称
11       $name = ($name == ‘‘) ? time() . str_replace(‘/‘, ‘‘, strstr($header[‘Content-Type‘][1], ‘/‘)) : $name;
12     } else {
13       $name = basename(str_replace(strstr($header[‘Content-Type‘], ‘?‘), ‘‘, $url));
14     }
15   }
16   return file_put_contents($savePath .‘/‘. $name, file_get_contents($url));
17 }
18 
19 //保存图片路径
20 $savePath = dirname(__FILE__)."\images";
21 downloadFile($url, $savePath);
22 // downloadFile($_POST[‘content‘], $savePath);
23 // $a = dirname(__FILE__);
24 // echo $a;
25 ?>
View Code

 

  而客户端因为要进行ajax操作,所以写个同域的用户脚本就显得方便多了。对每页进行ajax操作后,回调函数中将回调的源码插入div中,然后对div进行dom操作,对用户名进行判断,如果符合,则对该层的img图片进行操作,提取url,post给后台,后台就可以下载了。详见注释

 

客户端js代码:

 1 // ==UserScript==
 2 // @name        downloadpic
 3 // @namespace   http://www.cnblogs.com/bigbigsunrise
 4 // @description 批量下载指定用户图片
 5 // @include     *
 6 // @require     http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js
 7 // @grant       GM_getValue
 8 // @grant       GM_setValue
 9 // @grant       GM_listValues
10 // @grant       GM_deleteValue
11 // @author      bigbigsunrise
12 // ==/UserScript==
13 
14 $.noConflict();
15 jQuery(document).ready(function($){
16   // 跟帖的页码
17   var firstindex = 1;
18   var lastindex = 100;
19   // url的前缀,自己定义
20   var preurl = ‘...‘;
21   for(var i = firstindex; i <= lastindex; i++) {
22     jQuery.ajax ({
23       type: ‘GET‘,
24       url: preurl + i,
25       dataType: ‘html‘,
26       async: true,  // 异步
27       success: function (msg) {
28         var a = document.createElement(‘div‘);
29         // 插入dom树,可以进行dom操作
30         a.innerHTML = msg;
31         // 以下的JQ操作其实可以大幅度优化,因为没有时间限制,所以暂时不优化了
32         var b = $(a).find(‘.pi‘).children(‘.authi‘).children(‘.xw1‘);
33         for(var i = 0; i < b.size(); i++) {
34           // 用户名的判断,自己定义
35           if(b.eq(i).html() === ‘username‘) {
36             var c = b.eq(i).parent().parent().parent().parent().find(‘.t_fsz‘).find(‘img‘);
37             for(var j = 0; j < c.size(); j++) {
38               // 获取url
39               var src = c.eq(j).attr(‘file‘);
40               if(!src) continue;
41               if(src.charAt(0) === ‘h‘)
42                 download(src);
43               else 
44                 // 自己定义
45                 download(‘http://.../‘ + src);
46             }
47           }
48         }
49       }
50     });
51   }
52 });
53 
54 function download(src) {
55   $.ajax({
56     type: ‘POST‘,
57     url: ‘http://127.0.0.1/download/index.php‘,
58     // dataType: ‘‘,
59     async: false,
60     // post的内容
61     data: {content:src},
62     success: function(msg) {
63       // alert(msg);
64     }
65   });
66 }

   这里说明下,js代码的第二个ajax其实是跨域了,控制台报错了不知道为什么还能继续执行。另外,如果知道了要下载的url,可以直接在后台定义数组,而邮件的发送则不能直接后台for循环操作,此处mark。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。