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

  

复制代码 代码如下:

  <?

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

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

  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;

  }

  }

  }

  ?>