首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

透過 ICQ 網關發送手機簡訊的 PHP 實作教學

     編輯:PHP 綜合知識

前言

在智慧型手機與即時通訊軟體普及之前,ICQ 是許多網民的主要聯繫工具。ICQ 曾提供網頁版簡訊發送服務,開發者可透過模擬瀏覽器行為,利用 PHP 程式自動發送簡訊至手機。本文介紹一個經典的 PHP 範例,展示如何透過 ICQ Web Gateway 發送簡訊,並解析其運作原理。

核心原理:模擬瀏覽器登入與發送

該程式採用 fsockopen 建立 TCP 連線至 web.icq.com 連接埠 80,手動構造 HTTP POST 請求,模擬使用者在網頁上登入並發送簡訊的完整流程:

  1. 登入階段:向 /karma/dologin/ 發送帳號(UIN)與密碼,取得伺服器回傳的 Set-Cookie 標頭中的 KarmaLogin 值。
  2. 發送階段:攜帶取得的 Cookie,向 /sms/send_history/ 發送 multipart/form-data 格式的表單資料,包含國碼、電話號碼、訊息內容等欄位。
  3. 結果判斷:若回應包含 Moved Permanently,視為發送成功。

    關鍵程式碼片段解析

    1. 計算 Content-Length 並構造登入請求

    $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";

    2. 解析登入回應取得 Cookie

    $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]);

    3. 構造發送簡訊的 Multipart 請求

    $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 實作,具備更佳的安全性、穩定性與功能支援。

    安全性與最佳實務提醒

    • 明文傳輸密碼:原始碼透過 HTTP 明文傳送帳密,極不安全。
    • 硬式編碼邊界字串:Multipart boundary 固定字串,若訊息內容包含相同字串會導致解析錯誤。
    • 缺乏錯誤處理:未檢查 fsockopen 連線失敗、HTTP 狀態碼、伺服器回應格式變更等情況。
    • 相依已停用服務:ICQ 簡訊閘道已關閉,程式無法實際運作。

      現代替代方案建議

      若需在 PHP 專案中整合簡訊發送功能,建議採用以下方式:

      • 使用成熟的 SDK(如 twilio/sdk、vonage/nexmo-php)
      • 採用 HTTPS 加密傳輸,儲存 API 金鑰於環境變數
      • 實作重試機制、發送狀態追蹤、頻率限制
      • 遵循各地電信法規(如台灣 NCC 規範、GDPR)

        結語

        這段程式碼是早期 PHP 開發者「逆向工程」網頁服務、實現自動化的經典範例,展示了 HTTP 協定、Cookie 機制、Multipart 表單編碼等基礎知識。雖然具體服務已成為歷史,但其中的網路程式設計思維仍具參考價值。現代開發應善用標準化 API 與成熟函式庫,專注於業務邏輯而非底層協定細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved