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 字符转义 注意事项
May 27 PHP
一步一步学习PHP(8) php 数组
Mar 05 PHP
来自phpguru得Php Cache类源码
Apr 15 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
thinkphp常见路径用法分析
Dec 02 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
php实现JWT验证的实例教程
Nov 26 PHP
PHP7 windows支持
Mar 09 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php调用Google translate_tts api实现代码
2013/08/07 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
JS解密入门 最终变量劫持
2008/06/25 Javascript
jquery.validate使用攻略 第二部
2010/07/01 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python学生管理系统的实现
2020/04/05 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
面试后感谢信
2014/02/01 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
吨的认识教学反思
2014/04/27 职场文书
2015年端午节活动总结
2015/02/11 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
Python Pandas解析读写 CSV 文件
2022/04/11 Python