Java模拟登陆QQ信箱获取好友列表的实现

Java模拟登陆QQ邮箱获取好友列表的实现
谨以此文,纪念我好几天敖到1点睡觉,我是个好孩子,一般10点就钻被窝了,夜里好起来偷菜,hoho

其实很无聊,其实很BT,SNS网站好象一夜之间都提供邀请好友功能

但是像开心等都没有提供对qq的读取,因为QQ很变态,就用他开刀好了

前阵子在研究验证码识别,做了一些简单的注册机,灌水机,直到发现TMD这东西更变态,水太深,不费心了,能识别简单的就好了

类似QQ这样的不大可能识别出来了。只有启用人肉识别,让肉眼自己看好了,娃哈哈

准备工作:
1.JDK1。6 为什么要1。6呢,这个后面再说
2.一个支持jsp的WEB环境,例如resin,tomcat等
3.要有简单的模拟登陆思路,比如我,最开始是做开心网外挂的模拟登陆
当然我是个非常无聊的人,一般无聊的都是先做163啊,126邮箱的模拟登陆,也是为了拿点用户列表,没新鲜的
模拟登陆我用的是org.apache.http,实现一个可以模拟登陆的client
public WebClient() {
  currentURL = null;
  client = new DefaultHttpClient();
  client.setCookieStore(new UpdateableCookieStore());
  client.setRedirectHandler(new MemorizingRedirectHandler());
  client.getParams().setParameter("http.protocol.cookie-policy",
    "compatibility");
  List headers = new ArrayList();
  headers
    .add(new BasicHeader(
      "User-Agent",
      "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13"));
  client.getParams().setParameter("http.default-headers", headers);
}
4.要有一些正则表达式常识
因为毕竟要从html里摘录出需要的内容,如sid什么的,不用正则太麻烦鸟~

好了,开练
先去http://mail.qq.com里看看代码,大概就是一些无聊的表单和验证码
把这些内容弄成一个简单的html登陆看看,操,居然登陆不了,告诉我验证码不对,向人肉保证,我的眼神没有问题
用httpwatch单独把验证码弄出来分析分析,居然生成的图片还带了cookie,@#$%^& 咒骂半小时
没办法了,只能把这个图片转发一下了
大概思路就是,先用服务器请求图片,然后response.setContentType("image/jpeg");
这就是为什么需要一个支持jsp的web环境了。
转发图片前把Cookie对象放到session里,一会提交QQ号啊,密码什么的那些垃圾的时候把这个再SET给虚拟的WEBCLIENT就OK了

验证码解决后就是表单处理了,我再操。。。页面里这些乱七八糟的js是干啥的啊,居然QQ密码在js端还做了一次RSA加密,这帮孙子怎么想的啊,太变态了

我先想到的是把这些js改写成java的代码,写了两行就放弃了,这不是人干的活啊

还好jdk1.6 有个扩展包,支持java读取js, 重来没试过,正好开开洋荤。 没想到啊,太好用了,这么复杂的js 都能转换,这个版本真值得信服,哈哈

页面里的js代码要稍微调整一下,有一些函数需要改写,去掉识别浏览器版本和表单对象的参数

javax.script.*

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval(new FileReader("/home/html/qq.js"));
engine.eval("var t=checkInput('"+pp+"','"+ts+"');");
String p=engine.get("t").toString();

一定要用1.6啊,我以前一直用的1.5,就是为了这个把机器里的JDK换成1.6了,哈哈

所有的前端问题都解决了,后面就是享受时间了
得到uin,password,verifycode提交
解析出加密的passwd后,post到http://mail.qq.com/cgi-bin/loginpage , 记得先把验证码的cookie对象set过去
String regex = "sid=(.*?)\";";
得到最需要的sid,后面的就是随便请求里面的连接了,想干啥就干啥,想吃啥就吃啥
我当时可能太激动了,得到了sid居然还是进不去,告诉我session time out,郁闷了1个晚上,不应该啊
最后才发现,我只是把sid print出来了,忘了set了,日。。。。

好爽,轻松拿到好友列表,下面一个问题就是如何骗用户输入QQ号和密码了,顺便友情提示一下大家,千万别相信类似开心啊,校内啊这些SNS网站, 不记录你密码都见了鬼了!!哈哈
1 楼 wangxing0311 2011-10-12  
LZ 非常需要你的帮忙 能留下你的联系方式吗?如果可以的话 加我383004902 目前在做获取qq邮箱好友列表 遇到很大问题 谢谢