****************************************/
error_reporting(E_ALL ^ E_NOTICE);
require_once( \'http.inc.php\' );
require_once( \'class.Chinese.php\');
//成功2xx
define( \'QQ_RETURN_SUCCESS\', 200 );
define( \'QQ_LOGIN_SUCCESS\', 201 );
define( \'QQ_LIST_NONE\', 202 );
define( \'QQ_ADDTOLIST_SUCCESS\', 203 );
define( \'QQ_REPLYADD_SUCCESS\', 204 );
define( \'QQ_GETMSG_NONE\', 205 );
//警告3xx
define( \'QQ_ADDTOLIST_NEEDAUTH\',300 );
define( \'QQ_ADDTOLIST_REFUSE\', 301 );
define( \'QQ_ADDTOLIST_UNKNOWN\', 302 );
//失败4xx
define( \'QQ_RETURN_FAILED\', 400 );
define( \'QQ_LIST_ERROR\', 401 );
define( \'QQ_GETMSG_ERROR\', 402 );
//在线状态
define( \'QQ_STATUS_ONLINE\', 10);
define( \'QQ_STATUS_OFFLINE\', 20);
define( \'QQ_STATUS_BUSY\', 30);
//血型
$QQ_DATA_BT = array
(
=> \'\',
=> \'A型\',
=> \'B型\',
=> \'O型\',
=> \'AB型\',
=> \'其他\'
);
//星座
$QQ_DATA_CO = array
(
=> \'\',
=> \'水瓶座\',
=> \'双鱼座\',
=> \'牡羊座\',
=> \'金牛座\',
=> \'双子座\',
=> \'巨蟹座\',
=> \'狮子座\',
=> \'处女座\',
=> \'天秤座\',
=> \'天蝎座\',
=> \'射手座\',
=> \'摩羯座\'
);
//生肖
$QQ_DATA_SH = array
(
=> \'\',
=> \'鼠\',
=> \'牛\',
=> \'虎\',
=> \'兔\',
=> \'龙\',
=> \'蛇\',
=> \'马\',
=> \'羊\',
=> \'猴\',
=> \'鸡\',
=> \'狗\',
=> \'猪\'
);
//性别
$QQ_DATA_SX = array
(
=> \'男\',
=> \'女\'
);
class QQClient
{
var $uin;
var $pwd;
var $server = \'kconn.tencent.com\';
//备用:219.133.51.11
var $port = 21001;
//备用:8000
var $httpclient;
var $chs = NULL;
function QQClient($uin,$pwd)
{
$this->uin = $uin;
$this->pwd = $pwd;
}
function encode($str)
/*
说明:把KEY1=VAL1&KEY2=VAL2格式变为数组
*/
{
$arr = explode(\'&\' , $str);
$return = array();
foreach($arr as $k=>$v)
{
list($key,$val) = explode(\'=\',$v);
$return[$key] = $val;
$this->chs = NULL;
}
return $return;
}
function utf8_to_gb2312($str)
{
$this->chs = new Chinese(\"UTF8\",\"GB2312\", $str );
return $this->chs->ConvertIT();
}
function gb2312_to_utf8($str)
{
$this->chs = new Chinese(\"GB2312\",\"UTF8\", $str );
return $this->chs->ConvertIT();
}
function query($str)
{
$this->httpclient = new http( HTTP_V11, true );
$this->httpclient->host = \'kconn.tencent.com\';
$this->httpcilent->port = 21001;
$query = $this->encode($str);
$status = $this->httpclient->post( \'\', $query, \'\' );
if ( $status == HTTP_STATUS_OK ) {
return $this->httpclient->get_response_body();
}
else
{
print_r($this->httpclient);
return false;
}
$this->httpclient->disconnect();
unset($this->httpclient);
}
function split_str($str)
{
$arr = explode(\",\" , $str);
if($arr[count($arr)-1] == NULL)
{
unset($arr[count($arr)-1]);
}
return $arr;
}
function login()
{
//登陆
//VER=1.1&CMD=Login&SEQ=&UIN=&PS=&M5=1&LC=9326B87B234E7235
$str = \"VER=1.1&CMD=Login&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&PS=\".md5($this->pwd).\"&M5=1&LC=9326B87B234E7235\";
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//返回成功
if($return[\'RS\']==0)
{
//登陆成功
return QQ_LOGIN_SUCCESS;
}
else
{
//登陆失败
$GLOBALS[\'QQ_ERROR_MSG\'] = $this->utf8_to_gb2312($return[\'RA\']);
return QQ_LOGIN_FAILED;
}
}
else
{
//返回失败
return QQ_RETURN_FAILED;
}
}
function getFriendsList()
{
//得到好友列表
//VER=1.1&CMD=List&SEQ=&UIN=&TN=160&UN=0
$str = \"VER=1.1&CMD=List&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&TN=160&UN=0\";
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//返回成功
return $this->split_str($return[\'UN\']);
}
else
{
//返回失败
return QQ_RETURN_FAILED;
}
}
function getOnlineList()
{
//得到在线好友列表
//VER=1.1&CMD=Query_Stat&SEQ=&UIN=&TN=50&UN=0
$str = \"VER=1.1&CMD=Query_Stat&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&TN=50&UN=0\";
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//返回成功
if($return[\'SN\'] > 0)
{
//在线好友数>0
$uns = $this->split_str($return[\'UN\']); //号码列表
$nks = $this->split_str($return[\'NK\']); //昵称列表
$sts = $this->split_str($return[\'ST\']); //状态列表
$fcs = $this->split_str($return[\'FC\']); //头像列表
$error = 0;
((count($uns)==count($nks))==(count($sts)==count($fcs)))==(count($nks)==count($sts)) ?
$num = count($uns)
:
$error = 1;
;
if($error == 1) return QQ_LIST_ERROR;
$arr = array();
for($i=0;$i<$num;$i++)
{
$arr[] = array(
\"UN\" => $uns[$i] ,
\"NK\" => $this->utf8_to_gb2312($nks[$i]) ,
\"ST\" => $sts[$i] ,
\"FC\" => $fcs[$i]
);
}
return ($arr);
}
else
{
//在线好友数<=0
return QQ_LIST_NONE;
}
}
else
{
//返回失败
return QQ_RETURN_FAILED;
}
}
function getInfo($uin)
{
//得到好友信息
//AD为联系地址,AG为年龄,EM为MAIL,FC为头像,HP为网站,JB为职业,PC为邮编,PH为联系电话,PR为简介,PV为省,RN为真实名称,SC为毕业院校,SX为性别,UN为QQ号,NK为QQ昵称
//以下注释研究 by Hackfan
//BT为血型,CO为星座,CT为城市,CY为国家,MO为移动电话,SH生肖
//LV为查询的号码(1为精简查询,2为普通查询,3为详细查询)
//CV未知,ID未知(身份证?),MT未知,MV未知,
//VER=1.1&CMD=GetInfo&SEQ=&UIN=&LV=3&UN=
$str = \"VER=1.1&CMD=GetInfo&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&LV=3&UN=\".$uin;
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//返回成功
$arr = array
(
\'AD\' => $this->utf8_to_gb2312($return[\'AD\']), //联系地址
\'AG\' => $this->utf8_to_gb2312($return[\'AG\']), //年龄
\'BT\' => $return[\'BT\'], //血型
\'CO\' => $return[\'CO\'], //星座
\'CT\' => $this->utf8_to_gb2312($return[\'CT\']), //城市
\'CY\' => $this->utf8_to_gb2312($return[\'CY\']), //国家
\'EM\' => $this->utf8_to_gb2312($return[\'EM\']), //Email
\'FC\' => $return[\'FC\'], //头像
\'HP\' => $this->utf8_to_gb2312($return[\'HP\']), //网站
\'JB\' => $this->utf8_to_gb2312($return[\'JB\']), //职业
\'MO\' => $return[\'MO\'], //移动电话
\'PC\' => $this->utf8_to_gb2312($return[\'PC\']), //邮编
\'PH\' => $this->utf8_to_gb2312($return[\'PH\']), //联系电话
\'PR\' => $this->utf8_to_gb2312($return[\'PR\']), //简介
\'PV\' => $this->utf8_to_gb2312($return[\'PV\']), //省
\'RN\' => $this->utf8_to_gb2312($return[\'RN\']), //真实姓名
\'SC\' => $this->utf8_to_gb2312($return[\'SC\']), //毕业院校
\'SH\' => $return[\'SH\'], //生肖
\'SX\' => $return[\'SX\'], //性别
\'UN\' => $return[\'UN\'], //QQ号
\'NK\' => $this->utf8_to_gb2312($return[\'NK\']) //昵称
);
return $arr;
}
else
{
//返回失败
return QQ_RETURN_FAILED;
}
}
function addFriend($uin)
{
//添加新好友
//VER=1.1&CMD=AddToList&SEQ=&UIN=&UN=
$str = \"VER=1.1&CMD=AddToList&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&UN=\".$uin;
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//返回成功
switch($return[\'CD\'])
{
case 0 :
//对方允许任何人加为好友
return QQ_ADDTOLIST_SUCCESS;
break;
case 1 :
//需要验证
return QQ_ADDTOLIST_NEEDAUTH;
break;
case 3 :
//不允许任何人加为好友
return QQ_ADDTOLIST_REFUSE;
break;
default :
//未知的代码
return QQ_ADDTOLIST_UNKNOWN;
break;
}
}
else
{
//返回失败
return QQ_RETURN_FAILED;
}
}
function replyAdd($uin,$type,$msg)
{
//回应添加好友
//VER=1.1&CMD=Ack_AddToList&SEQ=&UIN=&UN=&CD=&RS=
//CD为响应状态,CD为0表示“通过验证”。CD为1表示“拒决加为对方为好友”。CD为2表示“为请求对方加为好友”。RS为你要请求的理由
$str = \"VER=1.2&CMD=Ack_AddToList&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&UN=\".$uin.\"&CD=\".$type.\"&RS=\".$this->gb2312_to_utf8($msg);
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
return QQ_RETURN_SUCCESS;
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
function delFriend($uin)
{
//删除好友
//VER=1.1&CMD=DelFromList&SEQ=&UIN=&UN=
$str = \"VER=1.1&CMD=DelFromList&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&UN=$uin\";
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
return QQ_RETURN_SUCCESS;
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
function changeStatus($status)
{
//改变状态
//VER=1.1&CMD=Change_Stat&SEQ=&UIN=&ST=
//ST为要改变的状态,10为上线,20为离线,30为忙碌。
$str = \"VER=1.1&CMD=Change_stat&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&ST=\".$status;
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
return QQ_RETURN_SUCCESS;
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
function logout()
{
//退出登陆
//VER=1.1&CMD=Logout&SEQ=&UIN=
$str = \"VER=1.1&CMD=Logout&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin;
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
return QQ_RETURN_SUCCESS;
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
function getMsg()
{
//获得消息
//VER=1.1&CMD=GetMsgEx&SEQ=&UIN=
//MT表示消息类型,99表示系统消息,9表示用户消息。UN表示消息发送来源用户,MG表示发送的消息,MG消息可以表示某些特定的系统含意
//当MT=99时:MG=10表示用户上线,MG=20表示用户离线,MG=30表示用户忙碌
$str = \"VER=1.1&CMD=GetMsgEx&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin;
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
if($return[\'MN\'] > 0)
{
//消息数>0
$mts = $this->split_str($return[\'MT\']); //消息类型
$uns = $this->split_str($return[\'UN\']); //发送者号码
$mgs = $this->split_str($return[\'MG\']); //消息内容
$error = 0;
(count($mts)==count($uns))==(count($uns)==count($mgs))?
$num = count($uns)
:
$error = 1;
;
if($error == 1) return QQ_GETMSG_ERROR; //出差错了
$arr = array();
for($i=0;$i<$num;$i++)
{
$arr[] = array(
\"MT\" => $mts[$i] ,
\"UN\" => $uns[$i] ,
\"MG\" => $this->utf8_to_gb2312($mgs[$i])
);
}
return ($arr);
}
else
{
//在线好友数<=0
return QQ_GETMSG_NONE;
}
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
function sendMsg($uin,$msg)
{
//发送消息
//VER=1.1&CMD=CLTMSG&SEQ=&UIN=&UN=&MG=
$str = \"VER=1.1&CMD=CLTMSG&SEQ=\".rand(1000,9000).\"&UIN=\".$this->uin.\"&UN=\".$uin.\"&MG=\".$this->gb2312_to_utf8($msg);
$return = $this->encode($this->query($str));
if($return[\'RES\']==0 and $return[\'UIN\'] == $this->uin)
{
//服务器成功得到信息
return QQ_RETURN_SUCCESS;
}
else
{
//失败
return QQ_RETURN_FAILED;
}
}
}
?>
本文地址:https://www.stayed.cn/item/23195
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我