Я использую пару сервисов для получения кода страны.Если кто-то не работает по какой-либо причине (например, превышен лимит), он пытается воспользоваться следующей услугой:
/**
* Make cUrl request.
*/
private static function _getCurl(string $url, int $timeout = 400):?string {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout); // If it takes too long just try the next api
curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
/**
* Try to get the country code of the current user based on it's ip.
*/
public static function getCountryCode():?string {
// https://hostip.info/ - unlimited? requests per day
// https://ipinfo.io/ - 1000 requests per day
// https://ipdata.co/ - 1500 requests per day
// https://ipstack.com/ - 10000 requests per month (not used at the moment)
// Get country code:
$ip = $_SERVER['HTTP_CLIENT_IP']);
$countryCode = null;
if (!$countryCode) { // Try hostip.info
try {
$output = self::_getCurl('https://api.hostip.info/get_json.php?ip=' . $ip);
$output = json_decode($output);
$countryCode = ($output->country_code == 'XX') ? null : $output->country_code;
}
catch (Throwable $t) {}
}
if (!$countryCode) { // Try ipinfo.io
try {
$output = self::_getCurl('http://ipinfo.io/' . $ip . '/json?token=[ipinfo.io TOKEN HERE]');
$output = json_decode($output);
$countryCode = ($output->country == 'XX') ? null : $output->country;
}
catch (Throwable $t) {}
}
if (!$countryCode) { // Try ipdata.co
try {
$output = self::_getCurl('https://api.ipdata.co/' . $ip . '?api-key=[ipdata.co TOKEN HERE]');
$output = json_decode($output);
$countryCode = ($output->country_code == 'XX') ? null : $output->country_code;
}
catch (Throwable $t) {}
}
return $countryCode;
}
Это урезанный класс из более крупного класса, поэтому вам, возможно, потребуется кое-что настроить здесь и там.Для ipinfo.io и ipdata.co нужны токены api, поэтому сначала их нужно получить с их сайтов (оба бесплатны).