開發一個功能完善的 guest_info 類別,能夠輕鬆獲取訪客的語言偏好、瀏覽器類型、作業系統、IP 位址,甚至地理位置與 ISP 資訊。以下是核心程式碼實現:
<?php
/**
* 訪客資訊獲取類別
* 提供:語言、瀏覽器、作業系統、IP、地理位置、ISP
*/
class guest_info {
/** 獲取訪客語言:簡體中文、繁體中文、English */
function getlang() {
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
if (preg_match('/zh-c/i', $lang)) return '簡體中文';
elseif (preg_match('/zh/i', $lang)) return '繁體中文';
else return 'English';
}
/** 獲取瀏覽器類型:msie、firefox、chrome、safari、opera、other */
function getbrowser() {
$ua = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/msie/i', $ua)) return 'msie';
elseif (preg_match('/firefox/i', $ua)) return 'firefox';
elseif (preg_match('/chrome/i', $ua)) return 'chrome';
elseif (preg_match('/safari/i', $ua)) return 'safari';
elseif (preg_match('/opera/i', $ua)) return 'opera';
else return 'other';
}
/** 獲取作業系統:windows、mac、linux、unix、bsd、other */
function getos() {
$ua = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/win/i', $ua)) return 'windows';
elseif (preg_match('/mac/i', $ua)) return 'mac';
elseif (preg_match('/linux/i', $ua)) return 'linux';
elseif (preg_match('/unix/i', $ua)) return 'unix';
elseif (preg_match('/bsd/i', $ua)) return 'bsd';
else return 'other';
}
/** 獲取真實 IP 位址(支援代理) */
function getip() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = explode(',', $_SERVER['HTTP_CLIENT_IP']);
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
} elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = explode(',', $_SERVER['REMOTE_ADDR']);
} else {
$ip[0] = 'none';
}
return $ip[0];
}
}
// 使用範例
$obj = new guest_info();
echo $obj->getlang(); // 訪客語言
echo $obj->getbrowser(); // 瀏覽器
echo $obj->getos(); // 作業系統
echo $obj->getip(); // IP 位址
?>
透過 cURL 請求騰訊的 IP 查詢介面,解析回傳的 GB2312 編碼頁面並轉為 UTF-8:
<?php
function getiploc_qq($queryip) {
$url = 'https://ip.qq.com/cgi-bin/searchip?searchip1=' . $queryip;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_ENCODING, 'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$result = mb_convert_encoding($result, 'utf-8', 'gb2312');
curl_close($ch);
preg_match('@<span>(.*)</span></p>@iu', $result, $iparray);
return $iparray[1] ?? '';
}
// 使用範例
echo getiploc_qq('183.37.209.57');
?>
新浪提供結構化的 JSON 回應,解析更方便:
<?php
function getiploc_sina($queryip) {
$url = 'https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=' . $queryip;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_ENCODING, 'utf8');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$location = curl_exec($ch);
$location = json_decode($location);
curl_close($ch);
if ($location === false) return '';
$loc = '';
if (empty($location->desc)) {
$loc = $location->province . $location->city . $location->district . $location->isp;
} else {
$loc = $location->desc;
}
return $loc;
}
echo getiploc_sina('183.37.209.57');
?>
提示: 實際專案中建議加入快取機制,避免頻繁呼叫外部 API 影響效能。