看一下我的go channell怎么回事,全部有一个D

& 基于WebQQ3.0协议写一个QQ机器人
基于WebQQ3.0协议写一个QQ机器人
一个偶然的机会,在某群看到一个类似QQ机器人的玩意在骚动,问那哥们回答说是JAVA写的,原来QQ还能这样玩儿。于是乎,我也就开始骚动了。Let’s go
1.WEBQQ3.0登陆协议
进入WEBQQ, http://web.qq.com/
通过工具分析,可以知道,用户在输入密码之前(也就是输入帐号后),会首先GET一个请求过去
https://ssl.ptlogin2.qq.com/check?uin=8;appid=8;r=0.5969
我们只详细分析下这一个请求,看看,这个请求到底携带了什么样的数据
这个GET请求返回ptui_checkVC(*,’!TMX’,'\x00\x00\x00\x00\x0e\xe9\x41\xc1′);这样的字符串,其中第一个字符串,*代表不需要验证码,’!TMX’这个数据,是等会登陆需要的,第三个字符串加密密码的时候会用到。
附PHP代码如下:
* 获取验证码
* @access public
* @param int $uid
* @return array
function check_verify($uid)
$ch = curl_init(&https://ssl.ptlogin2.qq.com/check?uin={$uid}&appid=1003903&r=0.44134&);
$cookie = &confirmuin=0; ptvfsession=b08d5530df1dcfda2edd94aabec43bf450d8cfaa1a7dbed494cc62efa3ef35 ptisp=cnc&;
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_COOKIEJAR, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
if (preg_match(&/ptui_checkVC\('(.*)','(.*)','(.*)'\);/&, $data, $verify))
return array_slice($verify, 1);
/* WebQQ3.0 core part end of */
密码登陆后,监控到这样一个请求
http://ptlogin2.qq.com/login?u={$uid}&p={$passwd}&verifycode={$verify}&webqq_type=10&remember_uin=1&login2qq=1&aid=8;u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=;from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=8-38-8;mibao_css=m_webqq&t=3&g=1
其中有三个参数需要解释一下
p:加密后的密码
verifycode:验证码
附PHP版登录函数以及加密函数代码如下:
* WEBQQ3.0 新版登陆加密函数
* @access public
* @param string $p
* @param string $pt
* @param string $vc
* @param boolean $md5
* @return string
function jspassword($p,$pt,$vc,$md5 = true)
if ($md5)
$p = strtoupper(md5($p));
$len = strlen($p);
$temp = null;
for ($i=0; $i & $len ; $i = $i + 2)
$temp .= '\x'.substr($p, $i,2);
return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));
* 十六进制转字符
* @access private
* @param string $str
* @return string
function hex2asc($str)
$str = join('', explode('\x', $str));
$len = strlen($str);
$data = null;
for ($i=0;$i&$len;$i+=2)
$data .= chr(hexdec(substr($str,$i,2)));
return $data;
* @access public
* @param int $uid
* @param string $passwd
* @param string $verify
* @return array
function login($uid, $passwd, $verify)
$url = &http://ptlogin2.qq.com/login?u={$uid}&p={$passwd}&verifycode={$verify}&webqq_type=10&remember_uin=1&login2qq=1&aid==http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=8-38-447467&mibao_css=m_webqq&t=3&g=1&;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_COOKIEJAR, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
if (preg_match(&/ptuiCB\('(.*)','(.*)','(.*)','(.*)','(.*)',\s'(.*)'\);/U&, $data, $verify))
return array_slice($verify, 1);
/* WebQQ3.0 core part end of */
登录成功后返回值类似:
ptuiCB(*,*,’http://web.qq.com/loginproxy.html?login2qq=1&webqq_type=10′,*,’登录成功!’, ‘秋风’);
还有一组COOKIE,COOKIE值全都保存起来,待会儿会用到。
到这一步其实还没有真正的登录QQ的聊天接口,继续往下看。
第一次登录成功后,紧接着发送一个POST到http://d.web2.qq.com/channel/login2
POST值(请把参数值用urlencode函数编码)如下:
r={“status”:”online”,”ptwebqq”:”{$ptwebqq}”,”passwd_sig”:”",”clientid”:”{$clientid}”,”psessionid”:null}&clientid={$clientid}&psessionid=null
其中ptwebqq的值来自第一次登录时候的COOKIE值ptwebqq
clientid是个随机数,自己定义就行了
请求后的返回值是一个JSON格式的值,保存起来,后边收发信息时会用到:
到此为止,登陆就完成了。
附PHP版解析Cookie File函数以及登录函数代码如下:
* 解析cookie
* @access public
* @return array
function parse_cookie()
// Netscape HTTP Cookie File
$cookies = file(temp_dir.&cookie&);
$data = array();
foreach ($cookies as $v)
if (preg_match(&/(.*\.qq\.com)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)\n/U&, $v, $p))
$data[] = array_slice($p, 1);
return $data;
* 获取cookie
* @param array $cookie
* @return array
function get_cookie($cookie = NULL)
if ($cookie === NULL)
$cookie = parse_cookie();
if (is_array($cookie) && count($cookie)&=6)
return FALSE;
foreach ($cookie as $v)
$data[$v[5]] =$v[6];
return $data;
* 真正的登录(上线)
* @access public
* @param string $ptwebqq
* @return string
function login2($ptwebqq,$clientid)
$url = &http://d.web2.qq.com/channel/login2&;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, &r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22{$ptwebqq}%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3Anull%7D&clientid={$clientid}&psessionid=null&);
// 必须要来路域名
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=2&);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_COOKIEJAR, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);
/* WebQQ3.0 core part end of */
2.传说中的心跳包
顾名思义,心跳包,就是维持一个长连接,让WEBQQ保持在线的一种机制,.这个心跳包非常简单,只需要每隔几秒,或者写一个死循环发起请求就好(长时间不触发此步骤,会导致QQ掉线)
POST地址:http://d.web2.qq.com/channel/poll2
POST值(请把参数值用urlencode函数编码)如下:
r={“clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”,”key”:0,”ids”:[]}&clientid={$clientid}&psessionid={$psessionid}
其中psessionid的值,在第二次登录返回的JSON信息里边能找到
clientid与第二次登录时候的clientid相同
附PHP版心跳请求函数代码如下:
* 心跳包(获取消息)
* @access public
* @param string $psessionid
* @param int $clientid
* @return string
function poll($psessionid,$clientid)
$post = &r=%7B%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3A%22{$psessionid}%22%2C%22key%22%3A0%2C%22ids%22%3A%5B%5D%7D&clientid={$clientid}&psessionid={$psessionid}&;
$ch = curl_init(&http://d.web2.qq.com/channel/poll2&);
// 必须要来路域名
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=3&);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);
/* WebQQ3.0 core part end of */
3.获取QQ群列表
POST地址:http://s.web2.qq.com/api/get_group_name_list_mask2
POST值(请把参数值用urlencode函数编码)如下:
r={“vfwebqq”:”{$vfwebqq}”}
只有一个参数,很爽对吧?这个值在第二次登录的时候可得到,回头去找找看吧
附PHP版获取群列表函数代码如下:
* 获取群列表
* @access public
* @param string $vfwebqq
* @return string
function get_group_name_list_mask($vfwebqq)
$post = &r=%7B%22vfwebqq%22%3A%22{$vfwebqq}%22%7D&;
$ch = curl_init(&http://s.web2.qq.com/api/get_group_name_list_mask2&);
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=3&);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);
/* WebQQ3.0 core part end of */
4.获取好友列表
POST地址:http://s.web2.qq.com/api/get_user_friends2
POST值(请把参数值用urlencode函数编码)如下:
r={“h”:”hello”,”vfwebqq”:”{$vfwebqq}”}
vfwebqq的值在第二次登录的时候可得到,回头去找找看吧
附PHP版获取好友列表函数代码如下:
* 获取好友列表
* @access public
* @param string $vfwebqq
* @return string
function get_user_friend($vfwebqq)
$post = &r=%7B%22h%22%3A%22hello%22%2C%22vfwebqq%22%3A%22{$vfwebqq}%22%7D&;
$ch = curl_init(&http://s.web2.qq.com/api/get_user_friends2&);
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=3&);
curl_setopt($ch, CURLOPT_COOKIEFILE, temp_dir.&cookie&);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);
/* WebQQ3.0 core part end of */
5.发送QQ消息
POST地址:http://d.web2.qq.com/channel/send_buddy_msg2
POST值(请把参数值用urlencode函数编码)如下:
r={“to”:{$from_uin},”face&#,”content”:”[\"{$msg}\\n\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\”color\”:\&#\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}
部分参数解释:
to:好友的uin(非QQ号)
content:发送的消息内容
psessionid:在第二次登录返回的JSON信息里边能找到
clientid:与第二次登录时候的clientid相同
附PHP版发送QQ消息函数代码如下:
* 发送QQ消息
* @access public
* @param int $from_uin
* @param string $msg
* @param string $psessionid
* @param int $clientid
* @return string
function send_buddy_msg($from_uin, $msg, $psessionid, $clientid)
static $msg_id=;
$msg_id++;
$post = &r=%7B%22to%22%3A{$from_uin}%2C%22face%22%3A606%2C%22content%22%3A%22%5B%5C%22{$msg}%5C%5Cn%5C%22%2C%5B%5C%22font%5C%22%2C%7B%5C%22name%5C%22%3A%5C%22%E5%AE%8B%E4%BD%93%5C%22%2C%5C%22size%5C%22%3A%5C%%2C%5C%22style%5C%22%3A%5B0%2C0%2C0%5D%2C%5C%22color%5C%22%3A%5C%C%22%7D%5D%5D%22%2C%22msg_id%22%3A{$msg_id}%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3A%22{$psessionid}%22%7D&clientid={$clientid}&psessionid={$psessionid}&;
$ch = curl_init(&http://d.web2.qq.com/channel/send_buddy_msg2&);
// 必须要来路域名
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=3&);
curl_setopt($ch, CURLOPT_COOKIEFILE, &cookie&);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_exec($ch);
/* WebQQ3.0 core part end of */
6.发送QQ群消息
POST地址:http://d.web2.qq.com/channel/send_qun_msg2
POST值(请把参数值用urlencode函数编码)如下:
r={“group_uin”:{$group_id},”content”:”[\"{$msg}\\n\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\”color\”:\&#\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}
部分参数解释:
group_uin:群的uin(非QQ群号)
content:发送的消息内容
psessionid:在第二次登录返回的JSON信息里边能找到
clientid:与第二次登录时候的clientid相同
附PHP版发送QQ群消息函数代码如下:
* 发送群消息
* @access public
* @param int $group_id
* @param string $msg
* @param string $psessionid
* @param int $clientid
* @return string
function send_qun_msg($group_id, $msg, $psessionid, $clientid)
static $msg_id = ;
$msg_id++;
$post = &r=%7B%22group_uin%22%3A{$group_id}%2C%22content%22%3A%22%5B%5C%22{$msg}%5C%5Cn%5C%22%2C%5B%5C%22font%5C%22%2C%7B%5C%22name%5C%22%3A%5C%22%E5%AE%8B%E4%BD%93%5C%22%2C%5C%22size%5C%22%3A%5C%%2C%5C%22style%5C%22%3A%5B0%2C0%2C0%5D%2C%5C%22color%5C%22%3A%5C%C%22%7D%5D%5D%22%2C%22msg_id%22%3A{$msg_id}%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3A%22{$psessionid}%22%7D&clientid={$clientid}&psessionid={$psessionid}&;
$ch = curl_init(&http://d.web2.qq.com/channel/send_qun_msg2&);
curl_setopt($ch, CURLOPT_REFERER, &http://d.web2.qq.com/proxy.html?v=&callback=1&id=3&);
curl_setopt($ch, CURLOPT_COOKIEFILE, &cookie&);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_exec($ch);
/* WebQQ3.0 core part end of */
事实上,做到心跳包的时候,再往下已经没有技术含量了,已经属于体力活了。
最后附一个基于WebQQ3.0写的一个开源的,有兴趣的朋友可以研究研究。
http://www.cnblogs.com/gitdnn/archive//2858408.html
http://www.meesii.in/71.html
本文目前尚无任何 trackbacks 和 pingbacks.
Recent Posts[D.O.°百度都暻秀吧字幕组]151120 EXO CHANNEL E16 中字_腾讯视频
三倍流畅播放
1080P蓝光画质
新剧提前看
1080P蓝光画质
纯净式无框播放器
三倍流畅播放
扫一扫 手机继续看
下载需先安装客户端
{clientText}
客户端特权:
3倍流畅播放
当前播放至 {time}
扫一扫 手机继续看
偶像料理王
中秋料理特辑!EXO伯贤俊勉遭“鸡蛋”魔咒
section TV 演艺通信
叮咯咙咚呛
EXO黄子韬金钟大应援安七炫,金钟国拥抱熊黛林久久不撒手。
一周最热韩综
EXO老歌《蝴蝶少女》舞台solo,成长中的EXO就像破茧的蝴蝶!
艺兴钢琴伴奏,EXO四大主演唱,再无法重现的《十二月的奇迹》
《人气歌谣》现场版!EXO张艺兴、边伯贤、朴灿烈
EXO《Louder》 (160820 Show音乐中心)
EXO《咆哮 Growl》中韩
Lotto & 因为红 饭制版
EXO现场 全程边伯贤镜头看看我们伯贤舞技提高多少了?
快乐大本营,EXO,灿烈让伯贤喝苦瓜汁,幸灾乐祸
EXO《The Eve》Music Video
EXO吴世勋永远是最独特的存在,走到哪里都是让人瞩目的焦点
吴世勋五官长得标致, 男团里面颜值数一数二!
The EXO'rDIUM三巡杭州张艺兴solo focus
EXO《Call me baby》《Love me right》这两场帅杀少女心
EXO十二个人最帅的一次舞台表演!全场尖叫沸腾
边伯贤这眼睛伤成这样 还要坚持上舞台演出
EXO完美混剪 舔屏控制不住
EXO SUHO杂志拍摄现场花絮,演绎帅气暖男风!
EXO吴世勋朴灿烈《CeCi》夏日画报,如有美少年!
EXO演出现场 真的很少见在球场中间跳舞
饭制版 EXO边伯贤
群星清唱微盘点 饭制版
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要过气Up主。搬运全凭喜好,有原音搬原音,没有就搬配音,睁大眼睛看清楚啦~投稿:1040粉丝:4.2万分享13dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制Flash地址复制Html地址复制微信扫一扫分享收藏208硬币17稍后看马克一下~用手机看缓存更方便用或其他应用扫描二维码看过该视频的还喜欢miniOFF如何查看Office2013版本(大客户版和零售版) - Office办公助手
最专业的Office办公软件学习和原创Office教程网站!
如何查看Office2013版本(大客户版和零售版)
发布时间:08-18 来源:亮术网
Office2013 有几个版本,分别是:家庭和学生版、小型企业版、专业版和 Office 365家庭高级版。而这些版本中又分为&VOL版(大客户版)&和&Retail版(零售版)&,并且很不容易区分,下载的安装文件没有写明,安装后也没有直接查看的功能,下面就来探讨如何查看Office2013 是&VOL版(大客户版)&还是&Retail版(零售版)&。
方法一:根据安装特点区分
安装的时候,VOL版(大客户版)是不用输入序列号的,而 Retail版(零售版)必须要输入序列号,尽管所输入的序列号不一定通过验证,据此可区分它们。
方法二:用命令查看
1、快捷步骤
打开 Office2013 安装文件夹(Microsoft Office) & 按住 Shift,右键&Office15 文件夹& & 在此处打开命令窗口 & 输入cscript ospp.vbs /dstatus & 查找 LICENSE DESCRIPTION: Office 15, RETAIL channel 或 LICENSE DESCRIPTION: Office 15,VOLUME_KMSCLIENT channel,前者是零售版,后者是 VOL版。
2、快捷步骤
1)打开 Office2013 的安装文件夹 D:\Program Files\Microsoft Office,如果安装在 C盘,是把 D 改为 C 即可。
2)按住 Shift 键,在 Office15 文件夹上单击右键,选择&在此处打开命令窗口&,则打开&命令提示符&窗口,如图1所示:
当然也可以通过&开始 & 所有程序 & 附件 & 命令提示符&打开&命令提示符&窗口,然后用 Dos 命令定位到 Office2013 的安装目录(D:\Program Files\Microsoft Office)。
3)输入 cscript ospp.vbs /dstatus 回车,此时已显示版本信息,如图2所示:
4)图2中显示的是 LICENSE DESCRIPTION: Office 15, RETAIL channel,说明是零售版。
5)如果显示 LICENSE DESCRIPTION: Office 15, VOLUME_KMSCLIENT channel,则是 VOL版,如图3所示:
本文主要分享了如何查看Office2013 Vol版和 Retail版,至于怎么查看Office2013 专业版、学生和家庭版,想必不用多说了,因为下载的安装文件会写清楚,安装后在程序列表中也会显示。
上一篇: 下一篇:
专题教程推荐
(window.slotbydup=window.slotbydup || []).push({
id: '3577897',
container: s,
size: '300,450',
display: 'inlay-fix'
热门资源下载我想知道我的香奈儿手表是真是假。后表盘写着CHANEL PARlS D.N.02716 AUTOMA_百度知道
我想知道我的香奈儿手表是真是假。后表盘写着CHANEL PARlS D.N.02716 AUTOMA
我想知道我的香奈儿手表是真是假。后表盘写着CHANEL
AUTOMATlC.SWlSS MADE然后一个🐟的标志后面写着200m
我有更好的答案
你如果不是专柜买的基本上就是假的了,这种很多假货在市面上,一般也就几百块钱一块,质量比正的肯定差不少。
采纳率:78%
算是A货,到绝非真品!
大概价格在多少
正品和水货肯定不同喽!只要自己喜欢何必管它那么多!只要你不去欧洲旅游带上就没事放心用!
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 filechannel 的文章

 

随机推荐