首页 > 编程 > PHP > 正文

实现基本QQ功能的PHP类-QQ机器人

2020-03-24 17:29:57
字体:
来源:转载
供稿:网友
1、研究说明Tencent在tqq.tencent.com的8000有一个使用HTTP的QQ接口,通过这个接口,可以进行一些基本的操作,如:登陆、登出、改变登陆状态(上线、忙碌、离线、隐身)、添加删除好友、查看好友信息、发送验证信息(接受被加为好友、申请加对方为好友、拒绝被加为好友)、收发用户消息、系统信息。目前我研究的是1.1版本的HTTP QQ协议,研究是微程在的成果上进行的,不敢说有什么超越,只不过更为详细和准确。2、接口说明:接口位置:tqq.tencent.com:8000通信协议:HTTP数据传输方法:POSTHTTP请求格式:
POST HTTP/1.1

Host: tqq.tencent.com:8000

Content-Type: text/plain; charset=UTF-8

Content-length: 长度

Connection: close
以上4个参数是每个请求都必有的。其中,VER表示协议的版本,目前为1.1,据说1.2已经出来了,这个乱写的话,服务器返回NULL;CMD为操作的指令,有Login、List、Query_Stat、GetInfo、AddToList、Ack_AddToList、DelFromList、Change_Stat、GetMsgEx、CLTMSG、Logout;SEQ为当前请求的标记,防止重复发送,可以用当前时间,也可以用随机数;UIN是当前执行操作的QQ号。不过不同的CMD还需要不同的参数,下面我就公布我的研究成果。3、研究方法:我对目前网上的资料不够满意,就自己写程序,发送多条相同CMD不同参数的请求,根据服务器的返回,来做判断。感兴趣的朋友可以参考一下,此处可以跳过。下面我公布我探测的代码(PHP):

?

$uin = QQ号

$pwd = md5( QQ密码

//登陆测试

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M5=1 LC=9326B87B234E7235

//注意:登陆测试不能同时进行,必须等到服务器认为QQ断开了,才能够测试,不然结果不可信

/*******

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M5=0 LC=9326B87B234E7235

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M5=1 LC=9326B87B234E7235

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M5=2 LC=9326B87B234E7235

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M5=3 LC=9326B87B234E7235

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M6=1 LC=9326B87B234E7235

$poststring[] = VER=1.1 CMD=Login SEQ= .rand(1000,9000). UIN= .$uin. PS= .$pwd. M6=1 LC=1223423545756679

*******/

//得到好友列表

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin;

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=160

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=160 UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=160 UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=List SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN=106814

//得到在线列表

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin;

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=160

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=160 UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=160 UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN= .rand(1,200). UN=0

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN= .rand(1,10);

$poststring[] = VER=1.1 CMD=Query_Stat SEQ= .rand(1000,9000). UIN= .$uin. TN=0 UN=106814

//查看好友信息

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=0 UN=106814

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=1 UN=106814

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=2 UN=106814

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=3 UN=106814

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=4 UN=106814

$poststring[] = VER=1.1 CMD=GetInfo SEQ= .rand(1000,9000). UIN= .$uin. LV=5 UN=106814

//增加好友

$poststring[] = VER=1.1 CMD=AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814

//发送验证

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=0 RS=TEST

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=1 RS=TEST

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=2 RS=TEST

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=3 RS=TEST

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=4 RS=TEST

$poststring[] = VER=1.1 CMD=Ack_AddToList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 CD=5 RS=TEST

//删除好友

$poststring[] = VER=1.1 CMD=DelFromList SEQ= .rand(1000,9000). UIN= .$uin. UN=106814

//改变状态

for($i=0;$i $i=$i+5)

{

$poststring[] = VER=1.1 CMD=Change_Stat SEQ= .rand(1000,9000). UIN= .$uin. ST= .$i;

}

//获得消息

$poststring[] = VER=1.1 CMD=GetMsgEx SEQ= .rand(1000,9000). UIN= .$uin.

//发送消息

$poststring[] = VER=1.1 CMD=CLTMSG SEQ= .rand(1000,9000). UIN= .$uin. UN=106814 MG=TEST

//登出

$poststring[] = VER=1.1 CMD=Logout SEQ= .rand(1000,9000). UIN= .$uin.

$file = fopen( p.txt , w

foreach($poststring as $k= $v)

{

ss_timing_start();

$fp = fsockopen( tqq.tencent.com , 8000 , $errno, $errstr, $timeout = 10);

if(!$fp){

//error tell us

$content = $k.chr(13).chr(10). ERROR:$errstr ($errno)

}else{

//send the server request

fputs($fp, POST HTTP/1.1

// fputs($fp, Host: $host

// fputs($fp, Content-type: application/x-www-form-urlencoded

fputs($fp, Content-length: .strlen($v).

fputs($fp, Connection: close

fputs($fp, $v .

//loop through the response from the server

$res =

while(!feof($fp)) {

$res .= fgets($fp, 4096);

}

//close fp - we are done with it

fclose($fp);

$content = $v.chr(13).chr(10).$res;

}

ss_timing_stop();

$content .= chr(13).chr(10). Time: .ss_timing_html' target='_blank'>current().chr(13).chr(10). -------------------------------------- .chr(13).chr(10);

fputs($file,$content);

}

fclose($file);

?

function ss_timing_start ($name = default ) {

global $ss_timing_start_times;

$ss_timing_start_times[$name] = explode( , microtime());

}

function ss_timing_stop ($name = default ) {

global $ss_timing_stop_times;

$ss_timing_stop_times[$name] = explode( , microtime());

}

function ss_timing_current ($name = default ) {

global $ss_timing_start_times, $ss_timing_stop_times;

if (!isset($ss_timing_start_times[$name])) {

return 0;

}

if (!isset($ss_timing_stop_times[$name])) {

$stop_time = explode( , microtime());

}

else {

$stop_time = $ss_timing_stop_times[$name];

}

$current = $stop_time[1]-$ss_timing_start_times[$name][1];

$current += $stop_time[0]-$ss_timing_start_times[$name][0];

return $current;

}

?
html教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表