PHP 获取MSN好友列表的代码(2009-05-14测试通过)


Posted in PHP onSeptember 09, 2009
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh"> 
<head> 
<title>MSN 测试</title> 
<meta name="generator" content="Bluefish 1.0.6"/> 
<meta name="keywords" content="MSN"/> 
<meta name="description" content="MSN test"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<style type="text/css"> 
<!-- 
div { 
font-family: arial, helvetica, sans-serif; 
font-size : 13px ; 
margin: 10px; 
padding: 2px 10px 1px; 
background-color: #C60; 
color: #FFFFFF; 
border-top: 1px solid #C90; 
border-left: 1px solid #C90; 
border-bottom: 1px solid #333; 
border-right: 1px solid #333; 
} 
a:link { 
color: #00FFBE; 
} 
--></style> 
</head> 
<body> 
<div> <?php 
# filename: fm.php 
# purpose: get MSN contact list 
# author: http://qartis.com/?qmsn modified by Druggo 
$username = $_POST['username']; 
$password = $_POST['password']; 
$debug = 0; 
$trid = 0; 
$proto = "MSNP10"; 
# start here 
echo "通讯协议 $proto<br/>"; 
echo "开始登录<br/>"; 
# login now 
$sbconn = fsockopen("messenger.hotmail.com",1863) or die("Can't connect to MSN server"); 
flush(); 
data_out("VER $trid $proto CVR0"); 
data_in(); 
data_out("CVR $trid 0x0409 winnt 5.1 i386 MSNMSGR 8.0.0812 MSMSGS $username"); 
data_in(); 
data_out("USR $trid TWN I $username"); 
$temp = data_in(); 
if (!stristr($temp,":")){ 
if (substr($temp,0,3)==601){ 
#echo "Error: The MSN servers are currently unavailable."; 
echo "很不幸,MSN的服务器又挂了 >.<<br/>"; 
die(); 
} else { 
echo "连接失败!<br/>"; 
fclose($sbconn); 
die(); 
} 
} 
@fclose($sbconn); 
$temp_array = explode(" ",$temp); 
$temp_array = explode(":",$temp_array[3]); 
flush(); 
$sbconn = fsockopen($temp_array[0],$temp_array[1]) or die("error -_-#"); 
data_out("VER $trid $proto CVR0"); 
data_in(); 
flush(); 
data_out("CVR $trid 0x0409 winnt 5.1 i386 MSNMSGR 8.0.0812 MSMSGS $username"); 
data_in(); 
data_out("USR $trid TWN I $username"); 
$temp = data_in(); 
$temp_array = explode(" ",$temp); 
flush(); 
$TOKENSTRING = trim(end($temp_array)); 
#echo "authenticating"; 
echo "身份验证中……<br/>"; 
flush(); 
$nexus_socket = fsockopen("ssl://nexus.passport.com",443); 
fputs($nexus_socket,"GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n"); 
while ($temp != "\r\n"){ 
$temp = fgets($nexus_socket,1024); 
if (substr($temp,0,12)=="PassportURLs"){ 
$urls = substr($temp,14); 
} 
} 
$temp_array = explode(",",$urls); 
$temp = $temp_array[1]; 
$temp = substr($temp,8); 
$temp_array = explode("/",$temp); 
@fclose($nexus_socket); 
$ssl_conn = fsockopen("ssl://".$temp_array[0],443); 
fputs($ssl_conn,"GET /{$temp_array[1]} HTTP/1.1\r\n"); 
fputs($ssl_conn,"Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=".urlencode($username).",pwd=$password,$TOKENSTRING\r\n"); 
fputs($ssl_conn,"User-Agent: MSMSGS\r\n"); 
fputs($ssl_conn,"Host: {$temp_array[0]}\r\n"); 
fputs($ssl_conn,"Connection: Keep-Alive\r\n"); 
fputs($ssl_conn,"Cache-Control: no-cache\r\n\r\n"); 
$temp = fgets($ssl_conn,512); 
if (rtrim($temp) == "HTTP/1.1 302 Found"){ 
#echo "redirection"; 
echo "开始重定向<br/>"; 
flush(); 
while ($temp != "\r\n"){ 
$temp = fgets($ssl_conn,256); 
if (substr($temp,0,9)=="Location:"){ 
$temp_array = explode(":",$temp); 
$temp_array = explode("/",trim(end($temp_array))); 
break; 
} 
} 
@fclose($ssl_conn); 
$ssl_conn = fsockopen("ssl://".$temp_array[2],443); 
fputs($ssl_conn,"GET /{$temp_array[3]} HTTP/1.1\r\n"); 
fputs($ssl_conn,"Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=".urlencode($username).",pwd=$password,$TOKENSTRING\r\n"); 
fputs($ssl_conn,"User-Agent: MSMSGS\r\n"); 
fputs($ssl_conn,"Host: {$temp_array[2]}\r\n"); 
fputs($ssl_conn,"Connection: Keep-Alive\r\n"); 
fputs($ssl_conn,"Cache-Control: no-cache\r\n\r\n"); 
} elseif (rtrim($temp)=="HTTP/1.1 401 Unauthorized"){ 
#echo "invalidcreds"; 
echo "验证失败!<br/>"; 
@fclose($ssl_conn); 
die(); 
} else { 
if (rtrim($temp) != "HTTP/1.1 200 OK"){ 
#echo "Unknown HTTP status code: $temp<br>"; 
echo "未知状态码 $temp<br/>"; 
flush(); 
die(); 
} else { 
#echo "set_bar_len30?"; 
} 
} 
while ($temp != "\r\n"){ 
$temp = fgets($ssl_conn,1024); 
if (substr($temp,0,19)=="Authentication-Info"){ 
$auth_info = $temp; 
$temp = fgets($ssl_conn,1024); 
if (substr($temp,0,14)!="Content-Length"){ 
$auth_info.= fgets($ssl_conn,1024); 
} 
break; 
} 
} 
@fclose($ssl_conn); 
$temp_array = explode("'",$auth_info); 
flush(); 
data_out("USR $trid TWN S {$temp_array[1]}"); 
flush(); 
$temp=data_in(); 
flush(); 
$time_since_initmsg = time(); 
while(!strstr($temp,"ABCHMigrated") && is_string(trim($temp))){ 
if (substr($temp,0,3)=="sid"){ 
$sid = trim(substr($temp,5)); 
} 
if (substr($temp,0,2)=="kv"){ 
$kv = trim(substr($temp,4)); 
} 
if (substr($temp,0,7)=="MSPAuth"){ 
$mspauth = trim(substr($temp,9)); 
flush(); 
} 
$temp = data_in(); 
} 
$temp = data_in(); 
#echo "authenticated<br />"; 
echo "验证通过!<br/>"; 
flush(); 
#data_out("LST 9 RL"); 
#data_in(); 
data_out("SYN $trid 0 0"); 
#echo "retreiving_contact_list<br />"; 
echo "正在获取好友列表……<br/><br/>"; 
flush(); 
stream_set_timeout($sbconn,0,125000); 
/* a lazy man doing this :D */ 
for($i=0;$i<160;$i++) # some say max is 150 
{ 
$temp = data_in(); 
switch (substr($temp, 0, 3)) 
{ 
case "LST": 
$temp_array = explode(" ",$temp); 
$un = substr($temp_array[1], 2); 
$nn = substr($temp_array[2], 2); 
$nn1 = substr($temp_array[2], 0, 1); 
if($nn1 == "F") 
{ 
echo "<a href=\"mailto:$un\">$nn</a><br/>"; 
} 
else 
{ 
echo "曾经的好友: $un<br/>"; 
} 
#echo $temp."<br/>"; 
break; 
default: 
# no nothing 
break; 
} 
} 
echo "列表结束"; 
@fclose($sbconn); 
# end here 
# functions 
function data_out($data){ 
global $sbconn,$debug,$trid; 
fputs($sbconn,$data."\r\n"); 
$trid++; 
if ($debug && !empty($data)){ echo "> ".$data."<br>\r\n";} 
} 
function data_in(){ 
global $sbconn,$debug; 
$temp = fgets($sbconn,256); 
if ($debug && !empty($temp)){echo "< ".$temp."<br>\r\n";} 
return $temp; 
} 
?> 
</div> 
</body> 
</html>

有需要的朋友可以参考下,大约要延迟几秒。
PHP 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
php生成QRcode实例
Sep 22 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
php新建文件的方法实例
Sep 26 PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 PHP
PHP 危险函数全解析
Sep 09 #PHP
php 获取远程网页内容的函数
Sep 08 #PHP
php 遍历数据表数据并列表横向排列的代码
Sep 05 #PHP
不要轻信 PHP_SELF的安全问题
Sep 05 #PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 #PHP
php getsiteurl()函数
Sep 05 #PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 #PHP
You might like
php中文本数据翻页(留言本翻页)
2006/10/09 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
php中in_array函数用法探究
2014/11/25 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
轮播的简单实现方法
2016/07/28 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
分析JS单线程异步io回调的特性
2017/12/01 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
解析Python编程中的包结构
2015/10/25 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
Python 如何批量更新已安装的库
2020/05/26 Python
深入了解python列表(LIST)
2020/06/08 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
内刊编辑求职自荐书范文
2014/02/19 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
主持人开场白台词
2015/05/29 职场文书
新人入职感言
2015/07/31 职场文书