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

PHP 獲取手機客戶端信息類:號碼、UA、IP、類型檢測

     編輯:PHP 綜合知識

功能概覽

封裝常見手機端 HTTP 頭檢測,提供:手機號碼提取(網關透傳)、User-Agent 解析、手機類型識別、Opera/M3Gate 瀏覽器判斷、HTTP Accept 獲取、真實 IP 獲取(支持代理穿透)。

完整類代碼

<?php
/**
 * 手機信息檢測類
 * 適用於 WAP 2.0 / 早期智能機時代網關透傳頭
 * 現代 4G/5G 環境多不再透傳手機號,僅供歷史項目維護參考
 */
class MobileInfo {
    /**
     * 獲取手機號碼
     * 依賴運營商網關透傳頭,現代網絡基本不可用
     * @return string|false
     */
    public function getPhoneNumber() {
        // 中國移動 CMNET/CMWAP
        if (isset($_SERVER['HTTP_X_NETWORK_INFO'])) {
            $str = $_SERVER['HTTP_X_NETWORK_INFO'];
            // 格式示例: "...,11012345678,..."
            return preg_replace('/(.*,)(11\d)(,.*)/i', '$2', $str);
        }
        // 中國聯通/電信舊網關
        if (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])) {
            return $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];
        }
        if (isset($_SERVER['HTTP_X_UP_SUBNO'])) {
            $str = $_SERVER['HTTP_X_UP_SUBNO'];
            return preg_replace('/(.*)(11\d)(.*)/i', '$2', $str);
        }
        // 部分設備 ID
        if (isset($_SERVER['DEVICEID'])) {
            return $_SERVER['DEVICEID'];
        }
        return false;
    }

    /**
     * 獲取所有 HTTP 頭(調試用)
     * @return string
     */
    public function getHttpHeader() {
        $str = '';
        foreach ($_SERVER as $key => $val) {
            $val = str_replace('&', '&', $val); // 防 XSS
            $str .= "$key → $val\n";
        }
        return $str;
    }

    /**
     * 獲取 User-Agent
     * @return string|false
     */
    public function getUA() {
        return $_SERVER['HTTP_USER_AGENT'] ?? false;
    }

    /**
     * 解析手機類型(取 UA 首段)
     * 典型 UA: "NokiaN73/3.0 (SymbianOS/9.2; U; en-us) ..."
     * @return string|false
     */
    public function getPhoneType() {
        $ua = $this->getUA();
        if ($ua !== false) {
            // 以空格、分號、括號為分隔,取首個標識
            return preg_split('/[\s;()]/', $ua, 2)[0];
        }
        return false;
    }

    /**
     * 判斷是否 Opera 瀏覽器
     * @return bool
     */
    public function isOpera() {
        $ua = $this->getUA();
        return $ua && preg_match('/Opera/i', $ua);
    }

    /**
     * 判斷是否 M3Gate 瀏覽器(山寨機常見)
     * @return bool
     */
    public function isM3gate() {
        $ua = $this->getUA();
        return $ua && preg_match('/M3Gate/i', $ua);
    }

    /**
     * 獲取 HTTP Accept 頭
     * @return string|false
     */
    public function getHttpAccept() {
        return $_SERVER['HTTP_ACCEPT'] ?? false;
    }

    /**
     * 獲取客戶端真實 IP(穿透代理)
     * @return string
     */
    public function getIP() {
        $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
        $forwarded = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? '';
        
        if ($forwarded && $forwarded !== 'unknown') {
            // 取第一個非未知 IP
            $ips = explode(',', $forwarded);
            foreach ($ips as $fip) {
                $fip = trim($fip);
                if ($fip && $fip !== 'unknown') {
                    $ip = $fip;
                    break;
                }
            }
        }
        return $ip;
    }
}

// 使用示例
$mobile = new MobileInfo();
echo "手機號: " . ($mobile->getPhoneNumber() ?: '不可用') . "<br>";
echo "UA: " . ($mobile->getUA() ?: '無') . "<br>";
echo "類型: " . ($mobile->getPhoneType() ?: '未知') . "<br>";
echo "IP: " . $mobile->getIP() . "<br>";
echo "Opera: " . ($mobile->isOpera() ? '是' : '否') . "<br>";
echo "M3Gate: " . ($mobile->isM3gate() ? '是' : '否') . "<br>";
?>

現代環境適用性說明

⚠️ 重要提示:本類基於 WAP 2.0 時代(約 2005-2012) 運營商網關透傳機制設計。現代 4G/5G/ WiFi 環境下:
  • 手機號碼頭(HTTP_X_NETWORK_INFO 等)幾乎完全不可用,運營商出於隱私合規不再透傳
  • 設備 ID(DEVICEID)僅極少數定制 ROM/物聯網卡保留
  • User-Agent、IP 檢測依然有效,是當前設備識別主流手段

現代替代方案

  1. 一鍵登錄/本機號碼校驗:三大運營商提供 OAuth2 接口(需申請資質),前端喚起授權頁獲取加密手機號
  2. 設備指紋:Canvas 指紋、電池狀態、傳感器數據、字體列表綜合生成唯一 ID
  3. IP 地理庫:MaxMind GeoIP2、IP2Location 精準定位城市/ISP
  4. UA 解析庫:ua-parser/uap-php 正則庫,準確識別品牌、型號、OS 版本

代碼優化建議

  • 正則預編譯緩存:static $regex = []; $regex['phone'] ??= '/pattern/';
  • IP 解析支持 IPv6 格式驗證(filter_var($ip, FILTER_VALIDATE_IP))
  • 增加 getClientInfo() 聚合方法,一次性返回結構化數組供 API 輸出
  • 引入 PSR-7 ServerRequestInterface 解耦全局 $_SERVER,便於測試

總結

本類作為歷史代碼參考價值大,展示了早期移動互聯網網關協議特徵。新項目請採用運營商一鍵登錄 + 設備指紋 + 專業 UA 解析庫組合方案。

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