PHP获取MSN好友列表

网络整理 - 08-25

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">

  <html xmlns="" xml:lang="zh" lang="zh">

  <head>

  <title>MSN 测试</title>

  <meta name="generator" content="Bluefish 1.0.6"/>

  <meta name="keywords" content="MSN"/>

  <meta name="description" content="MSN test"/>

  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

  <style type="text/css">

  <!--

  div {

  font-family: arial, helvetica, sans-serif;

  font-size : 13px ;

  margin: 10px;

  padding: 2px 10px 1px;

  background-color: #C60;

  color: #FFFFFF;

  border-top: 1px solid #C90;

  border-left: 1px solid #C90;

  border-bottom: 1px solid #333;

  border-right: 1px solid #333;

  }

  a:link {

  color: #00FFBE;

  }

  --></style>

  </head>

  <body>

  <div>

  <?php

  # filename: fm.php

  # purpose: get MSN contact list

  # author: ?qmsn modified by Druggo

  $username = $_POST['username'];

  $password = $_POST['password'];

  $debug = 0;

  $trid = 0;

  $proto = "MSNP10";

  # start here

  echo "通讯协议 $proto<br/>";

  echo "开始登录<br/>";

  # login now

  $sbconn = fsockopen("messenger.hotmail.com",1863) or die("Can't connect to MSN server");

  flush();

  data_out("VER $trid $proto CVR0");

  data_in();

  data_out("CVR $trid 0x0409 winnt 5.1 i386 MSNMSGR 8.0.0812 MSMSGS $username");

  data_in();

  data_out("USR $trid TWN I $username");

  $temp = data_in();

  if (!stristr($temp,":")){

  if (substr($temp,0,3)==601){

  #echo "Error: The MSN servers are currently unavailable.";

  echo "很不幸,MSN的服务器又挂了 >.<<br/>";

  die();

  } else {

  echo "连接失败!<br/>";

  fclose($sbconn);

  die();

  }

  }

  @fclose($sbconn);

  $temp_array = explode(" ",$temp);

  $temp_array = explode(":",$temp_array[3]);

  flush();

  $sbconn = fsockopen($temp_array[0],$temp_array[1]) or die("error -_-#");

  data_out("VER $trid $proto CVR0");

  data_in();

  flush();

  data_out("CVR $trid 0x0409 winnt 5.1 i386 MSNMSGR 8.0.0812 MSMSGS $username");

  data_in();

  data_out("USR $trid TWN I $username");

  $temp = data_in();

  $temp_array = explode(" ",$temp);

  flush();

  $TOKENSTRING = trim(end($temp_array));

  #echo "authenticating";

  echo "身份验证中……<br/>";

  flush();

  $nexus_socket = fsockopen("ssl://nexus.passport.com",443);

  fputs($nexus_socket,"GET /rdr/pprdr.asp HTTP/1.0rnrn");

  while ($temp != "rn"){

  $temp = fgets($nexus_socket,1024);

  if (substr($temp,0,12)=="PassportURLs"){

  $urls = substr($temp,14);

  }

  }

  $temp_array = explode(",",$urls);

  $temp = $temp_array[1];

  $temp = substr($temp,8);

  $temp_array = explode("/",$temp);

  @fclose($nexus_socket);

  $ssl_conn = fsockopen("ssl://".$temp_array[0],443);

  fputs($ssl_conn,"GET /{$temp_array[1]} HTTP/1.1rn");

  fputs($ssl_conn,"Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=".urlencode($username).",pwd=$password,$TOKENSTRINGrn");

  fputs($ssl_conn,"User-Agent: MSMSGSrn");

  fputs($ssl_conn,"Host: {$temp_array[0]}rn");

  fputs($ssl_conn,"Connection: Keep-Alivern");

  fputs($ssl_conn,"Cache-Control: no-cachernrn");

  $temp = fgets($ssl_conn,512);

  if (rtrim($temp) == "HTTP/1.1 302 Found"){

  #echo "redirection";

  echo "开始重定向<br/>";

  flush();

  while ($temp != "rn"){

  $temp = fgets($ssl_conn,256);

  if (substr($temp,0,9)=="Location:"){

  $temp_array = explode(":",$temp);

  $temp_array = explode("/",trim(end($temp_array)));

  break;

  }

  }

  @fclose($ssl_conn);

  $ssl_conn = fsockopen("ssl://".$temp_array[2],443);

  fputs($ssl_conn,"GET /{$temp_array[3]} HTTP/1.1rn");

  fputs($ssl_conn,"Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=".urlencode($username).",pwd=$password,$TOKENSTRINGrn");

  fputs($ssl_conn,"User-Agent: MSMSGSrn");

  fputs($ssl_conn,"Host: {$temp_array[2]}rn");

  fputs($ssl_conn,"Connection: Keep-Alivern");

  fputs($ssl_conn,"Cache-Control: no-cachernrn");

  } elseif (rtrim($temp)=="HTTP/1.1 401 Unauthorized"){

  #echo "invalidcreds";

  echo "验证失败!<br/>";

  @fclose($ssl_conn);

  die();

  } else {

  if (rtrim($temp) != "HTTP/1.1 200 OK"){

  #echo "Unknown HTTP status code: $temp<br>";

  echo "未知状态码 $temp<br/>";

  flush();

  die();

  } else {

  #echo "set_bar_len30?";

  }

  }

  while ($temp != "rn"){

  $temp = fgets($ssl_conn,1024);

  if (substr($temp,0,19)=="Authentication-Info"){

  $auth_info = $temp;

  $temp = fgets($ssl_conn,1024);

  if (substr($temp,0,14)!="Content-Length"){

  $auth_info.= fgets($ssl_conn,1024);

  }

  break;

  }

  }

  @fclose($ssl_conn);

  $temp_array = explode("'",$auth_info);

  flush();

  data_out("USR $trid TWN S {$temp_array[1]}");

  flush();

  $temp=data_in();

  flush();

  $time_since_initmsg = time();

  while(!strstr($temp,"ABCHMigrated") && is_string(trim($temp))){

  if (substr($temp,0,3)=="sid"){

  $sid = trim(substr($temp,5));

  }

  if (substr($temp,0,2)=="kv"){

  $kv = trim(substr($temp,4));

  }

  if (substr($temp,0,7)=="MSPAuth"){

  $mspauth = trim(substr($temp,9));

  flush();

  }

  $temp = data_in();

  }

  $temp = data_in();

  #echo "authenticated<br />";

  echo "验证通过!<br/>";

  flush();

  #data_out("LST 9 RL");

  #data_in();

  data_out("SYN $trid 0 0");

  #echo "retreiving_contact_list<br />";

  echo "正在获取好友列表……<br/><br/>";

  flush();

  stream_set_timeout($sbconn,0,125000);

  /* a lazy man doing this :D */

  for($i=0;$i<160;$i++) # some say max is 150

  {

  $temp = data_in();

  switch (substr($temp, 0, 3))

  {

  case "LST":

  $temp_array = explode(" ",$temp);

  $un = substr($temp_array[1], 2);

  $nn = substr($temp_array[2], 2);

  $nn1 = substr($temp_array[2], 0, 1);

  if($nn1 == "F")

  {

  echo "<a href="mailto:$un">$nn</a><br/>";

  }

  else

  {

  echo "曾经的好友: $un<br/>";

  }

  #echo $temp."<br/>";

  break;

  default:

  # no nothing

  break;

  }

  }

  echo "列表结束";

  @fclose($sbconn);

  # end here

  # functions

  function data_out($data){

  global $sbconn,$debug,$trid;

  fputs($sbconn,$data."rn");

  $trid++;

  if ($debug && !empty($data)){ echo "> ".$data."<br>rn";}

  }

  function data_in(){

  global $sbconn,$debug;

  $temp = fgets($sbconn,256);

  if ($debug && !empty($temp)){echo "< ".$temp."<br>rn";}

  return $temp;

  }

  ?>

  </div>

  </body>

  </html>