朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)

前端技术 2023/09/08 PHP

复制代码 代码如下:

<?
/***************************************

****************************************/
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

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。