在网上找过相关的资料,都不是太全~有些缺漏。所有自己根据网上的再结合自己的修改了下。

1.通过HttpAnalyzerStdV5 分析QQ空间相册的真实地址。一下就是空间相册的地址:

之前在网上看见只有一个地址,但是通过我的分析,貌似会有很大的问题。比如:某个人的空间相册有些是有设置密码的。也有不设置密码的,那么就无法下载。因为这类的相册是通过另外一个URL解析的。

1 private static final String albumbase1 = "http://alist.photo.qq.com/fcgi-bin/fcg_list_album?uin=";//如果没有设置密保的相册是通过这个地址访问的
2 private static final String albumbase2 = "http://xalist.photo.qq.com/fcgi-bin/fcg_list_album?uin=";//设置密保的相册是通过这个地址访问的
3
4 //private static final String photobase = "http://alist.photo.qq.com/fcgi-bin/fcg_list_photo?uin=";
5 private static final String photobase1 = "http://plist.photo.qq.com/fcgi-bin/fcg_list_photo?uin=";
6 private static final String photobase2 = "http://xaplist.photo.qq.com/fcgi-bin/fcg_list_photo?uin=";

2.程序的main方法:

1.albums集合是所有相册的集合。

2.主要是两个方法一个是得到集合getAlbums 一个是保存相册的 savePhoto

01 public static void main(String[] args) {
02     PhotoDownLoad pdl = new PhotoDownLoad();
03     String qq = "1315404564";
04     albums = pdl.getAlbums(qq, albumbase1);//先传一个地址进去要是找到不再分析另外一个地址
05     if (albums == null || albums.size() == 0) {
06         albums = pdl.getAlbums(qq, albumbase2);
07     }
08     if (albums == null || albums.size() == 0) {
09         System.out.println("没有获取到相册");
10     }
11     int len = albums.size();
12     System.out.println("相册信息获取成功,用户共有" + len + "个相册.");
13     for (int i = 0; i < len; i++) { // 考虑到相册数量不会很多,相册采用顺序下载,不使用异步下载
14         System.out.println("开始下载第" + (i + 1) + "个相册...");
15         pdl.savePhoto(i, qq);
16         pdl.curIndex = 0;
17         System.out.println("第" + (i + 1) + "个相册下载完成.");
18     }
19 }

3.getAlbums 方法

1.

01 /**
02      * 获取用户相册
03      *
04      * @param qq
05      * <a href="http://my.oschina.net/u/556800" target="_blank" rel="nofollow">@return</a>
06      */
07     public List<Album> getAlbums(String qq, String url) {
08         List<Album> result = new ArrayList<Album>();
09         HttpClient client = new HttpClient();
10         String getUri = url + qq + "&outstyle=2"// outstyle!=2服务器将以xml的形式返回结果,
11         HttpMethod method = new GetMethod(getUri);
12         method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,
13                 charset);
14         int status = 0;
15         try {
16             status = client.executeMethod(method);
17             if (status != HttpStatus.SC_OK) {
18                 System.err.println("发生网络错误!");
19                 return null;
20             }
21         catch (HttpException e) {
22             e.printStackTrace();
23             return null;
24         catch (IOException e) {
25             e.printStackTrace();
26             return null;
27         }
28         InputStream is = null;
29         BufferedReader br = null;
30         InputStreamReader isr = null;
31         List<String> ids = new ArrayList<String>();
32         List<String> names = new ArrayList<String>();
33         List<Integer> totals = new ArrayList<Integer>();
34         try {
35             is = method.getResponseBodyAsStream();
36             isr = new InputStreamReader(is);
37             br = new BufferedReader(isr);
38             String temp = null;
39             while ((temp = br.readLine()) != null) {
40                 if (temp.contains("\"id\" :")) {
41                     String id = temp.substring(temp.indexOf("\"id\" :") + 8,
42                             temp.length() - 2);
43                     ids.add(id);
44                 }
45                 if (temp.contains("\"name\" :")) {
46                     String name = temp.substring(
47                             temp.indexOf("\"name\" :") + 10, temp.length() - 3);
48                     names.add(name);
49                 }
50                 if (temp.contains("\"total\" :")) {
51                     String total = temp
52                             .substring(temp.indexOf("\"total\" :") + 10,
53                                     temp.length() - 1);
54                     totals.add(Integer.parseInt(total));
55                 }
56                 if (temp.contains("\"left\" :")) {
57                     break;
58                 }
59             }
60         catch (IOException e) {
61             e.printStackTrace();
62         finally {
63             method.releaseConnection();
64             try {
65                 br.close();
66                 isr.close();
67                 is.close();
68             catch (IOException e) {
69                 e.printStackTrace();
70             }
71         }
72         for (int i = 0; i < ids.size(); i++) {
73             Album album = new Album(ids.get(i), names.get(i), totals.get(i));
74             result.add(album);
75         }
76         return result;
77     }

4.下载一个相册。

1.得到一个相册的整个图片。

01 /**
02      * 下载一个相册的图片
03      *
04      * @param index 相册序号
05      */
06     public void savePhoto(final int index, final String qq) {
07         Album album = albums.get(index);
08         if(album.getName().indexOf("微博")>=0){
09             System.out.println("微博相册不下载");
10             return;
11         }
12         List<Photo> photosTemp = this.getPhotoByAlbum(album, qq, photobase1);
13         if (photosTemp == null || photosTemp.size() == 0) {
14             photosTemp = this.getPhotoByAlbum(album, qq, photobase2);
15         }
16         if (photosTemp == null || photosTemp.size() == 0) {
17             System.out.println("相册信息为空");
18             return;
19         else {
20             final List<Photo> photos = photosTemp;
21
22
23             final int maxThreadCnt = 10// 每个相册最多开启10个线程进行下载
24             final int total = album.getCnt();
25             int realThreadCnt = total >= maxThreadCnt ? maxThreadCnt : total; // 实际下载一个相册的线程数
26             /**
27              * 线程驱动下载任务
28              *
29              * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a>  wensefu.jerry.Ling<br/>
30              *         wrote on 2011-1-29
31              */
32             class DownLoadTask implements Runnable {
33                 int id; // 线程标识
34                 int pindex;// 下载的图片指针
35
36                 public DownLoadTask(int id, int pindex) {
37                     this.id = id;
38                     this.pindex = pindex;
39                 }
40
41                 public void run() {
42                     while (curIndex <= total - 1) {
43                         int temp = pindex;
44                         pindex = curIndex;
45                         curIndex++;
46                         Photo photo = photos.get(temp);
47                         System.out.println("线程" + (index + 1) + "_" + id + "开始下载第" + (index + 1) + "个相册第" + (pindex + 1) + "张图片...");
48                         saveImgFromUrl(photo, qq);
49                         System.out.println("线程" + (index + 1) + "_" + id + "完成第" + (index + 1) + "个相册第" + (pindex + 1) + "张图片下载");
50                     }
51                 }
52             }
53             ExecutorService exec = Executors.newCachedThreadPool();
54             /*
55             * 初始化各线程状态 此处给每个线程分配一个下载起始点
56             */
57             for (int i = 0; i < realThreadCnt; i++) {
58                 DownLoadTask task = new DownLoadTask(i + 1, i);
59                 exec.execute(task);
60             }
61             exec.shutdown();
62         }
63     }
1
1
1
view source print?
1 源代码下载:http://www.oschina.net/code/snippet_557580_12818

通过抓包获取QQ空间相册的真实地址,实现空间相册下载。相关推荐

  1. 4k超清壁纸APP抓包获取所有壁纸下载地址

    4k超清壁纸APP抓包获取所有壁纸下载地址   Lan   2020-05-09 10:38   288 人阅读  0 条评论 额,最近发现手机壁纸似乎有段时间没换了,刚好又看到网上有一个APP叫做4 ...

  2. 抖音抓包获取cookie

    抓包获取抖音用户cookie 获取抖音cookie目前实践测试两种方式: ​ 一:扫描抖音开放平台二维码,扫码后获取cookie ​ 二:利用fiddler抓包工具对雷电模拟器进行抓包获取cookie ...

  3. 【测试】抓包获取浏览器UA,并使用Chrome 调试工具模拟手机

    抓包获取浏览器UA 首先需要先安装charles,在http的请求头当中可以看到User-Agent,复制该User-Agent的内容 如果你是前端开发,也可通过以下代码获取UA $('body'). ...

  4. WireShark抓包获取简书的登录密码

    现在某些网站在用户登录的过程中都是使用明文来传输用户密码的,这就使得用户密码完全暴露在网络中.通过抓包工具就很容易抓取密码.这里就以抓取简书的登录密码为例来介绍下抓包的过程. 1. 下载工具 抓包工具 ...

  5. 网页或APP抓包请求参数有什么意思,怎么更快的抓包获取这些请求

    网页抓包 首先对于网页爬虫来说怎么抓包呢?很简单,我们直接在网页上右键点击检查或者快捷键 F12 就可以进入开发者调试工具.如果页面是经过请求接口而返回的数据的话,在 Network 中,它就会产生请 ...

  6. 抓包获取微信文章阅读数实战

    首先需要获得一篇文章的地址 例如    https://mp.weixin.qq.com/s/S_g27h2KJPSb1NZ9DPM5Ig 我们在手机中访问 可以看到他的阅读数和点赞数 如下图 手机获 ...

  7. fiddler抓包获取mysql密码_PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解

    简介: 分析接口知道要获取文章阅读数和点赞数必须有key和uin这两个关键参数,不同公众号key不一样(据说有万能微信key,不懂怎么搞到),同一个公众号key大概半小时会过期 提交链接获取文章阅读量 ...

  8. python爬取js加载的数据_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程...

    昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...

  9. js与python 抓包_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程

    昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...

最新文章

  1. cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通
  2. 天大本科生论文入选CVPR 2022,实现深度学习长尾分类新SOTA
  3. 嵌入式系统学习笔记之五-- uboot常用命令 环境变量
  4. 苹果着手自研调制解调器,以应对高通天价专利费
  5. J2SE学习标准篇(转载)
  6. IOS中UIActionSheet使用方法详解
  7. Qt-线程启动与关闭实例
  8. 征服用计算机弹法,征服WIN7
  9. JavaScript历史与ECMAScript
  10. LinuxQt工作笔记-查看程序工作目录
  11. mssql如何取得两位的月份和天数
  12. Maven常见异常及解决方法
  13. 【短时幅度谱】短时幅度谱估计在语音增强方面的MATLAB仿真
  14. 什么是用户实体行为分析(UEBA)
  15. 康考迪亚大学应用计算机科学,康考迪亚大学计算机
  16. 出入库与库存系统的模型问题
  17. Lumen为《堡垒之夜:大逃杀》第四章带来实时全局光照
  18. php长图生成,用 3 行代码就可以生成好看的锤子便签图片(传入内容即可,俗称长微博)...
  19. GESD 离群值检验——理论与 Python 实现
  20. 24部电影的人生哲理

热门文章

  1. Windows服务器双网卡绑定的方法(HP/Broadcom网卡)
  2. Android平板怎么截屏,ipad mini怎么截图 iPad/iPad mini截图技巧图解
  3. cmd批处理剪切_Windows命令行bat/cmd脚本,文件批处理教程
  4. 用高德地图实现点击地图添加标记点,获取该点的经纬度,详细地址,通过输入框进行地址搜索自动定位到输入框地址
  5. 数据分析都不会,你敢玩基金?Python爬取基金并进行对比!
  6. 异型窗体制作(两种方法)
  7. C/C++黑魔法-不会出错的http
  8. 计算机考试怎么另存为,Word2007另存为.doc的更快捷方法
  9. 名创优品在香港上市:市值170亿港元 10元店也有大生意
  10. 【ALM】POLARION ALM之需求管理解决方案介绍02