淘寶開放平台提供免費 IP 地理信息查詢接口:https://ip.taobao.com/service/getIpInfo.php?ip=,返回 JSON 格式數據,包含國家、地區、城市、ISP 等字段,適合會員註冊記錄、訪問統計、風控等場景。
<?php
class TaobaoIPQuery {
private string $ip;
private ?object $data = null;
private const API_URL = 'https://ip.taobao.com/service/getIpInfo.php';
private const TIMEOUT = 3.0;
public function __construct(string $ip) {
if (empty($ip)) throw new InvalidArgumentException('IP address must not be empty');
$this->ip = $ip;
$this->fetch();
}
private function fetch(): void {
$url = self::API_URL . '?ip=' . urlencode($this->ip);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => self::TIMEOUT,
CURLOPT_SSL_VERIFYPEER => false, // HTTP 接口無需 SSL
]);
$response = curl_exec($ch);
$errno = curl_errno($ch);
curl_close($ch);
if ($errno) throw new RuntimeException("cURL error ($errno): " . curl_error($ch));
if (!$response) throw new RuntimeException('Empty response from Taobao IP API');
$json = json_decode($response);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON decode failed: ' . json_last_error_msg());
}
if (!isset($json->code) || $json->code !== 0) {
throw new RuntimeException('API error: ' . ($json->msg ?? 'Unknown'));
}
$this->data = $json->data;
}
public function getCountry(): string { return $this->data->country ?? ''; }
public function getRegion(): string { return $this->data->region ?? ''; }
public function getCity(): string { return $this->data->city ?? ''; }
public function getIsp(): string { return $this->data->isp ?? ''; }
public function getArea(): string { return $this->data->area ?? ''; }
public function getIp(): string { return $this->data->ip ?? $this->ip; }
public function getAll(): array {
return (array)$this->data;
}
}
<?php
require_once 'TaobaoIPQuery.php';
try {
$clientIp = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
// 取第一個非 unknown IP
$clientIp = array_shift(array_filter(explode(',', $clientIp), fn($ip) => trim($ip) !== 'unknown'));
$query = new TaobaoIPQuery(trim($clientIp));
echo "國家: {$query->getCountry()}\n";
echo "地區: {$query->getRegion()}\n";
echo "城市: {$query->getCity()}\n";
echo "ISP : {$query->getIsp()}\n";
// 入庫示例
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare("INSERT INTO user_logins (ip, country, region, city, isp, created_at) VALUES (?,?,?,?,?,NOW())");
$stmt->execute([
$query->getIp(),
$query->getCountry(),
$query->getRegion(),
$query->getCity(),
$query->getIsp(),
]);
} catch (Exception $e) {
error_log('IP 查詢失敗: ' . $e->getMessage());
// 降級處理:記錄原始 IP,不阻塞主流程
}
https://ipapi.sinaapp.com/、IP2Location 等多源切換https://ip.taobao.com/composer require torann/geoip
// 或
composer require geoip2/geoip2:~2.0 (MaxMind 官方)
離線資料庫查詢零延遲、無外部依賴,適合高頻場景。