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
&login_sig=IV9iX*D7tkypySsivwFDX-9K7DpgiKofym0JShvCrXYmXsScMK6bHuJ-UddPD3Th&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html&r=0.6170404219718775
这个请求的意思是检测当前输入的账号是否需要用验证码来登录,其中u这个参数是用户名,上面链接中的34310374是我的qq号码,login_sig是登录要用到的签名,每次登录的签名都不一样的,这个值稍候会说到如何提取到,这些参数是必要的动态参数,其余的参数目前发现是不变的,当然那些参数也可以提取到,为了防止这些参数以后会变,我都是通过动态提取的,做到万无一失。
检测是否需要验证码的参数提取
先看看载入http://w.qq.com的时候会做哪些事情,查看源代码,里面最有用的一句是:
<iframe noscroll style="position:absolute;width:100%;height:100%;border:0;" src="https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=16&mibao_css=m_webqq&appid=501004106&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fw.qq.com/proxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20130723001"></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.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');
这时候,第二个值就没什么用了,验证码是需要自己输入的。
如果需要验证码的时候,我们要提取验证码图片:
https://ssl.captcha.qq.com/getimage?aid=501004106&r=0.3435333&uin=34310374
同样用到的参数有appid和qq号码。
第一次登陆

QQ的登陆有两步,先看下一次登陆的请求地址:
https://ssl.ptlogin2.qq.com/login?u=34310374&p=0317300ACEB416A6AE3A8CADE8657BB8&verifycode=!XLF&webqq_type=10&remember_uin=1&login2qq=1&aid=501004106
&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10
&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=0-18-15313
&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10046&login_sig=IV9iX*D7tkypySsivwFDX-9K7DpgiKofym0JShvCrXYmXsScMK6bHuJ-UddPD3Th
参数解析:
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。

转载于:https://www.cnblogs.com/coding1016/p/3332745.html

玩转SmartQQ之登录相关推荐

  1. post SmartQQ之登录

    转载网址   http://www.cnblogs.com/coding1016/p/3332745.html 玩转SmartQQ之登录 SmartQQ是腾讯新出的一个WebQQ,登录地址是:http ...

  2. 电脑一启动吃鸡就重启计算机,租号器登录电脑重启-租号玩绝地求生提示登录出现异请重启客户端...

    租号玩绝地求生提示登录出现异请重启客户端 当账号显示异常时肯定是系统判定账号有异常行为,如果不再类似行为,过段时间异常则会自动消失.唯一应该做的就是频繁正常使用.对账号的处分会随着时间推移减弱(正常使 ...

  3. 玩转Windows个性化登录界面 (更换Windows7登录界面图片/XP仿Win7登录界面)

    玩转Windows个性化登录界面 (更换Windows7登录界面图片/XP仿Win7登录界面)

  4. 炉石传说iPad版抢鲜玩 最全国服登录教程

    <炉石传说>iPad版,4月3日正式在新西兰.加拿大.澳大利亚的App Store上架.下载安装后可以成功登录台服.那么国服的小伙伴只能等待么?其实我们只要简单修改,就可以成功登录国服.如 ...

  5. 战舰世界闪击战服务器维护时间,战舰世界闪击战玩不了怎么办 登录不上解决办法[多图]...

    战舰世界闪击战目前ios已经开放下载了,安卓玩家还需要等到10.25,有玩家说下载游戏,但是进不去是怎么回事,乖乖小编为大家介绍战舰世界闪击战玩不了怎么办. 战舰世界闪击战玩不了解决办法 网络问题 一 ...

  6. 来我家玩吧服务器维护中,为什么来我家玩吧登录不了,来我家玩吧进不去怎么回事...

    游戏介绍:<来我家玩吧>是一款模拟经营类休闲游戏,玩家在游戏中能够自由对自己的角色进行装扮,同时收集资源,在工坊中制作道具,去好友家串门等.游戏的社交性给玩家带来互动式体验. 为什么来我家 ...

  7. 谁是卧底服务器维护,聚会玩-谁是卧底无法打开怎么办 聚会玩-谁是卧底登录不了解决方案...

    最近十分火爆的手机游戏聚会玩-谁是卧底已经开放下载了,不过有不少玩家抢先下载之后却发现,无法登录聚会玩-谁是卧底,那么游戏无法打开怎么办呢?聚会玩-谁是卧底登录失败的原因是什么?所以九游小编这就为大家 ...

  8. java实现登录验证机制的技术_基于token的登陆验证机制

    session简介 做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话信息. 用户通过用户名和密码登陆成功之后,服务器端程序会在 ...

  9. 小米加密兔和百度莱茨狗怎么玩?莱茨狗和加密兔怎么注册

    数字货币区块链加密货币无疑是2018年最热门的新闻 了,尤其是近段时间各个巨头的加入更增加了,区块链技术的蓬勃发展,目前360区块猫,百度莱茨狗,小米加密兔,网易星球都纷纷涌入区块链技术.对于未来来说 ...

最新文章

  1. 21年最新Python面试题及答案汇总详解(上)
  2. mysql重复数据查询
  3. C/C++ VS中调用matlab函数的方法
  4. linux版本i686,linux-x86_64平台上的gcc i686
  5. 《利用Python》进行数据分析:Numpy基础1 数组对象ndarray
  6. Fast-SCNN 多分支结构共享低级特征的语义分割网络 (一)
  7. Android + Appium 自动化测试完整的环境配置及代码详解
  8. 高并发中的 限流、熔断、降级、预热、背压你都知道是什么意思吗?
  9. AppleParty(苹果派)v3 支持 App Store 新定价机制 - 批量配置自定价格和销售范围
  10. c语言里面%c什么作用,C语言里面,%d%c%f分别是什么意思?怎么用?
  11. CRM系统-----学员管理系统---admin自定义开发2
  12. android11开发版小米,小米CC9推送MIUI 12.5稳定版 新版系统内核升级至安卓11
  13. HI3861学习笔记(14)——ADC接口使用
  14. C++ STL容器 map禁止自动排序
  15. Springboot毕设项目股票交易模拟系统76wrijava+VUE+Mybatis+Maven+Mysql+sprnig)
  16. Java后端工程师必备书单(从Java基础到分布式)
  17. RF+APPIUM详细使用教程
  18. RabbitMQ入门笔记
  19. 阅读文献Evaluation of dynamic route planning impact on vehicular communications with SUMO
  20. 饭否android客户端,fanfou(饭否) android客户端 代码学习二

热门文章

  1. java 微信转账_实现微信转账功能
  2. 计算机游戏的英文单词,关于游戏的英语词汇
  3. php $globa作用是l,php 关键字global在定义变量中的作用
  4. 转发和重定向的区别是什么
  5. java map可以直接用增强for吗
  6. 028_vue路由嵌套
  7. 050_学习的CSS属性
  8. jsp文件通常用common_JSP使用commons-fileupload实现文件上传实例
  9. 驱动备份工具哪个好_文章原创度检测工具哪个好?这个工具还有其他你不知道的功能...
  10. 二叉排序树的实现——java