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 相关文章推荐
php 数组的创建、调用和更新实现代码
Mar 09 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php截取中文字符串不乱码的方法
Dec 25 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
PHP生成数组再传给js的方法
Aug 07 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
Yii框架应用组件用法实例分析
May 15 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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
Thinkphp中Create方法深入探究
2014/06/16 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
php处理复杂xml数据示例
2016/07/11 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python os模块介绍
2014/11/30 Python
Python格式化压缩后的JS文件的方法
2015/03/05 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
保密工作整改报告
2014/11/06 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL