获取安全参数

发送http GET请求:

https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20130830001

在响应的HTML中通过正则表达式  /var g_login_sig=encodeURIComponent\(“(.+?)”\);/)获取到安全参数sign.

在上面的URL中,有个参数要注意 appid=1003903这个参数在下面的步骤中经常遇到.

处理验证码

首先检验是否需要输入验证码

发送HTTP GET请求

”https://ssl.ptlogin2.qq.com/check?uin={0}&appid={1}&js_ver=10038&js_type=0&login_sig={2}&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.5331138293443659″.format(QQ, APPID, sign);

上面的请求中,参数QQ指要登录的QQ号码,APPID始终为1003903,sign是上步中获取到的安全参数.

响应类似于下面的格式:

pt_checkVC('0', '!B55', '\x00\x00\x00\x00\xa6\xce\xef\xfe')

如果第一个数字为0,则表示第二个参数做为验证码;如果为1,则表示要通过图片输入验证码,验证码图片的请求如下:

发送https GET请求

“https://ssl.captcha.qq.com/getimage?aid={0}&r={1}&uin={2}”.format(APPID, Math.random(), QQ)

获取图片后可以得到验证码.

第一次登录

发送https GET请求:

‘https://ssl.ptlogin2.qq.com/login?u={0}&p={1}&verifycode={2}&webqq_type=10&remember_uin=1&login2qq=1&aid={3}&u1={4}&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=1-41-15424&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10038&login_sig={5}’.format(QQ, p, vc, APPID, “http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10″, sign);

参数QQ指QQ号,p指加密后的密码,vc是验证码.

该请求必须设置Refer为:’https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164′.

如果登录成功,会返回ptuiCB('0',....),从返回的cookie中取出ptwebqq.

密码的加密算法在js中,地址是:https://ui.ptlogin2.qq.com/js/10043/comm.js?ptui_identifier=000E012E3A89FB8098A4F8D0E9B21E4FF2947BF9AD24272D7C18A9AC29

加密算法的大致如下:

function getEncPass(q, p, v){

var I = hexchar2bin(md5(p));

var H = md5(I + hexchar2bin(pad(q.toString(16),16)));

return md5(H + v.toUpperCase());

}

其中,q为Q号,p为密码,v是验证码.

这步完了以后只是登录了网站,采用QQ单点认证机制的网站都可以通过的原理登录.

登录成功后返回的字符串中有一个url,以HTTP GET请求方式发送该请求,在响应中会返回两个重要的Cookie:p_skey,pt4_token

第二次登录

发送http POST请求:

http://d.web2.qq.com/channel/login2′

请求的headers必须设置content-type为application/x-www-form-urlencoded; charset=UTF-8, referer 为http://d.web2.qq.com/proxy.html?v=20110331002&callback=2.同时把上个请求的cookie也发送回去.

该请求的post参数有三个’{“status”:”online”,”ptwebqq”:”{0}”,”passwd_sig”:”",”clientid”:”{1}”,”psessionid”:null}’.format(PTWebQQ, ClientID);

请求会返回一个JSON格式的字符串,属性retcode为0则表示登录成功.

{"retcode":0,

"result":

{

"uin":10897944,"cip":1959559061,"index":1075,"port":40036,"status":"online",

"vfwebqq":"963856c05954b2f1a0b1f4efff16cc605ce3a1b84792ac678dee4b919c1a",

"psessionid":"c53856c05954b2f1a0b1f4efff16cc605ce3a1b84792ac678dee4b919c1a","user_state":0,"f":0

}

}

登录成功后,将上面JSON中的vfwebqq和psessionid取出来,供下面的请求使用.

获取好友列表

发送HTTP POST请求

http://s.web2.qq.com/api/get_user_friends2

POST参数为:

r {“h”:”hello”,”hash”:”1FD22A64″,”vfwebqq”:”2445fac910fd4f2e1c01a5fcab36d13a024ccb75abed5360dbf6393c58670cb896bb578e86d3d9ee”}

请求headers需要设置cookie,cookie必须有三个值p_uin, p_skey, pt4_token, ptwebqq.

p_uin为字母o+QQ号的10位形式(不足10位前面补零),如o1624240747

序列化以后为’r=%7B%22h%22%3A%22hello%22%2C%22hash%22%3A%221FD22A64%22%2C%22vfwebqq%22%3A%222445fac910fd4f2e1c01a5fcab36d13a024ccb75abed5360dbf6393c58670cb896bb578e86d3d9ee%22%7D’;

hash通过js算出来的一个值,该算法经常会变,这儿就不列出来了.

请求成功后返回好友列表.

接收好友消息

Web QQ通过不断发送poll2轮询获取好友消息

发送HTTP POST请求:

http://d.web2.qq.com/channel/poll2

POST参数

{r:’{“clientid”:”{0}”,”psessionid”:”{1}”,”key”:0,”ids”:[]}’.format(ClientID, PSessionID),clientid:ClientID, psessionid:PSessionID}

clientid为随机生成的客户端ID, 在Web QQ 所有过程中应该保持一致.

请求headers必须设置

headers : {‘content-length’:post_data.length,’content-type’:'application/x-www-form-urlencoded; charset=UTF-8′,referer : ‘http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=3′},

cookie不需要

请求返回一个JSON字符串

{"retcode":0,"result":[{"poll_type":"buddies_status_change","value":{"uin":3983012188,"status":"online","client_type":1}}]}

retcode为0表示获取成功.

poll_type这儿列举几种可能的值:

message : 正常的消息

kick_message : 被踢下线

buddies_status_change : 好友在线状态改变

input_notify : 正在输入

tips : 提示信息

各种消息的构造就不说了.

给好友发送消息

发送HTTP POST请求

http://d.web2.qq.com/channel/send_buddy_msg2

post参数为

{

r : r,

clientid : ClientID,

psessionid : PSessionID

})

r为一个字符串,形式如:

‘{“to”:’ + uin +’,”face”:579,”content”:”[\\"' + result + '\\\\n\\",[\\"font\\",{\\"name\\":\\"微软雅黑\\",\\"size\\":\\"10\\",\\"style\\":[0,0,0],\\”color\\”:\\”000000\\”}]]”,”msg_id”:33470003,”clientid”:”‘+ClientID+’”,”psessionid”:”‘+PSessionID+’”}’

其中uin 指好友的临时号码,获取好友列表的时候可以取的到.

请求的headers必须设置referer为’http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=2′,不需要设置cookie

php web请求 过程,Web QQ 的请求交互过程相关推荐

  1. QQ邮箱的SMTP交互过程

    腾讯QQ邮箱的SMTP交互过程 腾讯QQ邮箱的交互过程中不是使用的密码登录,而是授权码,使用stl加密方式 telnet smtp.qq.com 25 //使用DOS命令控制台,TELNET的方式,S ...

  2. 802.11协议帧格式、Wi-Fi连接交互过程、无线破解入门

    转自: http://www.cnblogs.com/littlehann/p/3700357.html Linux黑客大曝光: 第8章 无线网络 无线网络安全攻防实战进阶 无线网络安全 黑客大曝光 ...

  3. web接口测试之GET与POST请求

    目录 目录 前言 GET请求 POST请求 前言 关于HTTP协议,我考虑了一下觉得没必要再花一节内容来介绍,因为网上关于HTTP协议的介绍非常详细.本着以尽量避免介绍一空洞了概念与理论来介绍接口测试 ...

  4. 使用Java模拟Web端的POST或GET请求,实现自动化操作:加密狗烧制技术详解

    简介 硬件锁(加密狗)加密软件.与金雅特公司合作的方式是:买家公司开发一个授权程序(这里公司的授权程序:Encrypt类的encrypt()方法),进行授权管理用户锁. 注意:LZ只演示模拟Web端的 ...

  5. web请求报出 “超过了最大请求长度” 【注意:重启IIS】

    摘自:http://www.cnblogs.com/loalongblogs/archive/2012/10/16/2726372.html web请求报出 "超过了最大请求长度" ...

  6. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

  7. easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求

    之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范 ...

  8. Go Web编程--深入学习解析HTTP请求

    之前这个系列的文章一直在讲用 Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规 ...

  9. web服务器没有对应站点,原因:您的请求在Web服务器中没有找到对应的站点的解决方法...

    宝塔主机面板网站提示您的请求在Web服务器中没有找到对应的站点的解决方法的原因分析及解决方法,环境吧分享BT宝塔面板没有找到站点的原因及解决方法: 宝塔面板报错提示:没有找到站点 宝塔面板没有找到站点 ...

最新文章

  1. python视频教程云盘-Python自动化测试视频教程【百度云盘下载】
  2. 解决window2012 IIS8 配置的网站无法下载exe文件的问题
  3. 计算机网络基础必备(三次握手,四次握手,以及HTTP协议相关)
  4. 对称加密算法之分组加密的六种工作模式(ECB、CBC、PCBC、CFB、OFB、CTR)
  5. 匿名内部类可以访问private_内部类一篇文章搞定
  6. 使用OutputDebugString帮助调试
  7. 在 .NET 中使用 Flurl 高效处理Http请求
  8. 数学思维比数学运算更重要
  9. 基元线程同步构造之waithandle中 waitone使用
  10. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
  11. 【目标检测】IoU(交并比)详解及代码实现
  12. 《Essential C++》笔记之迭代器Iterator(泛型指针)
  13. 让搜索显示中文的方法
  14. easyUI根据参数动态的生成列数
  15. 使用 HttpURLConnection URL 发送请求,解决字符编码问题
  16. deal.II链接PETSc过程记录
  17. 4. Nginx 与 PHP
  18. 服务器调用税务数字系统失败,终于等到你!网上报税常见问题解决方案大集锦!!!...
  19. oracle临时表经常被锁_linux安装oracle
  20. 谷歌、百度循环多次翻译、语音下载python脚本

热门文章

  1. 2017湖北计算机二级准考证打印入口,2017年全国计算机二级准考证打印网址.doc
  2. 如何除去一张图片四周的空白部分
  3. cosmic自动拆分
  4. Unity3D全景视频渲染
  5. 引用拷贝,浅拷贝,深拷贝之间的区别以及如何实现
  6. Linux常见命令详解
  7. appStore审核说明
  8. 销售技巧:销售如何能和客户找到共鸣点
  9. 2种方法恢复回收站已删除的文件,必看干货
  10. bars 除障句完整_2020年实用的治愈系晚安QQ问候语汇总75句