本文展示一個完整的 PHP 類,通過 MSNP 協議連接 MSN Messenger 服務器,實現登錄驗證與好友列表獲取。代碼涵蓋 Socket 通訊、HTTP 重定向驗證、SSL 加密傳輸等核心技術。
class MSN {
private $username, $password, $socket, $challenge;
private $startcomm = 0, $status = array(), $data = array();
public function set_account($username, $password) { ... }
public function getStatus() { return $this->status; }
// 核心流程方法
private function msn_connect($server, $port) { ... }
private function nexus_connect($tpf) { ... }
private function send_command($command) { ... }
private function getData() { ... }
private function checkData($buffer) { ... }
}
messenger.hotmail.com:1863VER、CVR 命令USR TWN I 發起認證XFR 指向 Notification 服務器nexus.passport.com 獲取票據USR TWN S 提交票據,CHG HDN 設置狀態SYN 命令獲取聯繫人數據function getData() {
$buffer = "";
while (!feof($this->socket)) {
$buffer .= fread($this->socket, 1024);
if (preg_match("/\r/", $buffer)) break;
}
$this->checkData($buffer);
}
// 提取 Challenge
preg_match("/lc=(\.+?)/Ui", $buffer, $matches);
// 解析好友列表
$split = explode("\n", $buffer);
foreach ($split as $line) {
$detail = explode(" ", $line);
if ($detail[0] == "LST" && isset($detail[2])) {
$this->data[] = array($detail[1], urldecode($detail[2]));
}
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://nexus.passport.com:443/rdr/pprdr.asp");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($curl);
$msn = new MSN();
$msn->set_account('xx@hotmail.com', 'password');
$msn->msn_connect("messenger.hotmail.com", 1863);
$data = $msn->getStatus();
print_r($data);
歷史背景:MSN Messenger 已於 2013 年停止服務,此代碼僅供協議學習、Socket 通訊教學參考。現代即時通訊建議使用 XMPP、WebSocket 或成熟 IM SDK。