//    抱歉~代码忘记放标签里了~~
<?php define("LOGIN_URL", "login.live.com/login2.srf");
$msn = new myMSN("[email protected]", "isvicious"); // 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; 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++;
}
} function get()
{
if ($data = @fgets($this->connect, $this->maxMessage))
{
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 \r\n");
$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} \r\n");
$data = $this->get();
//echo $data;
if (false !== strripos($data, "CVR"))
$this->reqTalk();
} function reqTalk() // 请求确认
{
$this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
$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:%2F%2Fmessenger.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;
$this->reLoginTalk();

}
} 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); curl_close($ch); //print_r($header);
preg_match ('/DALogin=(.*?),/', $header, $out); // 捕捉服务器登陆匹配
//print_r($out);
if (isset($out[1]))
{
$this->getLoginCode($out[1]);
}
else
{
//return false;
exit("无法捕捉到登陆服务器的URL");
} } function getLoginCode($slogin) // 获取登陆代码
{
if (!is_null($this->getCode))
{
$this->getCode = "ct=1205305193,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0";
$ch = curl_init("https://" . $slogin);
$loginInfo = array(
"Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,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} \r\n"); // USR |trID| SSO S |t=code|
$data = $this->get();
echo $data;
//print_r($data);
//$this->put("SYN {$this->trID} 0 \r\n");
//$this->put("CHG {$this->trID} NLN \r\n");
//print_r($this->get());
} }
?>

解决方案 »

  1.   

    为什么?~我跳过自动获取验证服务器~为什么就登陆上了啊?~为什么啊?~晕倒啊……
    <?php $msn = new myMSN("[email protected]", "isvicious"); // 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;'>&gt;&gt;&gt;{$data}</div>");
    }
    } function get()
    {
    if ($data = @fgets($this->connect, $this->maxMessage))
    {
    if ($this->debug)
    print("<div style='color:red;font-size:13px;'>&lt;&lt;&lt;{$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 \r\n");
    $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} \r\n");
    $data = $this->get();
    //echo $data;
    if (false !== strripos($data, "CVR"))
    $this->reqTalk();
    } function reqTalk() // 请求确认
    {
    $this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
    $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:%2F%2Fmessenger.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 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,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} \r\n"); // USR |trID| SSO S |t=code|
    $data = $this->get();
    //echo $data;
    //print_r($data);
    //$this->put("SYN {$this->trID} 0 \r\n");
    //$this->put("CHG {$this->trID} NLN \r\n");
    //print_r($this->get());
    } }
    ?>