Nhận biết quốc gia bằng PHP

Cập nhật lần cuối vào

Bài viết này mình sẽ hướng dẫn cho các bạn cách nhận biết quốc gia của khách truy cập vào trang web của bạn bằng PHP. Có nhiều cách để bạn áp dụng, tuy nhiên với chúng ta thì không cần phải dùng các code quá chuyên nghiệp, bạn có thể sử dụng các dịch vụ miễn phí được chia sẻ trên mạng để nhận biết quốc gia của người dùng.

function ip_details($ip) {
	if(!filter_var($ip, FILTER_VALIDATE_IP)) {
		return array();
	}
	$json = file_get_contents("http://ipinfo.io/{$ip}");
	$details = json_decode($json);
	$details = (array)$details;
	return $details;
}

Hàm bên trên chúng ta sẽ sử dụng dịch vụ kiểm tra thông tin địa chỉ IP của ipinfo.io, đây là dịch vụ miễn phí có thể phục vụ được nhu cầu của bạn. Tuy nhiên, đôi lúc thì kết quả trả về không chứa thông tin.

function ip_info_geoplugin($ip = null, $purpose = 'location', $deep_detect = true) {
	$output = null;
	if(!filter_var($ip, FILTER_VALIDATE_IP)) {
		$ip = $_SERVER['REMOTE_ADDR'];
		if($deep_detect) {
			if(filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) {
				$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
			}
			if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) {
				$ip = $_SERVER['HTTP_CLIENT_IP'];
			}
		}
	}
	$purpose = str_replace(array('name', '\n', '\t', ' ', '-', '_'), null, strtolower(trim($purpose)));
	$support = array('country', 'countrycode', 'state', 'region', 'city', 'location', 'address');
	$continents = array(
		'AF' => 'Africa',
		'AN' => 'Antarctica',
		'AS' => 'Asia',
		'EU' => 'Europe',
		'OC' => 'Australia (Oceania)',
		'NA' => 'North America',
		'SA' => 'South America'
	);
	if(filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
		$ipdat = @json_decode(file_get_contents('http://www.geoplugin.net/json.gp?ip=' . $ip));
		if(@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
			switch($purpose) {
				case 'location':
					$output = array(
						'city' => @$ipdat->geoplugin_city,
						'state' => @$ipdat->geoplugin_regionName,
						'country' => @$ipdat->geoplugin_countryName,
						'country_code' => @$ipdat->geoplugin_countryCode,
						'continent' => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
						'continent_code' => @$ipdat->geoplugin_continentCode
					);
					break;
				case 'address':
					$address = array($ipdat->geoplugin_countryName);
					if(@strlen($ipdat->geoplugin_regionName) >= 1) {
						$address[] = $ipdat->geoplugin_regionName;
					}
					if(@strlen($ipdat->geoplugin_city) >= 1) {
						$address[] = $ipdat->geoplugin_city;
					}
					$output = implode(', ', array_reverse($address));
					break;
				case 'city':
					$output = @$ipdat->geoplugin_city;
					break;
				case 'state':
					$output = @$ipdat->geoplugin_regionName;
					break;
				case 'region':
					$output = @$ipdat->geoplugin_regionName;
					break;
				case 'country':
					$output = @$ipdat->geoplugin_countryName;
					break;
				case 'countrycode':
					$output = @$ipdat->geoplugin_countryCode;
					break;
			}
		}
	}
	return $output;
}

Trên mạng hiện đang có nhiều dịch vụ miễn phí cho phép bạn áp dụng để lấy thông tin địa chỉ IP, ngoài ipinfo thì bạn cũng có thể dùng dịch vụ của geoplugin. Bạn cứ tìm kiếm các dịch vụ uy tín, được nhiều người sử dụng nhất hiện nay mà dùng.

Để cho chắc ăn hơn thì bạn có thể kết hợp nhiều hàm lại với nhau, bằng cách sau khi thực thi hàm thứ nhất, kiểm tra xem kết quả có đúng hay chưa, nếu không có kết quả trả về thì tiếp tục sử dụng hàm thứ hai để lấy thông tin.