通过抓包获取QQ空间相册的真实地址,实现空间相册下载。
在网上找过相关的资料,都不是太全~有些缺漏。所有自己根据网上的再结合自己的修改了下。
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
|
1
|
源代码下载: http://www.oschina.net/code/snippet_557580_12818
|
通过抓包获取QQ空间相册的真实地址,实现空间相册下载。相关推荐
- 4k超清壁纸APP抓包获取所有壁纸下载地址
4k超清壁纸APP抓包获取所有壁纸下载地址 Lan 2020-05-09 10:38 288 人阅读 0 条评论 额,最近发现手机壁纸似乎有段时间没换了,刚好又看到网上有一个APP叫做4 ...
- 抖音抓包获取cookie
抓包获取抖音用户cookie 获取抖音cookie目前实践测试两种方式: 一:扫描抖音开放平台二维码,扫码后获取cookie 二:利用fiddler抓包工具对雷电模拟器进行抓包获取cookie ...
- 【测试】抓包获取浏览器UA,并使用Chrome 调试工具模拟手机
抓包获取浏览器UA 首先需要先安装charles,在http的请求头当中可以看到User-Agent,复制该User-Agent的内容 如果你是前端开发,也可通过以下代码获取UA $('body'). ...
- WireShark抓包获取简书的登录密码
现在某些网站在用户登录的过程中都是使用明文来传输用户密码的,这就使得用户密码完全暴露在网络中.通过抓包工具就很容易抓取密码.这里就以抓取简书的登录密码为例来介绍下抓包的过程. 1. 下载工具 抓包工具 ...
- 网页或APP抓包请求参数有什么意思,怎么更快的抓包获取这些请求
网页抓包 首先对于网页爬虫来说怎么抓包呢?很简单,我们直接在网页上右键点击检查或者快捷键 F12 就可以进入开发者调试工具.如果页面是经过请求接口而返回的数据的话,在 Network 中,它就会产生请 ...
- 抓包获取微信文章阅读数实战
首先需要获得一篇文章的地址 例如 https://mp.weixin.qq.com/s/S_g27h2KJPSb1NZ9DPM5Ig 我们在手机中访问 可以看到他的阅读数和点赞数 如下图 手机获 ...
- fiddler抓包获取mysql密码_PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
简介: 分析接口知道要获取文章阅读数和点赞数必须有key和uin这两个关键参数,不同公众号key不一样(据说有万能微信key,不懂怎么搞到),同一个公众号key大概半小时会过期 提交链接获取文章阅读量 ...
- python爬取js加载的数据_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程...
昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...
- js与python 抓包_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程
昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...
最新文章
- cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通
- 天大本科生论文入选CVPR 2022,实现深度学习长尾分类新SOTA
- 嵌入式系统学习笔记之五-- uboot常用命令 环境变量
- 苹果着手自研调制解调器,以应对高通天价专利费
- J2SE学习标准篇(转载)
- IOS中UIActionSheet使用方法详解
- Qt-线程启动与关闭实例
- 征服用计算机弹法,征服WIN7
- JavaScript历史与ECMAScript
- LinuxQt工作笔记-查看程序工作目录
- mssql如何取得两位的月份和天数
- Maven常见异常及解决方法
- 【短时幅度谱】短时幅度谱估计在语音增强方面的MATLAB仿真
- 什么是用户实体行为分析(UEBA)
- 康考迪亚大学应用计算机科学,康考迪亚大学计算机
- 出入库与库存系统的模型问题
- Lumen为《堡垒之夜:大逃杀》第四章带来实时全局光照
- php长图生成,用 3 行代码就可以生成好看的锤子便签图片(传入内容即可,俗称长微博)...
- GESD 离群值检验——理论与 Python 实现
- 24部电影的人生哲理
热门文章
- Windows服务器双网卡绑定的方法(HP/Broadcom网卡)
- Android平板怎么截屏,ipad mini怎么截图 iPad/iPad mini截图技巧图解
- cmd批处理剪切_Windows命令行bat/cmd脚本,文件批处理教程
- 用高德地图实现点击地图添加标记点,获取该点的经纬度,详细地址,通过输入框进行地址搜索自动定位到输入框地址
- 数据分析都不会,你敢玩基金?Python爬取基金并进行对比!
- 异型窗体制作(两种方法)
- C/C++黑魔法-不会出错的http
- 计算机考试怎么另存为,Word2007另存为.doc的更快捷方法
- 名创优品在香港上市:市值170亿港元 10元店也有大生意
- 【ALM】POLARION ALM之需求管理解决方案介绍02