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

2018-09-07 22:10

阅读:373

  复制代码 代码如下:
<?php
/*
* PHP100中文网,整体提供,测试通过
*/
// MSNv9
class myMSN {
private $port = 1863;
private $nexus =
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=
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(
$loginInfo = array(
Authorization: Passport1.4 rgVerb=GET,OrgURL=
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());
}
}
?>


评论


亲,登录后才可以留言!