|
感谢druggo提供代码 放到首页只是觉得值得大家研究 等有机会把这代码装成jsp的
复制代码 代码如下: <!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>
有需要的朋友可以参考下,大约要延迟几秒。 |
|