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


Posted in PHP onMay 16, 2009
<?php 
/* 
* PHP100中文网,整体提供,测试通过 
*/ 
$msn = new myMSN(php100@php100.com, "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()); 
} 
} 
?>
PHP 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php之字符串变相相减的代码
Mar 19 PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
php简单的会话类代码
Aug 08 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
PHP7匿名类用法分析
Sep 26 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
PHP递归的三种常用方式
Feb 28 PHP
php+ajax 文件上传代码实例
Mar 18 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
抓取YAHOO股票报价的类
May 15 #PHP
PHP 采集心得技巧
May 15 #PHP
DISCUZ 论坛管理员密码忘记的解决方法
May 14 #PHP
PHP获取当前文件所在目录 getcwd()函数
May 13 #PHP
php 购物车实例(申精)
May 11 #PHP
PHP 编写的 25个游戏脚本
May 11 #PHP
PHPMyAdmin 快速配置方法
May 11 #PHP
You might like
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
python实现逆波兰计算表达式实例详解
2015/05/06 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
小学课改工作总结
2015/08/13 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
python 算法题——快乐数的多种解法
2021/05/27 Python
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA