分享一段下载QQ用户日志到本地的代码 [转日志不用进空间啦,输入QQ号就可以下载对方任意一篇日志了]
2013-01-05 08:18
841 查看
很悲剧的说,又是被冻醒的,苦逼的程序员生活.冻手冻脚的敲代码,真心伤不起.
继上次图解分析的腾讯空间日志真实路径后,闲着没事就写了段下载腾讯空间日志的代码.这年头转日志不用进空间啦,输入QQ号就可以下载对方任意一篇日志了.
当然你开心就全部下载喽.
实习方式很简单,简单的有些搞笑,大侠们勿喷啊, 但是功能还是搞定了.至于优化或者还有更好的方法后面再想想.贴出来与大家分享一下.
转载请注明出处[/article/4929334.html]
继上次图解分析的腾讯空间日志真实路径后,闲着没事就写了段下载腾讯空间日志的代码.这年头转日志不用进空间啦,输入QQ号就可以下载对方任意一篇日志了.
当然你开心就全部下载喽.
实习方式很简单,简单的有些搞笑,大侠们勿喷啊, 但是功能还是搞定了.至于优化或者还有更好的方法后面再想想.贴出来与大家分享一下.
package org.crawler.picture.dennisit.action; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * * @version : 1.1 * * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a> * * @since : 1.0 创建时间: 2013-1-2 下午11:56:55 * * @function: 日志下载备份类 * */ public class BlogDownloadAction extends DownloadAction{ /** * 创建每一页的用户访问数量 * @param qq 用户QQ号码 * @param pos 其实页码 * @param num 每页显示数量 默认为15,根据实际情况定 * @return */ public String createURLForPage(String qq,int pos,int num){ String baseStrBegin = "http://b11.qzone.qq.com/cgi-bin/blognew/get_abs?hostUin="+qq; String baseStrcont1 = "&blogType=0&cateName=&cateHex=&statYear=2013&reqInfo=7&pos=" + pos; String baseStrcont2 = "&num=" + num +"&sortType=0&absType=0&source=0&rand=0.8141584321856499&g_tk=5381&verbose=1&ref=qzone"; return baseStrBegin + baseStrcont1 + baseStrcont2; } /** * 获取每一页的日志ID集合 * @param qq * @param page * @param num * @return */ public List<String> getBlogIDListForEachPage(String qq,int page,int num){ List<String> lst = new ArrayList<String>(); String diaryURL = createURLForPage(qq,page,num); //System.out.println(diaryURL); URL url; try { url = new URL(diaryURL); URLConnection urlConnection = url.openConnection(); urlConnection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); InputStream is = url.openStream(); BufferedReader bufferReader = new BufferedReader(new InputStreamReader(is)); String rLine = null; int countNum = 9; while((rLine=new String(bufferReader.readLine()))!=null){ countNum++; if(rLine.contains("cateInfo")){ break; } if((countNum-18)%13==0){ //逐行读取,获取每一个日志对象 String blogId = ""; if(rLine.contains("blogId")){ String temp = rLine ; if(temp.contains("{")){ temp = rLine.substring(8); } blogId = getBlogINFO(temp); lst.add(blogId); } } } }catch (Exception e) { // TODO: handle exception } return lst; } public String getBlogINFO(String str){ String[] strArray = str.split(":|,"); /*for(int i=0; i<strArray.length; i++){ System.out.println("strArray[" +i+"]=" + strArray[i]); }*/ if(strArray.length!=0){ return strArray[1]; } return null; } /** * 获取每一页用户的日志URL集合 * @param qq * @param page * @return */ public List<String> getBlogURLListForEachPage(String qq, int page,int num){ List<String> idlst = getBlogIDListForEachPage(qq,page,num); List<String> urlSet = new ArrayList<String>(); String blogUrl = "http://user.qzone.qq.com/"+qq+"/blog/"; for(String id:idlst){ urlSet.add(blogUrl+id); } return urlSet; } /** * 第一页用于发送数据包,获取回应的数据包信息,根据回应包信息检测日志总数 * @param qq * @return */ public String createFirstPageURL(String qq){ return createURLForPage(qq,0,15); } /** * 获取日志总数核心方法 * @return */ public int getBlogCount(String qq){ int blogCount = 0; String diaryURL = createFirstPageURL(qq); //第一页用于发送数据包,获取回应的数据包信息,根据回应包信息检测日志总数 URL url; try { url = new URL(diaryURL); URLConnection urlConnection = url.openConnection(); urlConnection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); InputStream is = url.openStream(); BufferedReader bufferReader = new BufferedReader(new InputStreamReader(is)); String rLine = null; while((rLine=bufferReader.readLine())!=null){ if(rLine.contains("totalNum")){ blogCount = Integer.parseInt(BlogINFOUtil.getBlogINFO(rLine)); //获取日志总数 break; } } }catch (Exception e) { // TODO: handle exception } return blogCount; } /** * 获取用户的所有日志的日志ID * @param qq */ public List<String> allQQBlogID(String qq){ List<String> allBlogID = new ArrayList<String>(); int count = getBlogCount(qq); int pageCount = (count%15==0)?count/15:(count/15+1) ; for(int i=0; i<pageCount;i++){ List<String> lsts ; if(i==pageCount-1){ lsts = getBlogIDListForEachPage(qq, i*15,count-(i*15)); }else{ lsts = getBlogIDListForEachPage(qq, i*15,15); } allBlogID.addAll(lsts); } return allBlogID; } /** * 获取用户的所有日志访问URL * @param qq */ public List<String> allQQBlogURL(String qq){ List<String> allURL = new ArrayList<String>(); //DiaryDownload dyd = new DiaryDownload(); int count = getBlogCount(qq); System.out.println("日志总数为:" + count); int pageCount = (count%15==0)?count/15:(count/15+1) ; System.out.println("用户日志页数:" + pageCount); int show = 0; for(int i=0; i<pageCount;i++){ System.out.println(qq+"用户的第"+(i+1)+"页的日志信息"); System.out.println("----------------------------------------"); List<String> lsts ; if(i==pageCount-1){ lsts = getBlogURLListForEachPage(qq, i*15,count-(i*15)); }else{ lsts = getBlogURLListForEachPage(qq, i*15,15); } for(String str : lsts){ System.out.println(qq +"用户的第"+(++show)+"篇日志访问URL为:\t"+str); } allURL.addAll(lsts); System.out.println("----------------------------------------"); } return allURL; } /** * 创建包含日志内容的真正URL * @param qq * @param logId * @return */ public String createHaveContentBlogURL(String qq,String logId){ /* http://b11.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin= 1325103287 &blogid= 1305125403 &styledm=ctc.qzonestyle.gtimg.cn&imgdm=ctc.qzs.qq.com&bdm=b.qzone.qq.com&mode=2 &numperpage=15 &blogseed=0.491407030262053&property=GoRE×tamp=1357192365&dprefix=&g_tk=5381 &ref=qzone&v6=1&entertime=1357192364386&via=QZ.HashRefresh &pos=1305125403 */ String baseContURL = "http://b11.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin=" + qq +"&blogid="+logId ; String baseCont1 = "&styledm=ctc.qzonestyle.gtimg.cn&imgdm=ctc.qzs.qq.com&bdm=b.qzone.qq.com&mode=2&numperpage=15"; String baseCont2 = "&blogseed=0.491407030262053&property=GoRE×tamp=1357192365&dprefix=&g_tk=5381"; String baseCont3 = "&ref=qzone&v6=1&entertime=1357192364386&via=QZ.HashRefresh"; String baseCont4 = "&pos=" + logId; return baseContURL + baseCont1 + baseCont2 + baseCont3 + baseCont4; } /** * 备份日志 * @param backPath 日志存放路径 * @param fileName 日志名称 * @param urlStr 日志URL */ public static void backQQBlog(String backPath, String fileName, String urlStr){ URL url; try { url = new URL(urlStr); URLConnection urlConnection = url.openConnection(); urlConnection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); InputStream is = url.openStream(); BufferedReader bufferReader = new BufferedReader(new InputStreamReader(is,"gb2312")); String rLine = ""; File file = new File(backPath+fileName); FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); while((rLine=bufferReader.readLine())!=null){ System.out.println(rLine); bw.write("" +rLine.toString()+"\r\n"); //bw.write(new String(rLine.getBytes("GBK"),"gbk")+"\r\n"); } is.close(); bufferReader.close(); bw.close(); fw.close(); }catch (Exception e) { e.printStackTrace(); }finally{ } } public static void main(String[] args) { BlogDownloadAction down = new BlogDownloadAction(); List<String> qqIdList = down.allQQBlogID("799089378"); List<String> qqBlogURLList = down.allQQBlogURL("799089378"); System.out.println("所有日志总数:" + qqBlogURLList.size()); //备份第2篇日志 String filePath = "F:/"; String filename = "799089378_"+qqIdList.get(9)+".html"; System.out.println("第二篇日志的Id为:"+ qqIdList.get(9)+ ",\t日志访问URL为:" +qqBlogURLList.get(6)); String url = down.createHaveContentBlogURL("799089378",qqIdList.get(9)); System.out.println(url); down.backQQBlog(filePath, filename, url); } }
转载请注明出处[/article/4929334.html]
相关文章推荐
- 模仿苹果手机虚拟键的代码分享,有兴趣的可以玩玩。 下面的是链接,复制粘贴到浏览器就能下载
- 一段可以在UNIX系统下读硬盘空间信息的代码(原创)
- 模仿苹果手机虚拟键的代码分享,有兴趣的可以玩玩。 下面的是链接,复制粘贴到浏览器就能下载
- 用TreeView控件实现资源管理器(显示本地硬盘下所有文件夹和文件,并可以浏览图片)(示例代码下载)
- 用TreeView控件实现资源管理器(显示本地硬盘下所有文件夹和文件,并可以浏览图片)(示例代码下载)
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- 一段有关内核、用户空间共享内存的代码
- 分享一个jQuery的自动客户端本地保存插件Sisyphus.js - 帮助你自动保存用户输入内容
- 断点的QQ伤感空间日志分享:止不住的泪,止不住的伤
- 分享一个jQuery的自动客户端本地保存插件Sisyphus.js - 帮助你自动保存用户输入内容
- 写一段代码可以对本地的文件进行读写
- 完成一个应用,用户可以根据自己输入的地址下载网络上的图片和网页信息
- 如何通过linux ssh远程linux不用输入密码登入-----scp命令可以本地与远程来回拖文件
- cocosPods下载更新第三方时输入的代码,加上后面几句可以提高效率
- 西电校园网用户可以到这里下载东西,博主亲测速度一般不低于10MB/s(请帮忙分享)
- 面试题:用Redis和任意语言实现一段恶意登录保护的代码,限制1小时内每用户Id最多只能登录5次
- 人脉通分享工能,点击分享到微信或者qq的分享链接打开H5,提示用户用浏览器打开,点击下载,有有app
- 每日学习心得:CustomValidator验证控件验证用户输入的字符长度、Linq 多字段分组统计、ASP.NET后台弹出confirm对话框,然后点击确定,执行一段代码
- 每日学习心得:CustomValidator验证控件验证用户输入的字符长度、Linq 多字段分组统计、ASP.NET后台弹出confirm对话框,然后点击确定,执行一段代码
- Android平台 用户可以根据自己输入的地址下载网络上的图片和网页信息