朋友网关于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 作用域解析运算符(::)
Jul 27 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
php中动态修改ini配置
Oct 14 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
学习php开源项目的源码指南
Dec 21 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
php常量详细解析
Oct 27 PHP
PHP登录验证码的实现与使用方法
Jul 07 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 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
Apache2 httpd.conf 中文版
2006/11/17 PHP
windows xp下安装pear
2006/12/02 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Python3实现并发检验代理池地址的方法
2016/09/18 Python
django的ORM模型的实现原理
2019/03/04 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
人力资源专员自我评价怎么写
2013/09/19 职场文书
思想政治自我鉴定
2013/10/06 职场文书
网聊搭讪开场白
2015/05/28 职场文书
中秋节祝酒词
2015/08/12 职场文书
使用Apache Camel表达REST服务的方法
2022/06/10 Servers