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 相关文章推荐
一个域名查询的程序
Oct 09 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php在文件指定行中写入代码的方法
May 23 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
微信公众平台DEMO(PHP)
May 04 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 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操作xml
2013/10/27 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
python和C语言混合编程实例
2014/06/04 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
在校生党员自我评价
2013/09/25 职场文书
企业委托书范本
2014/09/13 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
2014年教师工作总结
2014/11/10 职场文书
致运动员赞词
2015/07/22 职场文书
卫生主题班会
2015/08/14 职场文书
班主任培训研修日志
2015/11/13 职场文书
初中信息技术教学反思
2016/02/16 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js