package com.sxit; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Scanner; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.GzipDecompressingEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONObject; /** * @功能:QQ空间相册批量下载(公开相册) * @作者: smile * @时间:2013-2-5 下午6:08:56 * @版本:1.0 */ public class QQPic { private static HttpClient client = new DefaultHttpClient(); // 存放图片信息Bean private static List<QQBean> pList = new ArrayList<QQBean>(); // 服务器前缀 private static List<String> list = new ArrayList<String>(); static { // 连接超时3秒中 轮询 网速不好的时候这个可以改大点 client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000); // 读取超时 // client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 3000); // 相册默认服务器前缀 list.add("hzalist"); // 图片默认服务器前缀 list.add("hzplist"); // 下面这些是备用的 // list.add("hzup"); // list.add("hz"); // // list.add("gzup"); // list.add("gz"); // list.add("gzalist"); // list.add("gzplist"); // // list.add("up"); // list.add("alist"); // list.add("plist"); // list.add("xaup"); // list.add("xa"); // // list.add("alistbak"); // list.add("plistbak"); // list.add("xaalistbak"); // list.add("xaplistbak"); } public static void main(String[] args) { Random rand = new Random(); try { while (true) { long before = System.currentTimeMillis(); String s = ""; for (int i = 0; i < 9; i++) { s += rand.nextInt(9); } // 验证是否能够访问 String msg = sexAnalyse(s); if (!msg.equals("xxoo")) { System.out.println("开始访问QQ号为:" + s + "的空间"); // Scanner scan = new Scanner(System.in); // String qq = ""; // System.out.println("请输入你的QQ号:"); // qq = scan.nextLine(); // String password = ""; // System.out.println("请输入你的QQ号密码:"); // password = scan.nextLine(); // String target = ""; // System.out.println("请输入目标的QQ号:"); // target = scan.nextLine(); // login(qq, password, target, "男"); login("*******", "*******", s, msg); long after = System.currentTimeMillis(); System.out.println("QQ号为:" + s + ":总共花费" + (after - before) / 1000 + "s"); } } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } // 区分男女 有无权限 public static String sexAnalyse(String qq) throws ClientProtocolException, IOException { HttpGet get = new HttpGet("http://user.qzone.qq.com/" + qq); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("Accept-Encoding", "gzip, deflate"); get.setHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); HttpResponse response = client.execute(get); String entity = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity())); // System.out.println(entity); if (entity.indexOf("她的主页") > 0) { System.out.println("QQ号为:" + qq + "是女的空间,访问!"); return "女"; } else if (entity.indexOf("温馨提示") > 0) { System.out.println("QQ号为:" + qq + "是无效空间,不访问!"); } else if (entity.indexOf("无权限") > 0) { System.out.println("QQ号为:" + qq + "无权限,不访问!"); } else if (entity.indexOf("他的主页") > 0) { System.out.println("QQ号为:" + qq + "是男的空间,访问!"); return "男"; } return "xxoo"; } // 验证是否存在该文件 不存在则创建 public static void isUserFile(String sex, String targetname) { File f = new File("E:\\tmp\\" + sex + "\\" + targetname); if (!f.exists()) { f.mkdir(); } } // 验证是否存在该文件 不存在则创建 public static void isAblumFile(String sex, String targetname, String ablumname) { File f = new File("E:\\tmp\\" + sex + "\\" + targetname + "\\" + ablumname); if (!f.exists()) { f.mkdir(); } } // 下载 public static void upload(String targetname) throws Exception { InputStream is = null; OutputStream os = null; URL url = null; HttpURLConnection con = null; try { if (pList != null && pList.size() > 0) { System.out.println("开始下载,图片总量为:" + pList.size()); for (int i = 0; i < pList.size(); i++) { try { QQBean bean = pList.get(i); // 性别 String sex = bean.getSex(); // 用户目录 String targetFile = bean.getTargetName(); isUserFile(sex, targetFile); // 相册目录 String albumFile = bean.getAlbumName(); albumFile = albumFile.replace(".", "").replace("\\", "").replace("/", "").replace(",", "").replace(",", "").replace("。", "").replace("<", "").replace(">", "").replace("《", "").replace("》", "").replace("(", "").replace(")", "").replace("(", "").replace(")", "").replace("!", "").replace("@", "").replace("#", "").replace("$", "").replace("%", "").replace("^", "").replace("&", "").replace("&", "").replace("*", "").replace("-", "").replace("——", "").replace("+", "").replace("=", "").replace("[", "").replace("]", "").replace("{", "").replace("}", "").replace(";", "").replace("'", "").replace(":", "").replace("\"", "").replace(" ", "").replace("?", "").replace("?", ""); isAblumFile(sex, targetFile, albumFile); url = new URL(bean.getPicUrl()); con = (HttpURLConnection) url.openConnection(); // 设置连接超时 con.setConnectTimeout(5 * 1000); // 设置读取超时 con.setReadTimeout(10 * 1000); is = new BufferedInputStream(con.getInputStream()); File f = new File("E:\\tmp\\" + sex + "\\" + targetFile + "\\" + albumFile + "\\" + (bean.getIndex() + 1) + ".jpg"); os = new BufferedOutputStream(new FileOutputStream(f)); byte[] b = new byte[1024]; int length = 0; while ((length = is.read(b)) != -1) { os.write(b, 0, length); } os.flush(); if (i != 0 && i % 10 == 0) { System.out.print("第" + (i + 1) + "张图\t"); } else { if ((i + 1) % 10 == 0) { System.out.print("第" + (i + 1) + "张图\n"); } else { System.out.print("第" + (i + 1) + "张图\t"); } } } catch (Exception e) { e.printStackTrace(); continue; } } System.out.println("\n+++++++++++++++图片下载完毕+++++++++++++++"); } else { System.out.println("无相片信息!"); } } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } } // 登入空间 public static void login(String username, String password, String targetname, String sex) throws Exception { // 获取验证码 HttpGet get = new HttpGet("http://check.ptlogin2.qq.com/check?uin=" + username + "&appid=549000913&ptlang=2052&js_type=2&js_ver=10009&r=" + Math.random()); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0"); HttpResponse response = client.execute(get); String entity = EntityUtils.toString(response.getEntity()); // System.out.println(entity); String[] checkNum = entity.substring(entity.indexOf("(") + 1, entity.lastIndexOf(")")).replace("'", "").split(","); // System.out.println(checkNum[0]); // System.out.println(checkNum[1]); // System.out.println(checkNum[2].trim()); // System.out.println(checkNum[2].trim().replace("\\x", "")); password = QQmd5.GetPassword(checkNum[2].trim(), password, checkNum[1].trim()); // 加密后的密码 // System.out.println(password); // 登录 用自己的QQ登入扒好友的相冊 跑了一小时就显示网络异常 get = new HttpGet("http://ptlogin2.qq.com/login?ptlang=2052&u=" + username + "&p=" + password + "&verifycode=" + checkNum[1] + "&aid=549000913&u1=http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert&action=7-26-87449&g=1&t=2&dummy=&js_type=2&js_ver=10009"); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("Accept-Encoding", "gzip, deflate"); get.setHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); response = client.execute(get); entity = EntityUtils.toString(response.getEntity()); // System.out.println(entity); // if (entity.indexOf("登录成功") > -1) { get = new HttpGet("http://user.qzone.qq.com/" + username); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("Accept-Encoding", "gzip, deflate"); get.setHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); response = client.execute(get); Header header = response.getEntity().getContentEncoding(); // 判断页面是否被压缩过 // if (header != null) { // for (HeaderElement element : header.getElements()) { // if (element.getName().equalsIgnoreCase("gzip")) { // entity = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity())); // break; // } // } // } entity = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity())); // System.out.println(entity); /********************************************************************************************* * 用户已登入 开始访问别人用户相册 50e50923-2f1a-4eda-86d5-7887749dc16d V12CIRQc0rx9Bu http://gzalist.photo.qq.com/fcgi-bin/fcg_list_album_v2? inCharset=gbk&outCharset=gbk&hostUin=909042702¬ice=0&callbackFun= &format=jsonp&plat=qzone&source=qzone&appid=4&uin=461504978&t=0.6304595777950794&g_tk=1446409337 http://hzalist.photo.qq.com/fcgi-bin/fcg_list_album_v2?inCharset=gbk&outCharset=gbk&hostUin=315597239¬ice=0&callbackFun=&format=jsonp&plat=qzone&source=qzone&appid=4&uin=461504978&t=0.2735186883334789&g_tk=1446409337 *********************************************************************************************/ // 存放可以访问的每个相册名和id List<String> ablumStr = new ArrayList<String>(); for (int i = 0; i < 1; i++) { // 轮询前两个前缀直接跳出 默认服务器 if (i == 2) { break; } // 这里是获取相册id get = new HttpGet("http://" + list.get(i) + ".photo.qq.com/fcgi-bin/fcg_list_album_v2?inCharset=gbk&outCharset=gbk&hostUin=" + targetname + "¬ice=0&callbackFun=&format=jsonp&plat=qzone&source=qzone&appid=4&uin=" + username + "&t=" + Math.random() + "&g_tk=1446409337"); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("Accept-Encoding", "gzip, deflate"); get.setHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); try { response = client.execute(get); entity = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity())); entity = entity.substring(10, entity.length() - 2); JSONObject json = new JSONObject(entity); json = (JSONObject) json.get("data"); JSONArray array = json.getJSONArray("album"); // System.out.println(array.length()); if (array != null) { // System.out.println("****************************************"); // System.out.println("相册在" + list.get(i) + "前缀服务器上,共有"+array.length()+"个相册"); for (int j = 0; j < array.length(); j++) { JSONObject obj = (JSONObject) array.get(j); // 是否能够访问allowAccess 1为可以访问 String allowAccess = obj.get("allowAccess").toString(); if (allowAccess.equals("1")) { // 相册id String id = obj.get("id").toString(); // 相册名 String name = obj.get("name").toString(); // 贴图相册、新建相册、头像相册 过滤掉 if (name.indexOf("贴图相册") > -1 || name.indexOf("新建相册") > -1 || name.indexOf("QQ秀") > -1 || name.indexOf("头像相册") > -1) { continue; } // System.out.println(allowAccess + "----" + name + "-----" + id); ablumStr.add(id + "***|***" + name); } } break; } } catch (Exception e) { // e.printStackTrace(); continue; } } /****************************************************************************************** * 接下来依次访问每个相册 http://hzplist.photo.qq.com/fcgi-bin/fcg_list_photo_v2?inCharset=gbk&outCharset=gbk&hostUin=315597239¬ice=0&callbackFun=&format=jsonp&plat=qzone&source=qzone&appid=4&uin=461504978&albumid=V10rZ6LV1hOlI9&t=0.0017526895933080988&g_tk=1446409337 ******************************************************************************************/ if (ablumStr != null && ablumStr.size() > 0) { int count = 0; for (String str : ablumStr) { ++count; String[] s = str.split("\\*\\*\\*\\|\\*\\*\\*"); String albumid = s[0]; String albumname = s[1]; // System.out.println(albumid); for (int i = 1; i < 2; i++) { // 轮询前两个前缀直接跳出 默认服务器 if (i == 2) { break; } get = new HttpGet("http://" + list.get(i) + ".photo.qq.com/fcgi-bin/fcg_list_photo_v2?inCharset=gbk&outCharset=gbk&hostUin=" + targetname + "¬ice=0&callbackFun=&format=jsonp&plat=qzone&source=qzone&appid=4&uin=" + username + "&albumid=" + albumid + "&t=" + Math.random() + "&g_tk=1446409337"); get.setHeader("Accept", "application/javascript, */*;q=0.8"); get.setHeader("Accept-Encoding", "gzip, deflate"); get.setHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); JSONObject json2 = null; try { response = client.execute(get); entity = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity())); entity = entity.substring(10, entity.length() - 2); json2 = new JSONObject(entity); json2 = (JSONObject) json2.get("data"); JSONArray array2 = json2.getJSONArray("pic"); if (array2 != null && array2.length() > 0) { // System.out.println("****************************************"); // System.out.println("相册"+count+"的图片在" + list.get(i) + "前缀服务器上,共有"+array2.length()+"张"); for (int j = 0; j < array2.length(); j++) { JSONObject obj = (JSONObject) array2.get(j); // 图片真实地址 String pUrl = obj.getString("url"); // System.out.println(pUrl); pUrl = StrUtil.parse(pUrl); QQBean bean = new QQBean(pUrl, albumname, targetname, j, sex, array2.length()); // 保存这张图片 pList.add(bean); } break; } } catch (Exception e) { // e.printStackTrace(); continue; } } } if (pList != null && pList.size() > 0) { upload(targetname); } } // } } }
相关推荐
《C#实现的QQ空间相册照片获取工具详解》 在信息技术日新月异的今天,数据抓取和分析已经成为了一项重要的技能。本篇文章将深入探讨一款由C#编程语言编写的QQ空间相册照片获取工具,它能帮助用户轻松获取他人QQ空间...
通过以上步骤,我们可以构建一个高效且稳定的QQ空间相册图片爬虫。不过,值得注意的是,任何网络爬虫都应遵守相关法律法规,尊重网站的robots.txt协议,避免对目标网站造成过大压力。此外,频繁使用代理IP可能会触及...
QQ空间相册批量下载器是一款专门针对QQ空间相册设计的工具,旨在帮助用户快速、方便地批量下载自己或他人QQ空间中的照片。这款软件在IT领域中的应用主要是解决了一个特定的问题,即如何高效地获取并保存网络上的图片...
"QQ空间相册批量下载"工具正是针对这一需求设计的,它允许用户方便快捷地下载自己或他人QQ空间中的所有图片。这个工具的存在极大地便利了那些希望备份或整理QQ相册图片的用户,避免了手动逐张下载的繁琐过程。 批量...
"最新qq空间相册批量下载"是一个工具或程序,旨在帮助用户快速、便捷地下载他们或者他人的QQ空间相册中的所有图片。批量下载的功能对于备份个人照片、整理资料或者收集特定相册的内容非常实用。 首先,我们要理解...
"QQ空间相册下载-非常好用" 指的是一款工具或软件,它专门设计用于帮助用户批量下载他们在QQ空间中的相册图片。这款工具可能具有用户友好的界面和高效的下载功能,使得用户能够轻松备份或保存自己或他人QQ空间相册内...
QQ空间相册查看工具是一款专为用户设计的用于浏览QQ空间相册的应用程序。这款工具可能允许用户在不登录QQ账号的情况下,查看公开的QQ空间相册内容,但请注意,任何未经许可的侵入他人隐私的行为都是违法的,应当遵守...
9. **反爬虫技术**:为了防止恶意用户通过自动化工具抓取加密相册内容,QQ空间可能会采用反爬虫策略,如验证码、IP限制和User-Agent检测等。 10. **法律与政策**:在使用加密相册和相关工具时,用户应遵守相关法律...
QQ空间相册批量下载源码是一款专为用户设计的工具,允许用户快速、方便地从QQ空间中批量获取并保存个人或他人的相册图片。这个软件的核心价值在于其源码的开放性,使得开发者和爱好者可以深入研究,学习网络爬虫、...
总结起来,“陌兮QQ空间相册实时赞 v1.0”是一款专为QQ空间用户设计的自动化点赞工具,利用事件驱动编程和网络爬虫技术实现对新照片的实时监测和点赞。它还支持自定义设置和安全的QQ登录,以满足用户的个性化需求。...
8. **工具使用**:除了手动编写爬虫,还可以利用现成的工具或脚本,如“QQ空间相册下载器”,它们已经实现了上述功能,用户只需输入QQ号即可批量下载。 9. **API接口**:虽然QQ空间没有官方提供用于批量下载照片的...
在技术实现上,QQ空间相册助手可能采用了网络爬虫技术,通过模拟用户登录QQ空间,解析网页结构,抓取图片链接,再通过HTTP或HTTPS协议下载图片。考虑到QQ空间的权限设置,该助手可能还集成了身份验证机制,以确保...
首先,要批量下载QQ空间的照片,你需要一个能够登录并解析QQ空间相册链接的工具。在这个案例中,我们提到的“QQ空间相片批量下载”工具可能就是一个这样的应用,如`QQAlbum.exe`。这个程序可能包含了一个内置的...
总之,“起点QQ空间相册一键批量下载软件 v1.1”是一款结合了网络技术、多线程编程和用户体验设计的实用工具,为用户提供了方便快捷的QQ空间相册图片下载体验。对于IT从业者来说,了解和研究这类工具的实现原理,有...
在QQ相册查看方面,该查询器可能采用了网络爬虫技术,通过模拟用户行为抓取并解析QQ空间的公开信息。爬虫会按照一定的规则遍历和提取网页数据,如图片链接、相册名称、上传日期等,并将这些信息整合展示给用户。用户...
在这个过程中,【qzonePictureSetupV3.exe】很可能是一个专门用于下载QQ空间相册的软件安装程序。执行这个程序,用户可以安装一个支持批量下载QQ空间相册的应用。安装完成后,用户通常需要登录他们的QQ账号,授权该...
相册批量下载器通过模拟用户浏览行为,抓取QQ空间相册中的图片链接。它能够快速识别并保存指定相册内的所有图片,而无需用户逐个点击下载。这大大提高了效率,特别是对于那些需要备份或整理大量图片的用户来说,如...
Python爬虫技术在数据获取和网络资源挖掘方面有着广泛的应用,尤其在抓取社交媒体平台上的信息时,如QQ空间的说说和图片。本篇将详细介绍如何使用Python爬虫来爬取QQ空间的K站图片。 首先,我们需要理解Python爬虫...
获取QQ空间的截图,通常需要手动操作,但通过编程,我们可以自动抓取并保存指定页面的内容,比如个人主页、相册图片等。 教程中的“一键获取”功能,可能涉及到的技术包括网络爬虫和数据解析。网络爬虫用于访问QQ的...
更支持QQ空间动态浏览访客采集(一般好友刷新空间的时候会留下痕迹在动态浏览里,类似于抓取竞争对手的好友,超强功能)请注意:同样是有权限才行,没有权限仍然采集不了 注意,软件目前支持采集最新访客,相册访客...