/**/ /************************************************************************************************/ /**/ /**** File: GetImages.js ****/ /**/ /**** Version: 1.0.1 ****/ /**/ /**** Description: ****/ /**/ /**** Save all pictures in current web page to a specified local folder ****/ /**/ /**** Author: the3gwireless ****/ /**/ /**** URL: www.the3gwireless.com ****/ /**/ /**** Last Update: 2007.7.16 ****/ /**/ /**** Q/A or Bug Report: sam4it@gmail.com ****/ /**/ /**** 注:转载请标明出处 ****/ /**/ /************************************************************************************************/ // 主程序开始 var sDestFolder = " C:/Users/Sam/Pictures/pic/ " ; // 图片将被保存到的本地目录,用户可以自己修改 var SILENT = false ; // true 表示安静模式,整个程序在后台运行,在保存图片过程中不会有状态条和消息提示 CheckLocalFolder(sDestFolder); // 判断即将保存图片的本地目录是否存在,如果不存在,则建立此目录 var sSrcUrl = GetUrl(); // 获得当前浏览器地址栏里的网址 // WScript.Echo(sSrcUrl); if (sSrcUrl == null ) ... { WScript.Echo("获取当前网页地址失败,请重试。"); WScript.Quit();} var count = 0 ; var errors = 0 ; var imagesArray = GetImagesUrl(sSrcUrl); // 获得指定网址里所有的图片地址 if (imagesArray == null ) ... { WScript.Echo("未知错误!不能从当前的网页下载图片。"); if (!SILENT)...{ CloseGauge(); } WScript.Quit();} for (i = 0 ;i < imagesArray.length;i ++ ) ... { var imageUrl; var imageLocal = imagesArray[i].substring(imagesArray[i].lastIndexOf("/")+1); if (imageLocal.indexOf("?")>0)...{ //有些网站在图片名后边跟了一些无用的东西,用"?"分割,这里将这些东东清理掉 imageLocal = imageLocal.substring(0,imageLocal.indexOf("?")); } imageUrl = imagesArray[i]; //WScript.Echo(imageUrl); var result = GetImageFile(sDestFolder,imageUrl,TimeStamp()+"_"+imageLocal); //保存图片,并在文件名上打上时间戳,便于以后归档整理,同时也避免重名情况 if (result) count++;} if ( ! SILENT) ... { CloseGauge(); WScript.Echo("抓图结束,一共抓了"+count+"张图,"+errors+"张图出错!");} // 主程序结束 // =============================================================================== // Function Name: CloseGauge // Description: 关闭非安静模式下弹出的IE状态条 // Parameter(s): 无 // Return: 无 // =============================================================================== function CloseGauge() ... { oShell=new ActiveXObject("WScript.Shell"); oShell.AppActivate("http:// - about:blank - Microsoft Internet Explorer");//激活状态条窗口为当前窗口 oShell.SendKeys("%{F4}"); //发送系统按键 Alt+F4 关闭当前激活窗口} // =============================================================================== // Function Name: GetUrl // Description: 获取当前浏览器地址栏网页URL // Parameter(s): 无 // Return: null 表示失败 // =============================================================================== function GetUrl() ... { var oIE; var oShell; var url; try ...{ oShell=new ActiveXObject("WScript.Shell"); WScript.sleep(300); oShell.SendKeys("{F6}");//发送系统按键F6,激活浏览器地址栏,幸运的是FireFox等其他浏览器也支持此操作 oShell.SendKeys("^c"); //发送系统按键Ctrl+C,这个地球人都知道是做什么的 oIE = new ActiveXObject("InternetExplorer.Application"); // 创建 Internet Explorer application 对象. oIE.navigate("about:blank"); // 创建空文本 oIE.left=50; // 弹出窗口位置 oIE.top = 100; // 弹出窗口位置 oIE.height = 150; oIE.width = 450; oIE.menubar = 0; // 不显示菜单 oIE.toolbar = 0; // 不显示工具栏 oIE.statusbar = 0; // 不显示状态栏 if (SILENT) ...{ oIE.Visible = false; } else ...{ oIE.Visible = true; // 如果是非安静模式,将此窗口显示 } while (oIE.Busy) ...{;} // 非常重要: 一直等待到oIE对象准备好. obj = oIE.document.parentWindow.clipboardData; url = oIE.document.parentWindow.clipboardData.getData("text"); //将地址栏的内容从剪贴板里取出来 if (!SILENT) ...{ //以下代码创建一个假的进度条,不是本程序的重点,关于如何创建一个真的进度条,我还没有想好,如有时间,可能会在以后的版本中更新,欢迎网友讨论。 oIE.document.write("<HTML> "+ "<HEAD> "+ "<TITLE></TITLE> "+ "<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> "+ "</HEAD> "+ "<BODY BGCOLOR="#EAEAEA"> "+ "<form name=loading> "+ "<table border=0 cellpadding=0 cellspacing=0 width="100%" height="100%"> "+ "<tr> "+ "<TD align="center" valign="top"> "+ "<p><FONT color="000000" face="Arial"><BR> "+ "正在保存图片...</FONT></p> "+ "<p><input type=text name=chart size=46 style="font-family:Arial; font-weight:bolder; color:black; background-color:#EAEAEA; padding:0px; border-style:none;"> "+ "<br> "+ "<input type=text name=percent size=46 style="font-family:Arial; color:black; background-color:#EAEAEA;text-align:center; border-width:medium; border-style:none;"> "+ "<script>var bar = 0 "+ "var line = "||" "+ "var amount ="||" "+ "count(); "+ "function count(){ "+ "bar= bar+2 "+ "amount =amount + line "+ "document.loading.chart.value=amount "+ // "document.loading.percent.value=bar+"%" "+ "if (bar<99) "+ "{setTimeout("count()",200);} "+ "else "+ "{;} "+ "} "+ "</script></p></TD> "+ "</tr> "+ "</table> "+ "</FORM> "+ " "+ " "+ "</BODY> "+ "</HTML> " ); oShell.AppActivate("Internet Explorer"); } } catch (e)...{ WScript.Echo("出现异常: " + e+" " + "描述: " + e.description+" "); } if (SILENT) ...{ oIE.Quit(); } //WScript.Echo(url); return url;} // =============================================================================== // Function Name: GetImageFile // Description: 将指定网址的图片保存到本地目录中 // Parameter(s): argDestFolder 本地目录 // argSrcUrl 图像的URL // argImageFile 本地文件名 // Return: true 表示成功,false 表示失败 // =============================================================================== function GetImageFile(argDestFolder,argSrcUrl,argImageFile) ... { var index=true; var oHTTP = false; try ...{ oHTTP = new XMLHttpRequest(); } catch (trymicrosoft) ...{ try ...{ oHTTP = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) ...{ try ...{ oHTTP = new ActiveXObject("Microsoft.XMLHTTP"); } catch (failed) ...{ oHTTP = false; } } } if (!oHTTP)...{ WScript.Echo("初始化XMLHttpRequest对象出错!"); WScript.Quit(); } try...{ oHTTP.open("GET", argSrcUrl, false); oHTTP.send(); if (oHTTP.status != 200) ...{ //WScript.Echo("未知状态: " + oHTTP.status + " 原因:"+ oHTTP.statusText); errors++; index = false; } if (index)...{ var oStream = new ActiveXObject("adodb.stream"); var adTypeBinary = 1; var adSaveCreateOverWrite = 2; oStream.type = adTypeBinary; oStream.open(); oStream.write(oHTTP.responseBody); //WScript.Echo(argDestFolder+argImageFile); oStream.savetofile(argDestFolder+argImageFile,adSaveCreateOverWrite); oStream = null; oHTTP = null; return index; } else ...{ return index; } }catch (e)...{ return false; }} // =============================================================================== // Function Name: GetImagesUrl // Description: 将指定网址包含的所有图像信息保存在数据里并返回 // Parameter(s): argSrcUrl 指定的URL // Return: null 表示失败 // =============================================================================== function GetImagesUrl(sSrcUrl) ... { var index=true; var oHTTP = false; try ...{ oHTTP = new XMLHttpRequest(); } catch (trymicrosoft) ...{ try ...{ oHTTP = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) ...{ try ...{ oHTTP = new ActiveXObject("Microsoft.XMLHTTP"); } catch (failed) ...{ oHTTP = false; } } } if (!oHTTP)...{ WScript.Echo("初始化XMLHttpRequest对象出错!"); index = false; } oHTTP.open("GET", sSrcUrl, false); oHTTP.send(); if (oHTTP.status != 200) ...{ WScript.Echo("未知状态: " + oHTTP.status + " 原因:"+ oHTTP.statusText); index = false; } if (index)...{ //WScript.Echo(oHTTP.responseBody); //WScript.Echo(oHTTP.responseText); //WScript.Echo(oHTTP.responseXML); var charset = CharSetDetector(oHTTP.responseText); //获得当前使用的字符集 var oText = BytesToBSTR(oHTTP.Responsebody,charset); //将Raw数据根据制定字符集编码后返回正确的HTML网页内容 var sUrls = sSrcUrl.match(/(http://.*?/)/i); var sUrl;//将网站的URL解析出来,以后使用 if (sUrls!=null)...{ sUrl = sUrls[1]; }else ...{ sUrl = sSrcUrl; } var imagesArray = oText.match(/<img .*?>/ig);//使用正则表达式将<img .*?>选中 if (imagesArray!=null)...{ for (i=0;i<imagesArray.length;i++)...{ imagesArray[i] = imagesArray[i].substring(imagesArray[i].indexOf("src=")+4,imagesArray[i].length-1); var tmp = imagesArray[i].indexOf(" "); if (tmp >0) ...{ imagesArray[i] = imagesArray[i].substring(0,tmp); } //WScript.Echo(imagesArray[i]); imagesArray[i] = imagesArray[i].replace(/"/g,""); imagesArray[i] = imagesArray[i].replace(/'/g,""); //以下开始整理图片的路径,这里考虑到了相对路径和绝对路径等各种情况,很可能还不完全,网友可以自己补充 if (imagesArray[i].indexOf("http://")==0){ //标准的路径,什么也不做 }else...{ if (imagesArray[i].indexOf("../")==0)...{ if (sUrl.charAt(sUrl.length-1)=="/")...{ imagesArray[i].replace("../",sUrl); }else ...{ imagesArray[i].replace("..",sUrl); } }else ...{ if (sUrl.charAt(sUrl.length-1)=="/")...{ if (imagesArray[i].charAt(0)!="/")...{ imagesArray[i] = sUrl+imagesArray[i]; } else ...{ imagesArray[i] = sUrl + imagesArray[i].substring(1); } } else ...{ if (imagesArray[i].charAt(0)!="/")...{ imagesArray[i] = sUrl+"/"+imagesArray[i]; } else ...{ imagesArray[i] = sUrl + imagesArray[i]; } } } }//整理图片路径结束 } } oHTTP = null; return imagesArray; } else ... { return null; } } // =============================================================================== // Function Name: BytesToBSTR // Description: 将Raw数据根据制定字符集编码后返回正确的HTML网页内容 // Parameter(s): body 二进制数据,charset 字符集 // Return: null 编码后的HTML网页内容 // =============================================================================== function BytesToBSTR(body,charset) ... { var objstream; objstream = new ActiveXObject("adodb.stream"); objstream.Type = 1; objstream.Mode = 3; objstream.Open(); objstream.Write(body); objstream.Position = 0; objstream.Type = 2; objstream.Charset = charset; var bytesToBSTR = objstream.Readtext; objstream.Close; return(bytesToBSTR);} // =============================================================================== // Function Name: CharSetDetector // Description: 根据HTML网页内容判断该网页使用的字符集 // Parameter(s): oText HTML网页内容 // Return: 使用的字符集 // =============================================================================== function CharSetDetector(oText) ... { var charset; //自动判断编码开始 var charSets = oText.match(/charset=(S+)"/i); if (charSets != null){ charset = charSets[1]; }else{ charset = "UTF-8" //缺省采用UTF-8编码 } //自动判断编码结束 return charset;}//===============================================================================//Function Name: CheckLocalFolder//Description: 判断即将保存图片的本地目录是否存在,如果不存在,则建立此目录//Parameter(s): sDestFolder 本地目录//Return: 无//===============================================================================function CheckLocalFolder(sDestFolder){ var fso = new ActiveXObject("Scripting.FileSystemObject"); if (!fso.FolderExists(sDestFolder)){ fso.CreateFolder(sDestFolder); if (!SILENT){ WScript.Echo("图片将被存放在"+sDestFolder+"中。"); } } else { fso = null; }}//===============================================================================//Function Name: TimeStamp//Description: 返回当前系统的时间戳//Parameter(s): 无//Return: 当前系统时间戳//===============================================================================function TimeStamp(){ var date = ""; var timestamp = ""; date = new Date(); var month = date.getMonth() + 1; var day = date.getDate() + 1; var hours = date.getHours() ; var minutes = date.getMinutes() ; var seconds = date.getSeconds() ; timestamp += date.getYear(); if (month < 10){ timestamp += "0" + month; }else{ timestamp += month; } if (day < 10){ timestamp += "0" + day; }else{ timestamp += day; } if (hours < 10){ timestamp+="0"+hours ; }else{ timestamp += hours; } if (minutes < 10){ timestamp+="0"+minutes; }else{ timestamp += minutes; } if (seconds< 10){ timestamp+="0"+seconds; }else{ timestamp += seconds; } return(timestamp);}