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ę?
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
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ć.
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.
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:
- Pobierz wersję bazy danych krajów MaxMind w formacie CSV
- Usuń informacje, których nie potrzebujesz z pliku CSV za pomocą skryptu i ...
- ... Wygeneruj standardowy plik PHP, który zawiera strukturę danych zawierającą adres IP jako klucz i kod kraju jako wartość.
- 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:)
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.
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:
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
Oto kilka:
- http://api.hostip.info/get_html.php?ip=174.31.162.48&position=true
- http://geoiplookup.net/geoapi.php?output=json&ipaddress=174.31.162.48
- http://ip-api.com/json/174.31.162.48?callback=yourfunction
- http://ipinfo.io/174.31.162.48
Wszystkie zwracają nieco inne wyniki.
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
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