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 相关文章推荐
一个好用的分页函数
Nov 16 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
关于php循环跳出的问题
Jul 01 PHP
解析PHP 5.5 新特性
Jul 02 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
PHP goto语句用法实例
Aug 06 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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无序树实现方法
2015/07/28 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
原生js实现轮播图
2017/02/27 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python获取本机所有IP地址的方法
2018/12/26 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
幼儿园教师备课制度
2014/01/12 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
小区推广策划方案
2014/06/06 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
Sql Server之数据类型详解
2022/02/28 SQL Server