`
guzizai2007
  • 浏览: 359620 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

抓取QQ空间 相册图片

 
阅读更多
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&notice=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&notice=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 + "&notice=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&notice=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 + "&notice=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空间相册照片获取工具详解》 在信息技术日新月异的今天,数据抓取和分析已经成为了一项重要的技能。本篇文章将深入探讨一款由C#编程语言编写的QQ空间相册照片获取工具,它能帮助用户轻松获取他人QQ空间...

    python使用动态代理ip多线程爬取QQ空间相册

    通过以上步骤,我们可以构建一个高效且稳定的QQ空间相册图片爬虫。不过,值得注意的是,任何网络爬虫都应遵守相关法律法规,尊重网站的robots.txt协议,避免对目标网站造成过大压力。此外,频繁使用代理IP可能会触及...

    QQ空间相册批量下载器

    QQ空间相册批量下载器是一款专门针对QQ空间相册设计的工具,旨在帮助用户快速、方便地批量下载自己或他人QQ空间中的照片。这款软件在IT领域中的应用主要是解决了一个特定的问题,即如何高效地获取并保存网络上的图片...

    QQ空间相册批量下载

    "QQ空间相册批量下载"工具正是针对这一需求设计的,它允许用户方便快捷地下载自己或他人QQ空间中的所有图片。这个工具的存在极大地便利了那些希望备份或整理QQ相册图片的用户,避免了手动逐张下载的繁琐过程。 批量...

    最新qq空间相册批量下载

    "最新qq空间相册批量下载"是一个工具或程序,旨在帮助用户快速、便捷地下载他们或者他人的QQ空间相册中的所有图片。批量下载的功能对于备份个人照片、整理资料或者收集特定相册的内容非常实用。 首先,我们要理解...

    QQ空间相册下载-非常好用

    "QQ空间相册下载-非常好用" 指的是一款工具或软件,它专门设计用于帮助用户批量下载他们在QQ空间中的相册图片。这款工具可能具有用户友好的界面和高效的下载功能,使得用户能够轻松备份或保存自己或他人QQ空间相册内...

    QQ空间相册查看工具

    QQ空间相册查看工具是一款专为用户设计的用于浏览QQ空间相册的应用程序。这款工具可能允许用户在不登录QQ账号的情况下,查看公开的QQ空间相册内容,但请注意,任何未经许可的侵入他人隐私的行为都是违法的,应当遵守...

    空间加密相册查看

    9. **反爬虫技术**:为了防止恶意用户通过自动化工具抓取加密相册内容,QQ空间可能会采用反爬虫策略,如验证码、IP限制和User-Agent检测等。 10. **法律与政策**:在使用加密相册和相关工具时,用户应遵守相关法律...

    QQ空间相册批量下载源码

    QQ空间相册批量下载源码是一款专为用户设计的工具,允许用户快速、方便地从QQ空间中批量获取并保存个人或他人的相册图片。这个软件的核心价值在于其源码的开放性,使得开发者和爱好者可以深入研究,学习网络爬虫、...

    QQ空间相册实时赞 陌兮QQ空间相册实时赞 v1.0

    总结起来,“陌兮QQ空间相册实时赞 v1.0”是一款专为QQ空间用户设计的自动化点赞工具,利用事件驱动编程和网络爬虫技术实现对新照片的实时监测和点赞。它还支持自定义设置和安全的QQ登录,以满足用户的个性化需求。...

    qq空间照片批量下载

    8. **工具使用**:除了手动编写爬虫,还可以利用现成的工具或脚本,如“QQ空间相册下载器”,它们已经实现了上述功能,用户只需输入QQ号即可批量下载。 9. **API接口**:虽然QQ空间没有官方提供用于批量下载照片的...

    QQ空间相册助手 未来QQ空间相册助手 v1.0.1.16

    在技术实现上,QQ空间相册助手可能采用了网络爬虫技术,通过模拟用户登录QQ空间,解析网页结构,抓取图片链接,再通过HTTP或HTTPS协议下载图片。考虑到QQ空间的权限设置,该助手可能还集成了身份验证机制,以确保...

    QQ空间相片批量下载

    首先,要批量下载QQ空间的照片,你需要一个能够登录并解析QQ空间相册链接的工具。在这个案例中,我们提到的“QQ空间相片批量下载”工具可能就是一个这样的应用,如`QQAlbum.exe`。这个程序可能包含了一个内置的...

    QQ空间相册批量下载 起点QQ空间相册一键批量下载软件 v1.1

    总之,“起点QQ空间相册一键批量下载软件 v1.1”是一款结合了网络技术、多线程编程和用户体验设计的实用工具,为用户提供了方便快捷的QQ空间相册图片下载体验。对于IT从业者来说,了解和研究这类工具的实现原理,有...

    QQ多功能查询器,QQ相册查看

    在QQ相册查看方面,该查询器可能采用了网络爬虫技术,通过模拟用户行为抓取并解析QQ空间的公开信息。爬虫会按照一定的规则遍历和提取网页数据,如图片链接、相册名称、上传日期等,并将这些信息整合展示给用户。用户...

    空间相册批量下载

    在这个过程中,【qzonePictureSetupV3.exe】很可能是一个专门用于下载QQ空间相册的软件安装程序。执行这个程序,用户可以安装一个支持批量下载QQ空间相册的应用。安装完成后,用户通常需要登录他们的QQ账号,授权该...

    相册批量下载器

    相册批量下载器通过模拟用户浏览行为,抓取QQ空间相册中的图片链接。它能够快速识别并保存指定相册内的所有图片,而无需用户逐个点击下载。这大大提高了效率,特别是对于那些需要备份或整理大量图片的用户来说,如...

    python爬QQ空间说说K站图片

    Python爬虫技术在数据获取和网络资源挖掘方面有着广泛的应用,尤其在抓取社交媒体平台上的信息时,如QQ空间的说说和图片。本篇将详细介绍如何使用Python爬虫来爬取QQ空间的K站图片。 首先,我们需要理解Python爬虫...

    获取 QQ头像 + QQ秀 + QQ空间小程序

    获取QQ空间的截图,通常需要手动操作,但通过编程,我们可以自动抓取并保存指定页面的内容,比如个人主页、相册图片等。 教程中的“一键获取”功能,可能涉及到的技术包括网络爬虫和数据解析。网络爬虫用于访问QQ的...

    QQ空间访客采集专家 v0831免费版.zip

    更支持QQ空间动态浏览访客采集(一般好友刷新空间的时候会留下痕迹在动态浏览里,类似于抓取竞争对手的好友,超强功能)请注意:同样是有权限才行,没有权限仍然采集不了 注意,软件目前支持采集最新访客,相册访客...

Global site tag (gtag.js) - Google Analytics