Получить местоположение IP-адреса в стране с помощью собственного PHP

Прочтите, прежде чем сказать, что это дубликат, это не так. (насколько я мог видеть)

Я хочу получить код округа в php от клиента.

Да, я знаю, что вы можете сделать это, используя внешние сайты или с помощью подобных «geoip_record_by_name», но я не хочу зависеть от внешнего сайта, и я не могу установить «pear» для php, поскольку я использую шард Dreamhost хостинг.

Я думал, что могу просто сделать что-то вроде этого:

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

Но у Dreamhost, похоже, старая версия whois (4.7.5), поэтому я получаю эту ошибку при распределении IP-адресов:

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

Поэтому, если кто-то не знает, как получить двоичный файл более новой версии whois на Dreamhost, я застрял.

Или есть другой способ получить код страны от клиента, который загружает страницу?


person Mint    schedule 18.03.2010    source источник


Ответы (8)


Whois — это просто клиент для службы whois, поэтому технически вы все еще полагаетесь на внешний сайт. В случае неудачных запросов вы можете попробовать вернуться к другому сайту для запроса, например hostip.info, который имеет приличный API и кажется дружелюбным:

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

возвращается

US

Удачи,

--джед

РЕДАКТИРОВАТЬ: @Mint Вот ссылка на API на hostip.info: http://www.hostip.info/use.html

person Jed Daniels    schedule 23.03.2010
comment
Это возвращает мне Великобританию, независимо от IP-адреса, который я указал в конце. (я в Великобритании) - person Dal Hundal; 23.03.2010
comment
... URL-адрес, который вы указали, немного неверен, исправлено: api.hostip .info/country.php?ip=4.2.2.2 - person Dal Hundal; 23.03.2010
comment
@Mailslut Да, вы правы, извините за это, не знаю, как я это пропустил. Я поправил в посте. Привет, --джед - person Jed Daniels; 23.03.2010
comment
Я попробовал это с моим IP-адресом, и он возвращает xx для страны, и в свете вашей информации, что whois зависит от других серверов (о чем я знал, просто не осознавал этого в то время). Я думаю, я пойду с одним из API-интерфейсов онлайн-сайта (на днях я наткнулся на хороший, мне придется выследить его и опубликовать здесь, если никто не придумает лучшую идею:)) - person Mint; 24.03.2010
comment
@Jed - ссылка все еще немного неверна, вы пропустили «ip» между «?» и '='. т.е. country.php?ip=4.2.2.2 в отличие от country.php?=4.2.2.2 - person Dal Hundal; 24.03.2010
comment
@Mint, какой хороший веб-сайт API вы нашли? я также использовал api.hostip.info, но я получил много ответов XX для многих пользователей. - person eladyanai; 11.08.2012
comment
Я все еще с hostip, мое использование для этого не очень критично. - person Mint; 14.08.2012
comment
Этот веб-сайт возвращает неправильные результаты. Я пробовал IP-адрес VN, но он возвращает TW, IP-адрес США возвращает VN. - person sonnb; 21.08.2012
comment
@IvanKuckir Точность данных на hostip.info не всегда гарантируется. Однако вы можете зайти на сайт с помощью веб-браузера и ввести исправление вручную. - person Jed Daniels; 04.03.2014

MaxMind предоставляет бесплатный класс поиска страны PHP GeoIP (есть также бесплатный класс поиска страны+города) .

Бит, который вам нужен, - это то, что упоминается в разделе «Модуль Pure PHP». Это не требует от вас установки чего-либо или зависимости от них, а также не требует установки каких-либо специальных модулей PHP. Просто сохраните файл данных GeoIP где-нибудь, а затем используйте предоставленный им класс для взаимодействия с ним.

person Dal Hundal    schedule 18.03.2010

Можете ли вы просто установить копию whois в свой домашний каталог и передать полный путь в shell_exec? Таким образом, вы не привязаны к их графику обновления.

person McJeff    schedule 18.03.2010
comment
Я немного погуглил в поисках способа скомпилировать whois, но ничего не нашел. Я также не нашел предварительно скомпилированную версию, хотя, вероятно, это потому, что я гуглил с неправильными ключевыми словами, какие-либо предложения, где я могу найти исходный код или двоичный файл? - person Mint; 18.03.2010

Альтернативным, несколько экстремальным решением вашей проблемы было бы:

  1. Загрузите версию страновой базы данных MaxMind в формате CSV.
  2. Удалите ненужную информацию из CSV с помощью скрипта и...
  3. ... создать стандартный файл PHP, который содержит структуру данных, содержащую IP-адрес в качестве ключа и код страны в качестве значения.
  4. Включите полученный файл в свои обычные файлы проекта, и теперь у вас есть полностью внутренняя таблица поиска IP => кода страны.

Недостатком является то, что вам нужно будет регулярно регенерировать файл PHP из последней версии базы данных. Кроме того, это довольно неприятный способ сделать это в целом, и производительность может быть не самой лучшей :)

person Shane Breatnach    schedule 25.03.2010

Рассмотрим ipcountryphp (мой сайт, мой код, моя честь) поскольку он предоставляет локальную базу данных, постоянно обновляемую в Интернете. Он быстрый и полностью автономный, подключаемый к чему угодно PHP 5.3, SQLite3 и выше. Очень быстрый поиск и никаких потерь производительности.

Хватит бесстыдной саморекламы, давайте серьезно:

Запрос удаленных служб в режиме реального времени для получения страны посетителя может стать серьезным узким местом для функциональности вашего сайта в зависимости от скорости ответа запрашиваемого сервера. Как правило, никогда не следует запрашивать у внешних служб функции сайта в режиме реального времени (например, загрузку страницы). Использование API в фоновом режиме — это здорово, но когда вам нужно запросить страну каждого посетителя до того, как страница будет отображена, вы откроете для себя мир боли. И имейте в виду, что вы не единственный, кто злоупотребляет бесплатными услугами :)

Поэтому запросы к сторонним службам остаются в фоновом режиме, а на уровни, с которыми взаимодействуют пользователи, переходят только локальные функции, не зависящие от сторонних. Просто мой слегка параноидальный взгляд на это :)

PS: Сценарий, который я написал выше, также поддерживает IPv6.

person CodeAngry    schedule 09.04.2013
comment
Что случилось с сайтом? - person John Magnolia; 12.01.2016

Вот сайт со скриптом, который я только что использовал. Единственная проблема заключается в том, что вам, вероятно, время от времени нужно будет регенерировать IP-адреса самостоятельно ... что может быть болью и трудностями, почему все говорят вам использовать внешний API. Но для меня это не было решением, так как я вытягивал около 50 IP-адресов одновременно, а это означало, что меня, вероятно, забанят. Таким образом, решение состояло в том, чтобы использовать мой собственный скрипт или делать сохранения в БД, но я снова загружал изображения с внешних сайтов. Во всяком случае, вот сайт, на котором я нашел скрипт:

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

person Goran Jakovljevic    schedule 28.08.2012

Вот некоторые из них:

Все возвращают несколько разные результаты.

person Michael J. Calkins    schedule 20.08.2013

вот тоже один из них. просто измените IP-адрес на переменную:
http://api.codehelper.io/ips/?callback=codehelper_ip_callback&ip=143.3.87.193

person T.Todua    schedule 17.12.2013