抓取qq邮箱联系人

今天是:2010-03-14 ,纪念昨晚熬到3点!

题外话:模拟登陆请求页面这次我用了httpclient4.0,也顺便学习一下,4.0跟以前的版本用法上有很大的不同,具体情况Google一下就知道了,个人觉得知道原理就行了,至于开发包只要能实现目的用那个版本自己决定,这里不多说。

 

言归正传:

Step1、抓取登陆页:http://mail.qq.com/cgi-bin/loginpage 

目的:获取表单提交的action和用于加密密码的ts值

注意:这里获取到得action有两个用途

           1、当然是提交表单

           2、抽出domain用于组装验证码请求url,因为验证码分布在多台机器,某台机器只能验证这台机器的验证码(所以一些旧的文章关于验证码获取的url不能用了)

补充:主页还有个rsa的公钥PublicKey,我直接拷贝出来使用,其他则用正则拿。

Step2、请求验证码:"http://"+domain+"/cgi-bin/getverifyimage?aid=23000101&"+Math.random()

注意:返回的验证码附上了cookie:authimgs_id和verifyimagesession(以前好像叫verifysession),所以拿验证码的时候必须把它们(不要漏了authimgs_id保存下来,因为登陆请求的

           时候 要用到。

Setp3、填充表单:

sid=0,2,zh_CN (默认值)

firstlogin=false   (默认值)

starttime= (请求时间:js中: (new Date()).valueOf() ; java中:Long.toString(System.currentTimeMillis()))

redirecturl= (默认为空)

f=html (默认值)

p= (加密后的秘密:如果是jdk6.0可以调用存放rsa加密函数的js文件(好像是这个safeauth9206l.js,我是jdk5.0环境,所以未试过这种方法)来加密)

delegate_url= (默认为空)

s= (默认为空)

ts= (上面抓取首页的时候已获取)

from= (默认为空)

ppp = (默认为空)

chg = 1 (不用理,就填1好了)

checkisWebLogin = (当前日期所在一周中的第几天再乘3,例如:今天是星期日就是0*3=0,昨天是6*3=18)

uin= (qq号)

pp= (将原始密码的每一个字符替换为0,即密码长度个0组成的字符串)

verifycode=验证码(setp2已拿到)

aliastype=@qq.com (其他未试过)

表单填好了,就可以进入下一步,在这里推荐一个软件:charles,用这个东西可以看到页面http请求的细节,用来分析request and response非常方便

Setp4、登陆

提交表单前记得将setp2拿到的cookie放到请求header里,至于header还需不需要设其他值,个人水平有限,I don't know ~~!,我的做法反正在charles上看到的都弄上去应该没错

提交失败将返回错误页(errtype=1:密码错误、2:验证码错误、17:登陆太多次),否则返回一个跳转页,将跳转页上的urlHeader, sid , r三个 值拿下来重新组装进入首页的url

例如:http://m87.mail.qq.com/cgi-bin/frame_html?sid=0tMsQPhQJlbKWUsA&r=0f5b1e1f4898062431d5c1d21cbd244d

记得保存urlHeader (含有主页用到的域名信息)和 sid 获取联系人的时候要用到

Setp5、获取联系人

组装获取联系人分组列表页面的url :urlHeader+"addr_listall?sid="+_sid+"&sorttype=null&category=common"

例如:http://m87.mail.qq.com/cgi-bin/addr_listall?sid=0tMsQPhQJlbKWUsA&sorttype=null&category=common

进入了分组页,也就得到了进入每一组的url,进去拿就是了!

 

#补充一下个人的一些理解:上面整个过程必须保证始终使用同一个httpclient对象,httpclient隐性地为我们完成了session维持的工作!

(有理解错的,请大侠们指出以便修正,俺水平低下但好学~~)

#这里不提供源码,因为qq邮箱稍有改动,程序就可能用不了,关键是思路!以不变应万变~~

参考资料:

http://www.cnblogs.com/huangcheng/archive/2009/09/14/1566198.html

http://blog.csdn.net/gtuu0123/archive/2009/11/14/4809431.aspx

          

@QQ邮箱改用https协议了,而且邮箱联系人那个页面该版了,不过稍作改动,程序仍然可用 (2010-06-26)

           

转载于:https://www.cnblogs.com/nicholas_f/archive/2010/03/14/1685647.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDFS的Block size的默认大小

今天无意中听到了同事说关于HDFS中每个block的大小,特意查了下: 从Hadoop的官网上看了各个版本的说明文档中关于 Data Blocks 的说明,发现是从2.7.3版本开始,官方关于Data Blocks 的说明中,block size由64 MB变成了12…

Jconsole查看Weblogic自定义MBean

简单的Jconsole连接到weblogic进程,只能连接Platform MBean server,看不到自定义MBean。 这时我们需要连接到 WebLogic MBean server,通过如下方式: 1. 创建wlfulclient.jar 1) cd %WL_HOME%/server/lib 2) java -jar wljarbuilder.jar 2. 启…

Centos7 安装Mysql5.7

我们经常需要在服务器上安装mysql,各种文档都有,但是很多都是一部分,我现在总结了一下,放到一起,以后大家不用一篇一篇查询了。 1.安装yum repo 由于CentOS 的yum源中没有mysql,需要到mysql的官网下载yum r…

MySQL Innodb存储引擎使用B+树做索引的优点

对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B树作为索引 MySQL Innodb存储引擎使用了B树作为索引的优点,主要有以下原因: 1、索引和表数据都是存放在磁盘上的,如果磁盘上的数据量过大时,无法…

用eclipse配置spket编写extjs代码方法

依然是备忘用的,因为以前学过的东西很容易就会遗忘,现在每学一点就记录下来,一来让自己有一定的成就感,二来也方便以后查阅。 ExtJS的好处我就不多说了,富客户端的ajax框架,美观,大方&#xff0…

【 iview 实践指南】之如何优雅地在Table中嵌套Input(代码篇)

iview 版本 3.2.0 template 部分&#xff1a; <template><div><Table class"data-manage-table"border:disabled-hover"true":columns"columns":data"datalist"><template slot-scope"{ row, index }"…

PHP函数学习摘录

1、任何有效的 PHP 代码都有可能出现在函数内部&#xff0c;甚至包括其它函数和类定义2、PHP 不支持函数重载&#xff0c;也不可能取消定义或者重定义已声明的函数。3、函数名是大小写无关的&#xff0c;不过在调用函数的时候&#xff0c;通常使用其在定义时相同的形式。 变量…

boost::scoped_ptr与std::unique_ptr

boost::scoped_ptr与std::unique_ptr都是类模板&#xff0c;封装了指针 两者都禁用了拷贝构造和赋值函数&#xff0c;因此不能作为STL容器中的元素&#xff0c;因为在执行push_back()时需要调用赋值函数。 std::unique_ptr实际上与boost::scoped_ptr是等价的&#xff0c;只是s…

接口,new,匿名内部类

接口&#xff0c;new&#xff0c;匿名内部类 接口不能被实例化&#xff0c;如&#xff1a; ----------------清单1---------------------- public interface Test { public void doIt(); } --------------------------------------------- 在测试类中语句&#xff1a;Test…

Python: 使用装饰器“@”取得函数执行时间

class A():Python: 使用装饰器“”取得函数执行时间 - oldJ的学习笔记 - 博客频道 - CSDN.NETPython: 使用装饰器“”取得函数执行时间 分类&#xff1a; Python 2009-10-14 12:53 752人阅读 评论(0) 收藏 举报Python中可以使用装饰器对函数进行装饰&#xff08;或说包装&#…

数据库07

索引 索引是一种单独的物理层面的数据结构&#xff0c;其作用是用于加速查询 mysql把数据存储到硬盘中&#xff0c;硬盘读写速度非常慢 一个应用程序&#xff0c;本质上就是对数据进行增删改查 一旦数据量比较大时&#xff0c;硬盘的响应速度变慢&#xff0c;给用户的感觉应用程…

ODT .NET 详解之 SqlDataSource 访问 Oracle

前一篇博文呢&#xff0c;介绍了如何搭配好 Oracle Developer Tools for Visual Studio .NET 的使用环境&#xff0c; 这一篇博文的话就会重点来介绍一下如何通过使用 SqlDataSource 这个控件来访问 Oracle 数据库了&#xff0c; 其实只要环境搭配好了&#xff0c;那么这一篇博…

springboot+thymeleaf+pageHelper带条件分页查询

html层 <div><a class"num"><b th:text"共 ${result.resultMap[pages]} 页"></b></a><a class"num" th:if"${result.resultMap[hasPreviousPage]} true" th:href"{/report/receivePage?cur…

Linux文件、目录权限及常用命令

############################################# 一、权限                 #############################################1、r 可读 42、w 可写 23、x 可运行 1##…

谷歌:不守规矩的“顽童”

十几岁&#xff0c;对于人类来说&#xff0c;是敏感多虑且叛逆的青春期&#xff0c;而十几岁对于一个企业则意味着扎实经营基础的黄金阶段。谷歌&#xff08;Google&#xff09;&#xff0c;这个十年来互联网领域最大的赢家&#xff0c;正是这个即将步入金钗之年的“顽童”&…

bloom filter

今天的文章和大家一起来学习大数据领域一个经常用到的算法——布隆过滤器。如果看过《数学之美》的同学对它应该并不陌生&#xff0c;它经常用在集合的判断上&#xff0c;在海量数据的场景当中用来快速地判断某个元素在不在一个庞大的集合当中。它的原理不难&#xff0c;但是设…

数据描述

数据描述 1、静态数据 本系统支持用户个人信息存储以及旅游地点、天数、花费金额、景点的推荐存储。因此&#xff0c;本系统需要存储数据库部分信息。 2、动态数据 用户登录信息 用户搜索结果 用户个人信息 旅游分享的攻略 用户个人留言 用户偏好信息 3数据库描述&#xff1a;数…

样式的使用(七)

在自定义组件中使用运行时样式 1、css文件 /* ../assets/CustomComponentStyles.css */ namespace s "library://ns.adobe.com/flex/spark"; namespace mx "library://ns.adobe.com/flex/halo"; .specialStyle{font-size:24;font-weight:bold; } 记得要把文…

skiplist原理与实现

今天继续介绍分布式系统当中常用的数据结构&#xff0c;今天要介绍的数据结构非常了不起&#xff0c;和之前介绍的布隆过滤器一样&#xff0c;是一个功能强大原理简单的数据结构。并且它的缺点和短板更少&#xff0c;应用更加广泛&#xff0c;比如广泛使用的Redis就有用到它。 …

JavaScript与HTML交互——事件

JavaScript和HTML的交互是通过事件实现的。JavaScript采用异步事件驱动编程模型&#xff0c;当文档、浏览器、元素或与之相关对象发生特定事情时&#xff0c;浏览器会产生事件。如果JavaScript关注特定类型事件&#xff0c;那么它可以注册当这类事件发生时要调用的句柄。 事件流…