在网上找过相关的资料,都不是太全~有些缺漏。所有自己根据网上的再结合自己的修改了下。
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=" ;//设置密保的相册是通过这个地址访问的
|
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);
|
08 |
if (albums == null || albums.size() == 0 ) {
|
09 |
System.out.println( "没有获取到相册" );
|
11 |
int len = albums.size();
|
12 |
System.out.println( "相册信息获取成功,用户共有" + len + "个相册." );
|
13 |
for ( int i = 0 ; i < len; i++) {
|
14 |
System.out.println( "开始下载第" + (i + 1 ) + "个相册..." );
|
17 |
System.out.println( "第" + (i + 1 ) + "个相册下载完成." );
|
3.getAlbums 方法
1.
05 |
* <a href="http://my.oschina.net/u/556800" target="_blank" rel="nofollow">@return</a>
|
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" ;
|
11 |
HttpMethod method = new GetMethod(getUri);
|
12 |
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,
|
16 |
status = client.executeMethod(method);
|
17 |
if (status != HttpStatus.SC_OK) {
|
18 |
System.err.println( "发生网络错误!" );
|
21 |
} catch (HttpException e) {
|
24 |
} catch (IOException e) {
|
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>();
|
35 |
is = method.getResponseBodyAsStream();
|
36 |
isr = new InputStreamReader(is);
|
37 |
br = new BufferedReader(isr);
|
39 |
while ((temp = br.readLine()) != null ) {
|
40 |
if (temp.contains( "\"id\" :" )) {
|
41 |
String id = temp.substring(temp.indexOf( "\"id\" :" ) + 8 ,
|
45 |
if (temp.contains( "\"name\" :" )) {
|
46 |
String name = temp.substring(
|
47 |
temp.indexOf( "\"name\" :" ) + 10 , temp.length() - 3 );
|
50 |
if (temp.contains( "\"total\" :" )) {
|
52 |
.substring(temp.indexOf( "\"total\" :" ) + 10 ,
|
54 |
totals.add(Integer.parseInt(total));
|
56 |
if (temp.contains( "\"left\" :" )) {
|
60 |
} catch (IOException e) {
|
63 |
method.releaseConnection();
|
68 |
} catch (IOException e) {
|
72 |
for ( int i = 0 ; i < ids.size(); i++) {
|
73 |
Album album = new Album(ids.get(i), names.get(i), totals.get(i));
|
4.下载一个相册。
1.得到一个相册的整个图片。
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( "微博相册不下载" );
|
12 |
List<Photo> photosTemp = this .getPhotoByAlbum(album, qq, photobase1);
|
13 |
if (photosTemp == null || photosTemp.size() == 0 ) {
|
14 |
photosTemp = this .getPhotoByAlbum(album, qq, photobase2);
|
16 |
if (photosTemp == null || photosTemp.size() == 0 ) {
|
17 |
System.out.println( "相册信息为空" );
|
20 |
final List<Photo> photos = photosTemp;
|
23 |
final int maxThreadCnt = 10 ;
|
24 |
final int total = album.getCnt();
|
25 |
int realThreadCnt = total >= maxThreadCnt ? maxThreadCnt : total;
|
29 |
* <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a> wensefu.jerry.Ling<br/>
|
32 |
class DownLoadTask implements Runnable {
|
36 |
public DownLoadTask( int id, int pindex) {
|
42 |
while (curIndex <= total - 1 ) {
|
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 ) + "张图片下载" );
|
53 |
ExecutorService exec = Executors.newCachedThreadPool();
|
57 |
for ( int i = 0 ; i < realThreadCnt; i++) {
|
58 |
DownLoadTask task = new DownLoadTask(i + 1 , i);
|
1 |
源代码下载: http://www.oschina.net/code/snippet_557580_12818
|
分享到:
相关推荐
通过抓包获取QQ空间相册的真实地址,实现空间相册下载。
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...