由于工作需要,花了近2天时间成功实现了腾讯微博的模拟登陆,现总结如下供学习和应用者相互交流。
(1)腾讯微博和新浪微博的登陆加密思路很相似,都是要经过两道手续,一是要先获取加密参数,二是要加密计算。
新浪weibo是要获取serverTime和nonce,而腾讯weibo则是先获取verifyCode和pt.uin(是由先传的qq或是微博帐号帐号获取)才可以。
(2)获取verifyCode和pt.uin,通过firebug或是httpWatch等抓取包工具可以分析出方式,如下:
(3)分析加密过程,其加密过程完全依靠js来实现,如下图所示,标红的下方即为加密的js源码,格式化之后,即可看一清而楚,
其它核心在于对密码的加密过程,分析之后,可获取核心加密部分,如下图:
A: 即为取得输入密码的值。
B:用js写的md5算法先对password原始值加密,之后用js的hexchar2bin函数将其加上“\x"16进制化。
C:将上一步的值+刚刚在第2步获取到的pt.uin再做一次md5加密。
D:上一步的值+刚刚在第2步获取到的verifyCode.upperCase之后再一步md5密码,
经A、B、C、D之后最终形成ecoding之后的密码,追加到js中的A变化,即get请求的字符串中。
(4)对于模拟登陆主要是密码加密算法的破解,其它的都很容易拼起来,如腾讯weibo中最后请求串
只有p和verifyCode是变的,而这两个都已通过上边可以获得,故此时用HttpClient等做get请求,会得到如下的内容:
此时代表登陆成功。
以上描述均为正常顺利情况下,当然中间会有很多意想不到的问题,比如分析和加密过程,某些重要参数,如Host和Referer参数的设置等。因为时间原因我就不细说了,但有一个让我费了很大劲的地方我着重提一下,即
(5)加密时候,算法一致总是得不到与抓包时候一致密加密结果。我是用java做的开发,在此重点讲下关于java在这块遇到的问题。
提供2两种思路,
1、将远程的login_div.js下载到本地搭建一个web project,用同样的verifyCode和pt.uin做一个本地的加密测试,看结果是否和浏览器抓包时候一致。
2、将1中的测试成之后,封装成一个js,用java的ScriptEngine去调用,就省去了用java实现一下腾讯用js写的md5加密算法了,我最后也得到了理想的结果。中间有个插曲困扰了我一天之久,java的scriptEngine调用js方法encoding时,传入一个"......"这样的值时,js加密总是不一致,暂未想到真正原因,最后用了这样的方法,即将pt.uin用java方法还原成了112233.....,再通过ScriptEngine调用js的hexchar2bin去封装该串成16进制的方法,再加密时候就完全一致了。
基本是这个情况,若有问题,欢迎交流~