在智慧型手機與即時通訊軟體普及之前,ICQ 是許多網民的主要聯繫工具。ICQ 曾提供網頁版簡訊發送服務,開發者可透過模擬瀏覽器行為,利用 PHP 程式自動發送簡訊至手機。本文介紹一個經典的 PHP 範例,展示如何透過 ICQ Web Gateway 發送簡訊,並解析其運作原理。
該程式採用 fsockopen 建立 TCP 連線至 web.icq.com 連接埠 80,手動構造 HTTP POST 請求,模擬使用者在網頁上登入並發送簡訊的完整流程:
/karma/dologin/ 發送帳號(UIN)與密碼,取得伺服器回傳的 Set-Cookie 標頭中的 KarmaLogin 值。/sms/send_history/ 發送 multipart/form-data 格式的表單資料,包含國碼、電話號碼、訊息內容等欄位。Moved Permanently,視為發送成功。
$contentlength = 37 + strlen($uin) + strlen($passw);
$post = "POST https://web.icq.com/karma/dologin/1,,,00.html HTTP/1.0\r\n" .
"Content-Type: application/x-www-form-urlencoded\r\n" .
"Content-Length: $contentlength\r\n" .
"Cookie: uin=$uin; sms_country=$prefix; KarmaService1=Yes\r\n\r\n" .
"uService=1&uLogin=$uin&uPassword=$passw&x=0&y=0";
$htmlreply = "";
$remote = fsockopen("web.icq.com", 80, $errno, $errstr, 30);
fputs($remote, $post);
while (!feof($remote)) { $htmlreply .= fgets($remote, 120); }
fclose($remote);
$splited = explode("\n", $htmlreply);
$cookies = str_replace(["Set-Cookie: KarmaLogin=", "; path=/", "\n"], "", $splited[3]);
$boundary = "---------------------------7d12442eab4";
$post = "POST https://web.icq.com/sms/send_history/1,,,00.html HTTP/1.0\r\n" .
"Content-Type: multipart/form-data; boundary=$boundary\r\n" .
"Cookie: uin=$uin; sms_country=$prefix; KarmaLogin=$cookies\r\n\r\n" .
"--$boundary\r\nContent-Disposition: form-data; name=\"prefix\"\r\n\r\n$prefix\r\n" .
"--$boundary\r\nContent-Disposition: form-data; name=\"tophone\"\r\n\r\n$phonenumber\r\n" .
"--$boundary\r\nContent-Disposition: form-data; name=\"msg\"\r\n\r\n$message\r\n" .
"--$boundary--\r\n";
此程式碼約成於 2000 年代初期,當時 ICQ 提供免費網頁發簡訊功能,開發者需先在 https://web.icq.com/sms/login/ 註冊 ICQ 號碼。然而,隨著 ICQ 服務調整、簡訊閘道關閉以及現代通訊協定(如 SMPP、HTTP API)的普及,此方法早已失效。現代 PHP 發送簡訊通常改用第三方簡訊平台(Twilio、Nexmo、國內簡訊商)提供的 RESTful API,搭配 cURL 或 Guzzle 實作,具備更佳的安全性、穩定性與功能支援。
fsockopen 連線失敗、HTTP 狀態碼、伺服器回應格式變更等情況。若需在 PHP 專案中整合簡訊發送功能,建議採用以下方式:
twilio/sdk、vonage/nexmo-php)這段程式碼是早期 PHP 開發者「逆向工程」網頁服務、實現自動化的經典範例,展示了 HTTP 協定、Cookie 機制、Multipart 表單編碼等基礎知識。雖然具體服務已成為歷史,但其中的網路程式設計思維仍具參考價值。現代開發應善用標準化 API 與成熟函式庫,專注於業務邏輯而非底層協定細節。