PHP 模拟登陆MSN并获得用户信息

复制代码 代码如下:

  <?php

  /*

  * PHP100中文网,整体提供,测试通过

  */

  $msn = new myMSN([email protected], "123");

  // MSNv9

  class myMSN {

  private $server = "messenger.hotmail.com";

  private $port = 1863;

  private $nexus = "https://nexus.passport.com/rdr/pprdr.asp";

  private $sshLogin = "login.live.com/login2.srf"; //loginnet.passport.com/login2.srf

  private $getCode = null;

  private $_ip = null;

  private $_port = null;

  private $connect = null;

  private $trID = 1;

  private $maxMessage = 4096;

  private $userName = null;

  private $passWord = null;

  private $debug = true;

  function myMSN($userName="", $passWord="") {

  if (!empty($userName) && !empty($passWord)) {

  $this->userName = $userName;

  //$this->passWord = urlencode($passWord);

  $this->passWord = $passWord;

  $this->startTalk();

  }

  }

  function put($data) {

  if ($this->isConnect()) {

  fputs($this->connect, $data);

  $this->trID ;

  if ($this->debug)

  print("<div style='color:green;font-size:13px;'>>>>{$data}</div>");

  }

  }

  function get() {

  if ($data = @fgets($this->connect, $this->maxMessage)) {

  if ($this->debug)

  print("<div style='color:red;font-size:13px;'><<<{$data}</div>");

  return $data;

  } else {

  return false;

  }

  }

  function isConnect() {

  if (!is_null($this->connect))

  return true;

  else

  return false;

  }

  function close() {

  @fclose($this->connect);

  }

  function startTalk() {

  if ($this->connect = fsockopen($this->server, $this->port, $errno, $errstr, 2))

  $this->verTalk();

  }

  function verTalk() // MSN 协议协商 {

  $this->put("VER {$this->trID} MSNP9 CVR0 rn");

  $data = $this->get();

  //echo $data;

  if (false !== strripos($data, "VER"))

  $this->envTalk();

  }

  function envTalk() // 环境协商 {

  $this->put("CVR {$this->trID} 0x0409 winnt 5.0 i386 MSNMSGR 7.0.0816 MSMSGS {$this->userName} rn");

  $data = $this->get();

  //echo $data;

  if (false !== strripos($data, "CVR"))

  $this->reqTalk();

  }

  function reqTalk() // 请求确认 {

  $this->put("USR {$this->trID} TWN I {$this->userName} rn");

  $data = $this->get(); // XFR 3 NS 207.46.107.41:1863 0 65.54.239.210:1863 XFR 3 NS 207.46.107.25:1863 U D

  //echo $data;

  if (false !== strripos($data, "XFR")) {

  list(, , , $serv) = explode(" ", $data); // 分析服务器

  list($ip, $port) = explode(":", $serv); // 分析IP和端口

  $this->_ip = $ip;

  $this->_port = $port;

  $this->reLink($ip, $port);

  } else {

  //echo $data; // USR 3 TWN S ct=1205292058,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http://messenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0

  list(, , , , $this->getCode) = explode(" ", trim($data));

  //echo $data;

  if (empty($this->sshLogin))

  $this->reLoginTalk(); // 重新获取登陆服务器地址

  else

  $this->getLoginCode($this->sshLogin);

  }

  }

  function reLink($server, $port) // 重置连接 {

  $this->connect = null;

  $this->server = $server;

  $this->port = $port;

  $this->trID = 1;

  $this->startTalk();

  }

  function reLoginTalk() // 重新获取服务器地址 {

  $ch = curl_init($this->nexus);

  curl_setopt($ch, CURLOPT_HEADER, 1);

  curl_setopt($ch, CURLOPT_NOBODY, 1);

  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  $header = curl_exec($ch);

  //print_r($header);

  curl_close($ch);

  preg_match ('/DALogin=(.*?),/', $header, $out); // 捕捉服务器登陆匹配

  //print_r($out);

  if (isset($out[1])) {

  $this->getLoginCode($out[1]);

  }

  else {

  //return false;

  exit("无法捕捉到登陆服务器的URL");

  }

  }

  function getLoginCode($slogin) // 获取登陆代码 {

  //echo($this->getCode);

  if (!is_null($this->getCode)) {

  $ch = curl_init("https://" . $slogin);

  $loginInfo = array(

  "Authorization: Passport1.4 rgVerb=GET,OrgURL=http://messenger.msn.com,sign-in=" . $this->userName . ",pwd=" . $this->passWord . "," . $this->getCode,

  "Host: login.passport.com"

  );

  curl_setopt($ch, CURLOPT_HTTPHEADER, $loginInfo);

  //print_r($loginInfo);

  //$this->getCode = null;

  curl_setopt($ch, CURLOPT_HEADER, 1);

  curl_setopt($ch, CURLOPT_NOBODY, 1);

  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  $header = curl_exec($ch);

  //print_r($header);

  preg_match ("/from-PP='(.*?)'/", $header, $out);

  //print_r($out);

  if (isset($out[1])) {

  $this->loginAction($out[1]);

  } else {

  //return false;

  exit("无法捕捉到登陆代码的信息");

  }

  } else {

  return false;

  }

  }

  function loginAction($loginCode) // 登陆工作 {

  $this->put("USR {$this->trID} TWN S {$loginCode} rn"); // USR |trID| SSO S |t=code|

  $data = $this->get();

  //echo $data;

  //print_r($data);

  //$this->put("SYN {$this->trID} 0 rn");

  //$this->put("CHG {$this->trID} NLN rn");

  //print_r($this->get());

  }

  }

  ?>