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


Posted in PHP onJanuary 26, 2015
<?

/***************************************
****************************************/

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;

        }

    }
}

?>
PHP 相关文章推荐
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
php无限极分类实现的两种解决方法
Apr 28 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
自制PHP框架之设计模式
May 07 PHP
PHP中rename()函数的妙用讲解
Feb 28 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 #PHP
php批量删除cookie的简单实现方法
Jan 26 #PHP
php创建、获取cookie及基础要点分析
Jan 26 #PHP
php表单提交与$_POST实例分析
Jan 26 #PHP
Symfony数据校验方法实例分析
Jan 26 #PHP
symfony表单与页面实现技巧
Jan 26 #PHP
php使用cookie保存登录用户名的方法
Jan 26 #PHP
You might like
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
vue.js的提示组件
2017/03/02 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
python算法学习之基数排序实例
2013/12/18 Python
Python 操作MySQL详解及实例
2017/04/30 Python
django 创建过滤器的实例详解
2017/08/14 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
利用python画出折线图
2018/07/26 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
房屋认购协议书
2015/01/29 职场文书
初中教师个人总结
2015/02/10 职场文书
德劲DE1105机评
2022/04/05 无线电
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android