zoukankan      html  css  js  c++  java
  • 玩转SmartQQ之登录

    SmartQQ是腾讯新出的一个WebQQ,登录地址是:http://w.qq.com/,目前之前的WebQQ可以继续使用,登录地址:http://web2.qq.com/webqq.html,SmartQQ相比之前的WebQQ要简单清爽很多,而且手机端可以直接访问,应该是腾讯为了在移动端做的一个调整,今天我把SmartQQ的登录过程给大家分析下。
    对于Http协议,如果大家还不熟悉的,可以去找相关资料学习下,现在我们直奔主题。
    对于Http数据包的抓取和分析,我用的是firebug自带的,当然其他的类似工具(fiddler,httpwatch,http analyzer)等都可以,看自己的喜好了。
    首先截个完整的登录成功的http协议的图:
     
     
    通过观察分析,整个登录过程大致如下:
    1.当用户在下图中的用户名中输入QQ号或者邮箱地址的时候,会触发一个异步请求:https://ssl.ptlogin2.qq.com/check?uin=34310374&appid=501004106&js_ver=10046&js_type=0
     
    这个请求的意思是检测当前输入的账号是否需要用验证码来登录,其中u这个参数是用户名,上面链接中的34310374是我的qq号码,login_sig是登录要用到的签名,每次登录的签名都不一样的,这个值稍候会说到如何提取到,这些参数是必要的动态参数,其余的参数目前发现是不变的,当然那些参数也可以提取到,为了防止这些参数以后会变,我都是通过动态提取的,做到万无一失。
    检测是否需要验证码的参数提取
    先看看载入http://w.qq.com的时候会做哪些事情,查看源代码,里面最有用的一句是:
     
     
    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.com");
    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="http://ptlogin2.qq.com/ptui_forgetpwd";
    

     我们可以通过var g_login_sig的值得到login_sig。

    这里我们用到了HttpWebRequest来进行http的模拟请求。(具体这个怎么用就不多说了,我自己封装了一个HttpHelper的请求类,在文章的最后我会把这些代码附上)
    请求的结果如下:
    ptui_checkVC('0','!XLF','x00x00x00x00x02x0bx88xe6');
    返回的值有三个,第一个0表示不需要验证码,1表示需要验证码。当第一个为0的时候,第二个参数为验证码,第三个参数为uin,可以理解为验证码标识吧。
    如果需要验证码,请求返回的是:
    ptui_checkVC('1','dbec74e5b7b14c2479b675c7a1b76f5b8fd594067e8fd183','x00x00x00x00x00x34x3fxdf');
    这时候,第二个值就没什么用了,验证码是需要自己输入的。
     
    如果需要验证码的时候,我们要提取验证码图片:
     同样用到的参数有appid和qq号码。
     第一次登陆
     
     QQ的登陆有两步,先看下一次登陆的请求地址:
     
    参数解析:
    u表示qq号码或者邮箱地址,p是加密后的密码,verifycode表示验证码,如果前面检测到需要验证码,这个值就是你输入的验证码,否则就是检测结果的第二个值。login_sig前面我们以前提取到了。
    继续模拟http请求,如果登陆成功,结果如下:
    ptuiCB('0','0','http://ptlogin4.web2.qq.com/check_sig?pttype=1&uin=34310374&service=login&nodirect=0&ptsig=DhJ8N-3qER1eSKmIoHFix*0LcUQN1IqG7XASHP1RzxE_&s_url=
    http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=501004106&daid=164&j_later=0&low_login_hour=0&regmaster=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。
  • 相关阅读:
    MySQL的小Tips
    Linux中Eclipse下搭建Web开发环境
    SaaS的那些事儿
    典型的软件过程模型
    浅谈「敏捷」开发
    软件工程的本质
    堆和优先队列
    c 判断文件或文件夹是否存在,多种方法, 为什么从一开始就不直接来个统一的呢?
    大江河流尽
    jpg、png格式的图片转换成webp后颜色失真的问题
  • 原文地址:https://www.cnblogs.com/coding1016/p/3332745.html
Copyright © 2011-2022 走看看