Uzyskaj lokalizację kraju adresu IP za pomocą natywnego PHP

Czytaj dalej, zanim powiesz, że to duplikat, nie jest. (as far as I could see)

Chcę uzyskać kod w php od klienta.

Tak Wiem, że możesz to zrobić za pomocą zewnętrznych witryn lub za pomocą "geoip_record_by_name", ale nie chcę być zależny od zewnętrznej strony i nie mogę zainstalować "pear" dla php, ponieważ używam hostingu Shard Dreamhost.

Myślałem, że mogę zrobić coś takiego:

$output = shell_exec('whois '.$ip.' -H | grep country | awk \'{print $2}\'');
echo "<pre>$output</pre>";

Ale dreamhost wydaje się mieć stare wersja whois (4.7.5), więc dostaję ten błąd na allot of IPs:

Unknown AS number or IP network. Please upgrade this program.

Więc chyba, że ktoś wie, jak dostać binarny nowszej wersji whois na dreamhost im zatrzymany.

A może jest inny sposób na uzyskanie kodu kraju od klienta, który ładuje stronę?

Author: hakre, 2010-03-18

8 answers

Whois jest tylko klientem usługi whois, więc technicznie nadal polegasz na zewnętrznej stronie. W przypadku zapytań, które się nie powiodą, możesz spróbować wrócić do innej witryny dla zapytania, na przykład hostip.info, którzy akurat mają przyzwoite API i wydają się przyjaźni:

http://api.hostip.info/country.php?ip=4.2.2.2

Zwraca

US

Powodzenia,

--jed

EDIT: @ Mint Oto link do API na hostip.info: http://www.hostip.info/use.html

 27
Author: Jed Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-24 14:39:22

MaxMind zapewnia bezpłatną klasę PHP GeoIP country lookup (Istnieje również bezpłatna Klasa country+city lookup).

Bit, który chcesz, jest wymieniony w "Pure PHP module". Nie wymaga to instalowania czegokolwiek, ani uzależniania się od nich, ani nie wymaga zainstalowania żadnych specjalnych modułów PHP. Po prostu zapisz gdzieś plik danych GeoIP, a następnie użyj ich podanej klasy, aby z nim współdziałać.

 18
Author: Dal Hundal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 15:32:34

Czy możesz po prostu zainstalować kopię whois do katalogu domowego i przekazać pełną ścieżkę do shell_exec? W ten sposób nie jesteś związany z ich harmonogramem aktualizacji.

 2
Author: McJeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-18 08:01:59

Alternatywnym, nieco ekstremalnym rozwiązaniem Twojego problemu byłoby:

  1. Pobierz wersję bazy danych krajów MaxMind w formacie CSV
  2. Usuń informacje, których nie potrzebujesz z pliku CSV za pomocą skryptu i ...
  3. ... Wygeneruj standardowy plik PHP, który zawiera strukturę danych zawierającą adres IP jako klucz i kod kraju jako wartość.
  4. Dołącz plik wynikowy do zwykłych plików projektu, a teraz masz całkowicie wewnętrzny IP => tabela wyszukiwania kodu kraju.

Wadą jest to, że regularnie będziesz musiał regenerować plik PHP z najnowszej wersji bazy danych. Poza tym jest to dość paskudny sposób na robienie tego w ogóle i wydajność może nie być najlepsza:)

 2
Author: Shane Breatnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 23:26:40

Consider ipcountryphp (Moja strona, mój kod, mój honor) , ponieważ zapewnia lokalną bazę danych z dostępem do Internetu. Jest szybki i w pełni samodzielny, można go podłączyć do dowolnego PHP 5.3, SQLite3 i innych. Bardzo szybkie poszukiwania i brak kar za wykonanie.

dość bezwstydnej autopromocji, Bądźmy poważni:

Poleganie na odpytywaniu zdalnych usług w czasie rzeczywistym , aby uzyskać kraj odwiedzający może stać się głównym bottleneck dla funkcjonalności witryny w zależności od szybkości odpowiedzi zapytanego serwera. Z reguły nigdy nie powinieneś odpytywać zewnętrznych usług o funkcjonalność witryny w czasie rzeczywistym (jak ładowanie strony) . Korzystanie z interfejsów API w tle jest świetne, ale kiedy musisz sprawdzić kraj każdego odwiedzającego przed renderowaniem strony, otwierasz się na świat bólu. i pamiętaj, że nie tylko Ty nadużywasz darmowych usług :)

SO queries aby Usługi innych firm pozostały w tle, podczas gdy tylko funkcjonalność lokalna, która opiera się na braku innych firm, wchodzi w warstwy, z którymi użytkownicy wchodzą w interakcję. Po prostu moje lekko wyczynowe podejście do tego:)

PS: powyższy skrypt, który napisałem ma również obsługę IPv6.

 1
Author: CodeAngry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-09 05:26:17

Oto strona ze skryptem, którego właśnie użyłem. Jedynym problemem jest to, że prawdopodobnie od czasu do czasu będziesz musiał samodzielnie regenerować IPs... co może być bólem i powodem, dla którego wszyscy mówią ci, abyś używał zewnętrznego API. Ale dla mnie to nie było rozwiązanie, ponieważ ciągnąłem z 50 IP na raz, co oznacza, że prawdopodobnie zostanę zbanowany. Rozwiązaniem było użycie własnego skryptu lub zapisanie do DB, ale znowu ściągałem obrazy z zewnętrznych stron. W każdym razie tutaj jest strona znalazłem skrypt on:

Http://coding-talk.com/f29/country-flag-script-8882/

 0
Author: Goran Jakovljevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 12:20:29
 0
Author: Michael J. Calkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 00:21:15

Oto również jeden z nich. wystarczy zmienić IP na zmienną:
http://api.codehelper.io/ips/?callback=codehelper_ip_callback&ip=143.3.87.193

 0
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 18:11:52