接口?~MSN是提交命令行的形式来操作的,我参考的类(MSNP)只能实现别人主动发起连接,然后应答连接并返回消息~(例子是返回接受到的消息)
但这样对WEB程序没有意义,因为WEB程序是一次执行的,我要发送自己的消息的话,必须执行一次提交,POST也好,AJAX也好,理论上就是和MSN断开了连接,也就是必须重新连接,而刚刚的应答也消失了,所以MSNP一点不实用啊~很多PHP的MSN类,都登陆就断开了,并没有实现真正的WEB MSN功能~我很奇怪的是,我根据网上的协议分析,一步步来,终于现在能实现登陆了,然后利用
CAL 命令请求连线,按协议的规范,无论是V9还是V15,正常情况下,MSN服务器应该返回一个CAL,表示同意连接~
但是我返回了一个错误编号911~MSN服务器直接把我T出了登陆连接~
CAL不完成,我就没办法发送消息了~但看了很多例子,都是在XFR请求到DS服务器后直接实现CAL的~而如果不发送XFR命令得到DS服务器地址的话,直接CAL其实没有任何返回……郁闷!
但这样对WEB程序没有意义,因为WEB程序是一次执行的,我要发送自己的消息的话,必须执行一次提交,POST也好,AJAX也好,理论上就是和MSN断开了连接,也就是必须重新连接,而刚刚的应答也消失了,所以MSNP一点不实用啊~很多PHP的MSN类,都登陆就断开了,并没有实现真正的WEB MSN功能~我很奇怪的是,我根据网上的协议分析,一步步来,终于现在能实现登陆了,然后利用
CAL 命令请求连线,按协议的规范,无论是V9还是V15,正常情况下,MSN服务器应该返回一个CAL,表示同意连接~
但是我返回了一个错误编号911~MSN服务器直接把我T出了登陆连接~
CAL不完成,我就没办法发送消息了~但看了很多例子,都是在XFR请求到DS服务器后直接实现CAL的~而如果不发送XFR命令得到DS服务器地址的话,直接CAL其实没有任何返回……郁闷!
messenger.hotmail.com:1863 # SOCKET请求,发送!
>>> VER {trID} MSNP9 CVR0 # MSN协议协商
<<< VER {trID} MSNP9 CVR0 # 得到允许协议
>>> CVR {trID} 0x0409 win 4.10 i386 MSNMSGR 7.0.0816 MSMSGS {userName} \r\n # MSN环境协商
<<< CVR {trID} 7.0.0820 7.0.0820 7.0.0820 http://msgruser.dlservice.microsoft.com/download/9/7/6/976085F9-D0F8-4D96-9208 -FC1B461CD3D7/Install_MSN_Messenger_DL.exe http://messenger.msn.com CVR {trID} 7.0.0820 7.0.0820 7.0.0820
# MSN环境允许
>>> USR {trID} TWN I {userName} # 服务器请求协商
<<< XFR 3 NS 207.46.107.41:1863 0 65.54.239.210:1863 # 服务器连接地址----> 重新登陆指定服务器,协定协议,环境信息~
>>> USR {trID} TWN I {userName} # 服务器请求协商
<<< USR 3 TWN S ct=1205292058,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%
2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0
# 得到登陆代码 ct=...
利用header发送登陆信息给 https://login.live.com/login2.srf
Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={userName},pwd={passWord},{ct=}
Host: login.passport.com获取认证身份信息:
HTTP/1.1 200 OK \r\n
Server: Microsoft-IIS/5.0 \r\n
Date: Mon, 22 Dec 2003 21:10:07 GMT \r\n
PPServer: H: LAWPPIIS6B061 \r\n
Connection: close \r\n Content-Type: text/html \r\n
Expires: Mon, 22 Dec 2003 21:09:07 GMT \r\n
Cache-Control: no-cache \r\n
cachecontrol: no-store \r\n
Pragma: no-cache \r\n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
Set-Cookie: ... ... \r\n
Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', ru=http://messenger.msn.com \r\n
Content-Length: 0 \r\n
\r\n捕捉from-PP=’...’的信息发送登陆代码:
>>> USR {trID} TWN S {loginCode}
<<< USR {trID} OK |userName| |yourName| 1 0 # 登陆成功,返回信息!
<<< ....... # 这里会得到个人的信息和在线好友的信息<<< CHL 0 23076971217119032436
>>> QRY {trID} [email protected] 32 {md5Code}
Md5Code = CHL得到的代码 + Q1P7W2E4J9R8U3S5 做 md5 运算
<<< QRY {trID} # 被允许登陆!>>> XFR {trID} SB # 请求DS服务器!
<<< XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址!>>>
无语了,下面没有了,实在是不明白啊……
msn.class.php
msnbot.php
msnbot.sh
msnsendmsg.php
sample.php
test.msn这里有完整的例子.
< < < XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址! > > > 这里你没输入了?? 连接断了?超时了?
连接返回的DS服务器,然后发送 USR {new trID} {userName} {yourCode}
但是发送后应该得到通讯服务器的请求许可,然后再可发送 CAL 的命令请求对话申请~现在就是连接DS服务器成功后,不返回 USR 指令~但有趣的是,用SOCKET打开 DS 服务器,SOCKET连接是成功的,成功后却不接受指令,为什么?!
您的例子是 MSNv15 的协议~v15中,很多返回都是XML片段,我不需要那么复杂的,而且最早的时候我也是按v15协议写的,貌似登陆有点困难~而且这个例子太复杂了……对我现在来说,我只需要完成发言就可以了~有办法吗?~
//$msn->sendMessage(" ", " "); // MSNv9
[code=PHP] 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) && false !== $this->connect)
return true;
else
return false;
} function isTalkLink()
{
if (!is_null($this->talkLink))
return true;
else
return false;
} function close()
{
@fclose($this->connect);
} function startTalk()
{
if ($this->connect = fsockopen($this->server, $this->port, $errno, $errstr, 5))
$this->verTalk();
}
function verTalk() // MSN 协议协商
{
$this->put("VER {$this->trID} MSNP9 CVR0 \r\n");
$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} \r\n");
$data = $this->get();
//echo $data;
if (false !== strripos($data, "CVR"))
$this->reqTalk();
} function reqTalk() // 请求确认
{
$this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
$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:%2F%2Fmessenger.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 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,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} \r\n"); // USR |trID| SSO S |t=code|
$data = $this->get();
//print_r($data);
$this->put("SYN {$this->trID} 0 \r\n");
$this->put("CHG {$this->trID} NLN \r\n");
//print_r($this->get());
while (!feof($this->connect))
{
$data = $this->get();
$code = substr($data, 0, 3);
switch ($code)
{
case "CHL":
$this->valiServer($data);
break;
case "RNG":
echo "~~~~";
break;
default:
break;
}
}
} function valiServer($data) // 获取服务器验证
{
// 分析代码
$bits = explode (" ", trim($data)); // CHL 0 19329266117064165551
$value = md5($bits[2] . "Q1P7W2E4J9R8U3S5"); // 不明白 Q1P7W2E4J9R8U3S5 代码
$this->put("QRY {$this->trID} [email protected] 32\r\n{$value}"); // 客户端回答验证
$data = $this->get();
if ("QRY" == substr($data, 0, 3))
$this->getDS();
} function getDS() // 请求DS服务器地址
{
$this->put("XFR {$this->trID} SB \r\n");
$data = $this->get();
// XFR 8 SB 207.46.26.78:1863 CKI 967971302.17249104.195112210
if ("XFR" == substr($data, 0, 3))
{
list(, , , $server, , $code) = explode(" ", $data); // 获取服务器地址和必要代码
list($ip, $port) = explode(":", $server); // 分离IP和端口
if (!empty($ip) && !empty($port) && !empty($code))
{
$talkMSN = new _myMSN($ip, $port, $this->userName, $code);
if ($talkMSN->getPassInfo())
{
$talkMSN->msnCall("[email protected]");
}
}
else
{
exit("对话通讯失败!");
}
}
}
function analyse($data)
{
$theCode = substr($data, 0, 3);
switch ($theCode)
{
case "OUT":
print("<div>服务器断开!</div>");
break;
default:
break;
}
} }
class _myMSN // 用于直接连接的操作
{ private $connect = null;
private $trID = 1;
private $debug = true;
private $maxMessage = 4096; private $passCall = false; // 允许呼叫?>
一次过长,分批~不好意思!
//$msn->sendMessage(" ", " "); // MSNv9
[code=PHP] 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) && false !== $this->connect)
return true;
else
return false;
} function isTalkLink()
{
if (!is_null($this->talkLink))
return true;
else
return false;
} function close()
{
@fclose($this->connect);
} function startTalk()
{
if ($this->connect = fsockopen($this->server, $this->port, $errno, $errstr, 5))
$this->verTalk();
}
function verTalk() // MSN 协议协商
{
$this->put("VER {$this->trID} MSNP9 CVR0 \r\n");
$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} \r\n");
$data = $this->get();
//echo $data;
if (false !== strripos($data, "CVR"))
$this->reqTalk();
} function reqTalk() // 请求确认
{
$this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
$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:%2F%2Fmessenger.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 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,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} \r\n"); // USR |trID| SSO S |t=code|
$data = $this->get();
//print_r($data);
$this->put("SYN {$this->trID} 0 \r\n");
$this->put("CHG {$this->trID} NLN \r\n");
//print_r($this->get());
while (!feof($this->connect))
{
$data = $this->get();
$code = substr($data, 0, 3);
switch ($code)
{
case "CHL":
$this->valiServer($data);
break;
case "RNG":
echo "~~~~";
break;
default:
break;
}
}
} function valiServer($data) // 获取服务器验证
{
// 分析代码
$bits = explode (" ", trim($data)); // CHL 0 19329266117064165551
$value = md5($bits[2] . "Q1P7W2E4J9R8U3S5"); // 不明白 Q1P7W2E4J9R8U3S5 代码
$this->put("QRY {$this->trID} [email protected] 32\r\n{$value}"); // 客户端回答验证
$data = $this->get();
if ("QRY" == substr($data, 0, 3))
$this->getDS();
} function getDS() // 请求DS服务器地址
{
$this->put("XFR {$this->trID} SB \r\n");
$data = $this->get();
// XFR 8 SB 207.46.26.78:1863 CKI 967971302.17249104.195112210
if ("XFR" == substr($data, 0, 3))
{
list(, , , $server, , $code) = explode(" ", $data); // 获取服务器地址和必要代码
list($ip, $port) = explode(":", $server); // 分离IP和端口
if (!empty($ip) && !empty($port) && !empty($code))
{
$talkMSN = new _myMSN($ip, $port, $this->userName, $code);
if ($talkMSN->getPassInfo())
{
$talkMSN->msnCall("[email protected]");
}
}
else
{
exit("对话通讯失败!");
}
}
}
function analyse($data)
{
$theCode = substr($data, 0, 3);
switch ($theCode)
{
case "OUT":
print("<div>服务器断开!</div>");
break;
default:
break;
}
} }
?>
一次过长,分批~不好意思!
class _myMSN // 用于直接连接的操作
{ private $connect = null;
private $trID = 1;
private $debug = true;
private $maxMessage = 4096; private $passCall = false; // 允许呼叫
function _myMSN($ip, $port, $userName, $clientCode)
{
echo("<div style='font-size:13px; color:pink;'>== re Connect {$ip}:{$port}</div>");
if ($this->connect = fsockopen($ip, $port, $errno, $errmsg, 5))
{
$this->put("USR {$this->trID} {$userName} {$clientCode} \r\n");
$data = $this->get();
if ("USR" == substr($data, 3, 0))
{
$this->passCall = true;
}
}
} function put($data)
{
if ($this->isConnect())
{
fputs($this->connect, $data);
$this->trID++;
if ($this->debug)
print("<div style='color:blue;font-size:13px;'>--->{$data}</div>");
}
} function get()
{
if ($data = @fgets($this->connect, $this->maxMessage))
{
if ($this->debug)
print("<div style='color:orange;font-size:13px;'><---{$data}</div>"); return $data;
}
else
{
return false;
}
} function isConnect()
{
if (!is_null($this->connect) && false !== $this->connect)
return true;
else
return false;
} function getPassInfo() // 判断是请求连接被通过
{
if ($this->isConnect() && $this->passCall)
return true;
else
return false;
}
function msnCall($mail)
{
if ($this->passCall)
{
$this->put("CAL {$this->trID} {$mail} /r/n");
$data = $this->get();
}
}
}
这里是我不明白的地方,我是按v9协议一步一步发送命令的,也考虑到了服务器返回错误的问题~
但理论上 新的对话CLASS ,发送 USR 命令后应该返回 USR,但就得不到返回值,为什么呢?
<<<XFR 8 SB 207.46.26.151:1863 CKI 1392191620.1563566.67237163
==== re Connect 207.46.26.151:1863
--->USR 1 [email protected] 1392191620.1563566.67237163
我已经获得了DS服务器地址,也连接成功,但是发送信息不返回~我不清楚为什么~令牌代码也获取正确!是不是服务器的关系啊?~我不清楚MSN在中国是不是有服务器,但是我测试的WEB空间在香港!还是在香港我的PASSPORT就被阻止了?不确定啊?~为什么啊?
救救我……就要完成发送了,只要返回DS服务器的验证,我就能CAL了……
为什么登陆都正常,按V15和V9的协议,下一步都应该是DS的用户身份验证,到这一步就不行了....
另外我好像只能用MSNP9连接,用更高的登录出错。有成功使用的请介绍一下。http://code.google.com/p/phpmsnclass/downloads/list
> > > QRY {trID} [email protected] 32 {md5Code}
Md5Code = CHL得到的代码 + Q1P7W2E4J9R8U3S5 做 md5 运算
< < < QRY {trID} # 被允许登陆! > > > XFR {trID} SB # 请求DS服务器!
< < < XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址! > > > 中间是不是服务器有保持连接的命令??你没回
http://rd-program.blogspot.com/2008/11/5msnphp.html
Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={userName},pwd={passWord},{ct=}
Host: login.passport.com 这段代码贴出来(net C#) 的,我做到这里就卡住了,返回空的啊!谢谢了
http://funp.com/people/group/info.php?group_id=1763分鐘學會使用程式發送msn訊息,php篇(一)
http://rd-program.blogspot.com/2008/11/5msnphp.html
3分鐘學會使用程式發送msn訊息,dotNet C#篇(二)
http://rd-program.blogspot.com/2008/11/3msn-net-c.html
3分鐘學會使用程式發送msn訊息, Java篇(三)
http://rd-program.blogspot.com/2008/11/3msn-java.html
3分鐘學會使用程式發送msn訊息, Perl篇(四)
http://rd-program.blogspot.com/2008/11/3msn-perl_14.html
3分鐘學會使用程式發送msn訊息, VB6.0篇(五)
http://rd-program.blogspot.com/2008/11/3msn-vb60.html
3分鐘學會使用程式發送msn訊息, ASP篇(六)
http://rd-program.blogspot.com/2008/11/3msn-asp.html