朋友网关于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 相关文章推荐
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
JpGraph php柱状图使用介绍
Aug 23 PHP
php从数组中随机抽取一些元素的代码
Nov 05 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
php内嵌函数用法实例
Mar 20 PHP
php递归遍历多维数组的方法
Apr 18 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
PHP数组访问常用方法解析
Sep 05 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
解析php中call_user_func_array的作用
2013/06/07 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
2013/03/21 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
详解如何运行vue项目
2019/04/15 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
js实现简单的打印表格
2020/01/15 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
python实现SMTP邮件发送功能
2020/06/16 Python
python实现K最近邻算法
2018/01/29 Python
python最长回文串算法
2018/06/04 Python
Python itertools.product方法代码实例
2020/03/27 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
给导游的表扬信
2014/01/10 职场文书
Python竟然能剪辑视频
2021/05/25 Python
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python