玩转SmartQQ之登录
SmartQQ是腾讯新出的⼀个WebQQ,登录地址是:,⽬前之前的WebQQ可以继续使⽤,登录地址:,SmartQQ相⽐之前的WebQQ要简单清爽很多,⽽且⼿机端可以直接访问,应该是腾讯为了在移动端做的⼀个调整,今天我把SmartQQ的登录过程给⼤家分析下。
对于Http协议,如果⼤家还不熟悉的,可以去相关资料学习下,现在我们直奔主题。
对于Http数据包的抓取和分析,我⽤的是firebug⾃带的,当然其他的类似⼯具(fiddler,httpwatch,http analyzer)等都可以,看⾃⼰的喜好了。
⾸先截个完整的登录成功的http协议的图:
通过观察分析,整个登录过程⼤致如下:
1.当⽤户在下图中的⽤户名中输⼊QQ号或者邮箱地址的时候,会触发⼀个异步请求:
怎么看qq加密相册这个请求的意思是检测当前输⼊的账号是否需要⽤验证码来登录,其中u这个参数是⽤户名,上⾯链接中的34310374是我的qq号码,login_sig是登录要⽤到的签名,每次登录的签名都不⼀样的,这个值稍候会说到如何提取到,这些参数是必要的动态参数,其余的参数⽬前发现是不变的,当然那些参数也可以提取到,为了防⽌这些参数以后会变,我都是通过动态提取的,做到万⽆⼀失。
检测是否需要验证码的参数提取
先看看载⼊的时候会做哪些事情,查看源代码,⾥⾯最有⽤的⼀句是:
<iframe noscroll src=""></iframe>
iframe的src是具体的登录地址,通过iframe的src,我们可以获取到appid(腾讯的每个web产品都有唯⼀的appid),login_state是登录状态,10表⽰在线,默认是在线。
继续看看src地址的源代码,发现在源代码⾥⾯有⼀段这样的脚本:
//参数只能为数字的
var g_version=encodeURIComponent("201309220930");
var g_pt_version=encodeURIComponent("10047");//发布版本号
var g_qtarget=encodeURIComponent("-1");
var isLoadVC = false;
var g_appid =encodeURIComponent("501004106");
var g_uin = 0;
var g_domain = encodeURIComponent("qq");
var g_target = encodeURIComponent("_self");
var g_https = true;
var g_low_login=encodeURIComponent("0");
var g_login_sig=encodeURIComponent("2mK7RUAmDy6JI3tSvPOs3PkLas*mM6g2bqffMx6dIvs11MiWf8mMDkPhm0UW3htZ"); //安全参数
var g_daid=encodeURIComponent("164");//业务隔离id
var g_regmaster=encodeURIComponent("");//双登录态
var g_forget="ptlogin2.qq/ptui_forgetpwd";
我们可以通过var g_login_sig的值得到login_sig。
这⾥我们⽤到了HttpWebRequest来进⾏http的模拟请求。(具体这个怎么⽤就不多说了,我⾃⼰封装了⼀个HttpHelper的请求类,在⽂章的最后我会把这些代码附上)
请求的结果如下:
ptui_checkVC('0','!XLF','\x00\x00\x00\x00\x02\x0b\x88\xe6');
返回的值有三个,第⼀个0表⽰不需要验证码,1表⽰需要验证码。当第⼀个为0的时候,第⼆个参数为验证码,第三个参数为uin,可以理解为验证码标识吧。
如果需要验证码,请求返回的是:
ptui_checkVC('1','dbec74e5b7b14c2479b675c7a1b76f5b8fd594067e8fd183','\x00\x00\x00\x00\x00\x34\x3f\xdf');
这时候,第⼆个值就没什么⽤了,验证码是需要⾃⼰输⼊的。
如果需要验证码的时候,我们要提取验证码图⽚:
同样⽤到的参数有appid和qq号码。
第⼀次登陆
QQ的登陆有两步,先看下⼀次登陆的请求地址:
参数解析:
u表⽰qq号码或者邮箱地址,p是加密后的密码,verifycode表⽰验证码,如果前⾯检测到需要验证码,这个值就是你输⼊的验证码,否则就是检测结果的第⼆个值。login_sig前⾯我们以前提取到了。
继续模拟http请求,如果登陆成功,结果如下:
ptuiCB('0','0','ptlogin4.web2.qq/check_sig?pttype=1&uin=34310374&service=login&nodirect=0&ptsig=DhJ8N-3qER1eSKmIoHFix*0LcUQN1IqG7XASHP1RzxE_&s_url=
http%3A%2F%2Fw.qq%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=501004106&daid=164&j_later=0&low_login_hour=0®master=0', '0','登录成功!', '飞⽆痕落⽆声');
返回的结果的第三个值,是需要继续302的⼀个地址
继续请求这个地址,这个地址主要的作⽤是赋值cookie和跳转。
请求完毕后,接着进⾏第⼆次登陆。
第⼆次登陆
第⼆次登陆是⼀个post请求,请求的参数如下
r= {"ptwebqq":"667ca0404f9256dba6fe58dc9440733cbabcdb813dd5b2b13703b684240447bb","clientid":53999199,"psessionid":"","status":"online"}
其中ptwebqq是从cookie⾥⾯提取到的,clientid是⾃⼰构造的⼀个8位随机9位数字
post的请求的结果如下:
{"retcode":0,"result":{"uin":34310374,"cip":2084660302,"index":1075,"port":47529,"status":"online","vfwebqq":"1571c0e077478cad6b3a36c159a1845f391ce90909f155be3022f1
c8742b60f526354e2513105467",
"psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133332e34312e383400003d8800001e
a00162020b88e66d0000000a406771476958665165796d000000281571c0e077478cad6b3a36c159a1845f391ce90909f155be3022f1c8742b60f526354e2513105467",
"user_state":0,"f":0}}
retcode为0表是登录成功了,后⾯的psessionid等参数再后⾯获取qq联系⼈和发消息会⽤到,下篇⽂章会讲到。
⾄此,SmartQQ登录完毕,这⾥⾯要主要的到时⽤HttpWebRequest的时候遇到cookie跨域的时候,某些cookie会访问不到,必须⼿动修改cookie的域,这个问题折腾了不少时间,腾讯的cookie是好⼏个⼦域的。
,欢迎⼤家交流和期待下⾯的⽂章,that'all。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论