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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
PHP三层结构(上) 简单三层结构
Jul 04 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
php内存缓存实现方法
Jan 24 PHP
php一个解析字符串排列数组的方法
May 12 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
PHP下载文件函数与用法示例
Sep 27 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 身份证号验证函数
2009/05/07 PHP
php实现监听事件
2013/11/06 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Python迭代用法实例教程
2014/09/08 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python机器学习之决策树算法
2017/12/22 Python
浅谈python写入大量文件的问题
2018/11/09 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
24岁生日感言
2014/01/13 职场文书
通信研究生自荐信
2014/02/01 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
英文求职信范文
2014/05/23 职场文书
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏