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','\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','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。

玩转SmartQQ之登录的更多相关文章

  1. 迈出物联网的第一步,玩儿一下Arduino

    大家知道,现在物联网Internet of Things(IoT) 方兴未艾,各种智能设备层出不穷,手表.手环.甚至运动鞋等可穿戴设备,还有智能家居产品,无时无刻不冲击着我们的思想和眼球.Autode ...

  2. xxx app 项目问题解决一览

    前话:作为人生旅途中的小记录 不同账号玩法限制       解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制    **** ...

  3. python3+qqBot+图灵机器人实现qq聊天机器人

    原理: 通过Python3的qqBot开源库,基于腾讯的smartQQ协议登录个人QQ,实现监控.收集QQ消息,进而通过图灵机器人API接入方式实现自动聊天. 零.前期准备: 1.Python3 2. ...

  4. 结对编程——Java实现黄金分割点游戏

    这是我和队员根据老师要求自创的一个人机黄金分割点游戏.这个小游戏在Windows10 下开发,用Eclipse做开发工具,实现语言是Java. 利用目前自己所学的Java知识实现了一人登录,电脑自行匹 ...

  5. redis bgsave 内存不够

    客户反应很慢,程序玩不了,登录服务器,查看,发现cpu/io正常,内存也还有,但是负载很离谱的飙高到了30多,查原因: 因为用了redis,最近redis数据增长量很大,而且优化过,怀疑是redis问 ...

  6. 如何用20行Python代码打造一个微信群聊助手?

    今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...

  7. 从零开始学MySQL(一)

    如果您浏览过许多IT类的招聘职位,那么掌握数据库技能的重要性便不言自明了.因JAVA常常与MySQL所挂钩,因此兴起了写博客记载学习的念头,盼与君共勉.然,在进行MySQL语法的学习之前,我们无不面临 ...

  8. Ubuntu系统测评

    首次使用ubuntun系统 华为云可以免费试用30天,嘻嘻,正好熟悉一下linux命令 1.登录 login: 先输入用户名:root 在输入密码:******** 这个是在配置云服务器的时候自己设置 ...

  9. Windows 最值得推荐的装机必备“神器”软件大合集

    工欲善其事,必先利其器.每个人在平时使用电脑的过程中,多多少少都会积累一些好用的软件,我也不例外,从业这么多年,收藏了许多不错的软件,通过这篇文章都分享给大家.如果觉得不错,请把这篇文章分享给你的小伙 ...

随机推荐

  1. 如何提高手机APP的用户体验?

    详细内容请点击 随着移动互联网如日中天,如火如荼的时候,手机APP开发日益高涨了起来,关于手机APP的用户体验,也是一个老话长谈的话题.从事这行业也很久了,以下是我个人在工作中的一些关于APP的用户体 ...

  2. UI设计之PS界面初始化设置

    一.PS界面初始化 1.新建设置  web设计的基础标准:宽度为1920px,高度自定义,分辨率72px,背景模式RGB 8位.(提示:可以“存为预设”以便以后直接调用) 注意:背景内容为透明!!! ...

  3. ASP.NET缓存全解析5:文件缓存依赖 转自网络原文作者李天平

    这种策略让缓存依赖于一个指定的文件,通过改变文件的更新日期来清除缓存. ///<summary> /// 获取当前应用程序指定CacheKey的Cache对象值 ///</summa ...

  4. Android高手进阶:Adapter深入理解与优化

    一般是针对包含多个元素的View,如ListView,GridView,ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是 ...

  5. ubuntu安装 ibus-google输入法

    1.$sudo apt-get install ibus-googlepinyin     //ibus 融合了许多种输入法,google便是一种,此步就是下载安装ibus-google拼音输入法. ...

  6. C# 图片截图(圆形)

    //要截图的图片 Image img = Image.FromFile("D:\\soure.jpg"); //截图画板 Bitmap bm = , ); Graphics g = ...

  7. 关于Windows® API Code Pack for Microsoft® .NET Framework

    相比之前的操作系统,Window 7(or Vista)提供了很多新特性,我们在应用实现中可以利用这些特性来提升用户体验. 这些特性主要包括以下几个方面: Shell Enhancements Dir ...

  8. vpn连接成功后,本地无法连接外网

    把在远程网络上使用默认网关前面的对勾取消掉,确定就ok啦...

  9. java中serializable

    java中serializable是一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的.因此如果要序列化某些类的对象,这些类就必须实现Serializable接 ...

  10. Python-Day15 JavaScript/DOM

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...