August 5, 2022

Получить город по IP бесплатно, PHP. geo city free

Работает не везде, если IP залочили, то все, только прокси или другие варианты. Вписываем за место test.ru ваш сайт, так как они могут залочить, если нет обратной связи на проект с которого дергается инфа

код не проверял у меня залочка, писан по простому

<?php 

function getcity($ip) {  
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, "https://tools.keycdn.com/geo.json?host={$ip}");
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_USERAGENT, "keycdn-tools:https://test.ru");
	curl_setopt($curl, CURLOPT_REFERER, "https://test.ru");
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); 
	curl_setopt($curl, CURLOPT_TIMEOUT, 10);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	$resp = curl_exec($curl); 
	curl_close($curl);
	$json = json_decode($resp, true);
	$info = ['city'=>'', 'country'=>''];
	if (isset($json['data']['geo']['country_name'])) 
		$info['country'] = $json['data']['geo']['country_name'];
	if (isset($json['data']['geo']['city'])) 
		$info['city'] = $json['data']['geo']['city'];
	return $info;
}

var_dump(getcity('46.32.87.209'));

список всех параметров, json:

curl -H "User-Agent: keycdn-tools:http://46.32.87.209" "https://tools.keycdn.com/geo.json?host=46.32.87.209"

{"status":"success","description":"Data successfully received.","data":{"geo":{"host":"46.32.87.209","ip":"46.32.87.209","rdns":"46.32.87.209","asn":48416,"isp":"Information Network, LLC","country_name":"Russia","country_code":"RU","region_name":"St.-Petersburg","region_code":"SPE","city":"St Petersburg","postal_code":"190000","continent_name":"Europe","continent_code":"EU","latitude":59.8983,"longitude":30.2618,"metro_code":null,"timezone":"Europe\/Moscow","datetime":"2022-08-05 01:03:06"}}}

Авторы не написали информацию про лимиты в сутки и в месяц, возможно нет, что хочется надеяться.

Альтернатива:

https://geolocation-db.com/jsonp/46.32.87.209

или 50к в месяц https://ipinfo.io/pricing бесплатно.

ps.

function getcity2($ip) {  
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, "https://geolocation-db.com/json/{$ip}");
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36");
	curl_setopt($curl, CURLOPT_REFERER, "http://{$ip}");
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); 
	curl_setopt($curl, CURLOPT_TIMEOUT, 10);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	$resp = curl_exec($curl);  
	curl_close($curl);
	$json = json_decode($resp, true);
	$info = ['city'=>'', 'country'=>''];
	if (isset($json['country_name'])) 
		$info['country'] = $json['country_name'];
	if (isset($json['city'])) 
		$info['city'] = $json['city'];
	return $info;
}

var_dump(getcity2('46.32.87.209'));