php web请求 过程,Web QQ 的请求交互过程
获取安全参数
发送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 的请求交互过程相关推荐
- QQ邮箱的SMTP交互过程
腾讯QQ邮箱的SMTP交互过程 腾讯QQ邮箱的交互过程中不是使用的密码登录,而是授权码,使用stl加密方式 telnet smtp.qq.com 25 //使用DOS命令控制台,TELNET的方式,S ...
- 802.11协议帧格式、Wi-Fi连接交互过程、无线破解入门
转自: http://www.cnblogs.com/littlehann/p/3700357.html Linux黑客大曝光: 第8章 无线网络 无线网络安全攻防实战进阶 无线网络安全 黑客大曝光 ...
- web接口测试之GET与POST请求
目录 目录 前言 GET请求 POST请求 前言 关于HTTP协议,我考虑了一下觉得没必要再花一节内容来介绍,因为网上关于HTTP协议的介绍非常详细.本着以尽量避免介绍一空洞了概念与理论来介绍接口测试 ...
- 使用Java模拟Web端的POST或GET请求,实现自动化操作:加密狗烧制技术详解
简介 硬件锁(加密狗)加密软件.与金雅特公司合作的方式是:买家公司开发一个授权程序(这里公司的授权程序:Encrypt类的encrypt()方法),进行授权管理用户锁. 注意:LZ只演示模拟Web端的 ...
- web请求报出 “超过了最大请求长度” 【注意:重启IIS】
摘自:http://www.cnblogs.com/loalongblogs/archive/2012/10/16/2726372.html web请求报出 "超过了最大请求长度" ...
- 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头
[WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...
- easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求
之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范 ...
- Go Web编程--深入学习解析HTTP请求
之前这个系列的文章一直在讲用 Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规 ...
- web服务器没有对应站点,原因:您的请求在Web服务器中没有找到对应的站点的解决方法...
宝塔主机面板网站提示您的请求在Web服务器中没有找到对应的站点的解决方法的原因分析及解决方法,环境吧分享BT宝塔面板没有找到站点的原因及解决方法: 宝塔面板报错提示:没有找到站点 宝塔面板没有找到站点 ...
最新文章
- python视频教程云盘-Python自动化测试视频教程【百度云盘下载】
- 解决window2012 IIS8 配置的网站无法下载exe文件的问题
- 计算机网络基础必备(三次握手,四次握手,以及HTTP协议相关)
- 对称加密算法之分组加密的六种工作模式(ECB、CBC、PCBC、CFB、OFB、CTR)
- 匿名内部类可以访问private_内部类一篇文章搞定
- 使用OutputDebugString帮助调试
- 在 .NET 中使用 Flurl 高效处理Http请求
- 数学思维比数学运算更重要
- 基元线程同步构造之waithandle中 waitone使用
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
- 【目标检测】IoU(交并比)详解及代码实现
- 《Essential C++》笔记之迭代器Iterator(泛型指针)
- 让搜索显示中文的方法
- easyUI根据参数动态的生成列数
- 使用 HttpURLConnection URL 发送请求,解决字符编码问题
- deal.II链接PETSc过程记录
- 4. Nginx 与 PHP
- 服务器调用税务数字系统失败,终于等到你!网上报税常见问题解决方案大集锦!!!...
- oracle临时表经常被锁_linux安装oracle
- 谷歌、百度循环多次翻译、语音下载python脚本