Release 1.1

При поддержке   

XML-сервис

Добавлено: Пятница, 13 Марта, 2009 16:07       Размещено в: Новости проекта

Убедительная просьба, если Вам надо прокачать большое количество адресов, просьба заключать их в один запрос (не более 4000 Ip в одном запросе). В скором времени будет выложен пример скрипта на perl для прокачки лога Apache.
Теперь мы подключили XML-сервис обработки запросов на определение местонахождения российских IP-адресов. Сервис обслуживается специальным сервером. Сервер получает запрос в формате XML через POST HTTP запрос, отдает ответ также в формате XML.

Сервер расположен по адресу 194.85.91.253, порт 8090, работает по протоколу HTTP. Метод GET сервером не поддерживается. Минимальный заголовок HTTP запроса выглядит следующим образом:

POST /geo/geo.html HTTP/1.1
Content-length: CL
,где CL - длина тела запроса

Формат тела запроса выглядит следующим образом:
<ipquery [id="123456"]>
<fields>
[<all/>]
[<inetnum/>]
[<inet-descr/>]
[<inet-status/>]
[<city/>]
[<region/>]
[<district/>]
[<lat/>]
[<lng/>]
</fields>
<ip-list>
<ip>62.5.128.0</ip>
<ip>144.206.192.23</ip>
….
<ip>85.44.33.22</ip>
</ip-list>
</ipquery>
,где id=”123456″ - необязательный параметр. Это идентификатор запроса, в кавычках - любые числа и буквы, ответ сервера будет содержать указанный вами id; тег <fields> содержит поля, которые вы хотите получить:
<inetnum/> - блок адресов, к которому относится искомый ip-адрес
<inet-descr/> - описание блока по базе RIPE (www.ripe.net)
<inet-status/> - статус блока по базе RIPE
<city/> - город, к которому относится искомый ip
<region/> - регион, к которому относится искомый ip
<district/> - федеральный округ РФ, к которому относится искомый ip
<lat/> - географическая широта города
<lng/> - географическая долгота города
<all/> - все вышеперечисленные поля
В теге <ip-list> содержится список ip, которые надо прокачать. Это может быть один ip, или несколько. Максимальное количество 4000 ip в одном запросе. Каждый ip обрамляется тегами <ip> и </ip>.
Формат ответа сервера:
<ip-answer id=”123456″>
<ip value=”62.5.128.0″>
<inetnum>62.5.128.0 - 62.5.128.15</inetnum>
<inet-descr>Subnetwork for VA159-RIPE</inet-descr>
<inet-status>ASSIGNED PA</inet-status>
<city>Москва</city>
<region>Москва</region>
<district>Центральный</district>
<lat>55.755787</lat>
<lng>37.617634</lng>
</ip>
….
</ip-answer>
По каждому адресу, мы получаем список полей, которые мы указали в <fields> в запросе. В вышеуказанном примере ответа в запросе был указан <all/>.
Для обращения к серверу с вашего сайта, можно использовать стандартную библиотеку HTTP (имеется практически во всех языках программирования). Подключаемся к 194.85.91.253:8090, отправляем POST запрос на /geo/geo.html, в котором содержится <ipquery>…</ipquery>. В скором времени будут выложены примеры на различных языках.

Для обращения к серверу через форму нужно вставить такой HTML код:

<form name = “index” action = “http://194.85.91.253:8090/geo/geo.html” method = “post”>
<textarea name=”address”></textarea>
<input type=”submit” value=”OK”>
</form>

Названия формы и поля <textarea> не важны. В поле textarea вставляется запрос в формате XML, указанный выше. Например:

150 комментариев на тему “XML-сервис”:

  1. 1
    sunswordrie ответил:

    Чет очень намудрили с запросом, нужно просто допустим через curl сделать запрос) и как это организовать в такой структуре?

  2. 2
    Администратор ответил:
    Чет очень намудрили с запросом, нужно просто допустим через curl сделать запрос) и как это организовать в такой структуре?

    Сервер расчитан на прокачку большого количества Ip-адресов, поэтому нецелесообразно передавать в URL по одному адресу. Если нужно смотреть по одному адресу, все равно придется отправлять POST-запрос. GET (передача ip в URL) не поддерживается.

  3. 3
    sunswordrie ответил:

    Насколько понимаю, код должен быть таким?

    $data = array(
    ‘address’ => ‘144.206.192.4′
    );

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, “http://194.85.91.253:8090/geo/geo.html”);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $xml = curl_exec($ch);
    curl_close($ch);

    echo $xml;

  4. 4
    sunswordrie ответил:

    п.с. вырезало все теги xml запроса, которые указаны в примере в textarea

  5. 5
    Администратор ответил:
    п.с. вырезало все теги xml запроса, которые указаны в примере в textarea

    Как это “вырезало”?

    Насколько понимаю, код должен быть таким?

    $data = array(
    ‘address’ => ‘144.206.192.4′
    );

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, “http://194.85.91.253:8090/geo/geo.html”);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $xml = curl_exec($ch);
    curl_close($ch);

    echo $xml;

    Вы не указали теги запроса. Должно быть что-то типа:
    < ?php
    $data = "<ipquery><fields><all/></fields><ip-list><ip>144.206.192.4</ip></ip-list></ipquery>”;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, “http://194.85.91.253:8090/geo/geo.html”);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $xml = curl_exec($ch);
    curl_close($ch);

    echo $xml;
    ?>

  6. 6
    sunswordrie ответил:

    Угу, спасибо.

  7. 7
    sunswordrie ответил:

    А можно эти данные возвращало тоже в xml формате, чтобы заюзать SimpleXMLElement на выходящую информацию и вообще всё было красиво?

  8. 8
    sunswordrie ответил:

    Код, который получился на данный момент, без xml:

    function getip($GetRIP)
    {
    $data = “”.$GetRIP.”";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, “http://194.85.91.253:8090/geo/geo.html”);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $xml = curl_exec($ch);
    curl_close($ch);

    //echo $xml;

    $district=”!(.*?)!si”;
    $region=”!(.*?)!si”;
    $town=”!(.*?)!si”;

    preg_match($district, $xml, $main_ar["district"]);
    preg_match($region, $xml, $main_ar["region"]);
    preg_match($town, $xml, $main_ar["city"]);

    return array(”DISTRICT”=>$main_ar["district"][1], “REGION”=>$main_ar["region"][1],”TOWN”=>$main_ar["city"][1]);

    }
    echo “”; print_r(getip($_SERVER["REMOTE_ADDR"])); echo “”;

  9. 9
    sunswordrie ответил:

    Жалко не запостить, вырезает теги удалите пожалуйста это и верхнее сообщение.

  10. 10
    redline ответил:

    “А какие ограничения на количество запросов с одного IP и в каком временном интервале?” (c) Максим Месилов

  11. 11
    Администратор ответил:
    “А какие ограничения на количество запросов с одного IP и в каком временном интервале?” (c) Максим Месилов

    Пока никаких ограничений, пользуйтесь на здоровье сколько угодно :)

  12. 12
    Администратор ответил:
    Жалко не запостить, вырезает теги удалите пожалуйста это и верхнее сообщение.

    Не ясна проблема, опишите поподробнее что и где вырезает

  13. 13
    Администратор ответил:
    А можно эти данные возвращало тоже в xml формате, чтобы заюзать SimpleXMLElement на выходящую информацию и вообще всё было красиво?

    Я вас немного недопонимаю. Все данные забираются и отдаются в XML формате

  14. 14
    Администратор ответил:
    Код, который получился на данный момент, без xml:

    function getip($GetRIP)
    {
    $data = “”.$GetRIP.””;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, “http://194.85.91.253:8090/geo/geo.html”);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $xml = curl_exec($ch);
    curl_close($ch);

    //echo $xml;

    $district=”!(.*?)!si”;
    $region=”!(.*?)!si”;
    $town=”!(.*?)!si”;

    preg_match($district, $xml, $main_ar["district"]);
    preg_match($region, $xml, $main_ar["region"]);
    preg_match($town, $xml, $main_ar["city"]);

    return array(”DISTRICT”=>$main_ar["district"][1], “REGION”=>$main_ar["region"][1],”TOWN”=>$main_ar["city"][1]);

    }
    echo “”; print_r(getip($_SERVER["REMOTE_ADDR"])); echo “”;

    Зачем все так усложнять. Ответ сервера специально сделан в XML, чтобы было легко парсить ответ. Вот пример на PERL для прокачки IP:

    #!/usr/bin/perl

    use LWP::UserAgent;

    my $ua = LWP::UserAgent->new;
    my $xml_query = “<ipquery><fields><all/></fields><ip-list><ip>144.206.192.4</ip><ip>81.176.209.240</ip></ip-list></ipquery>”;
    my $response = $ua->post(’http://194.85.91.253:8090/geo/geo.html’,Content => $xml_query);

    if ($response->is_success) {
    print $response->content; #Эта строка контента, из нее можно парсить необходимую информацию.
    }
    else {
    die $response->status_line;
    }

  15. 15
    Leonid ответил:

    спасибо за сервис!
    Вот только что-то ваша собственная форма не работает - выдаёт incorrect request :)

  16. 16
    Администратор ответил:
    спасибо за сервис!
    Вот только что-то ваша собственная форма не работает - выдаёт incorrect request :)

    Сервис находится в стадии тестирования, поэтому баги возможны. Какой именно запрос у Вас не работает? Напишите его пожалуйста в коментарии

  17. 17
    Андрей ответил:

    Какой код на PHP нужно поставить, что-то не работаю выше описаные

  18. 18
    Администратор ответил:
    Какой код на PHP нужно поставить, что-то не работаю выше описаные

    Граждане программисты на PHP!!! Выкладывайте свои рабочие варианты скриптов-клиентов нашего сервера

  19. 19
    Laney ответил:

    Задача - определение города посетителя сайта. 1 запрос - 1 IP.
    По хорошему, массив результирующий сделать двумерным, первый ключ - ip (именно тот, что передается в функцию в качестве параметра), второй - параметр из инфы об IP (аля город, страна, etc).

    <?php
    function get_ip_info($ip)
    {
    $xml_encoding = ‘windows-1251′;
    $in_charset = ‘UTF-8′;
    $out_charset = ‘windows-1251′;

    $GeoIP = array();

    $xml_query = ” . $ip . ”;
    $xml_response = ”;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, ‘http://194.85.91.253:8090/geo/geo.html’);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_query);

    $xml_response .= curl_exec($ch);
    curl_close($ch);

    $xml = new SimpleXMLElement($xml_response);

    $GeoIP = array(
    ‘inetnum’ => ln_str_encode($xml->ip->inetnum, $in_charset, $out_charset),
    ‘inet-descr’ => ln_str_encode($xml->ip->inet-descr, $in_charset, $out_charset),
    ‘inet-status’ => ln_str_encode($xml->ip->inet-status, $in_charset, $out_charset),
    ‘city’ => ln_str_encode($xml->ip->city, $in_charset, $out_charset),
    ‘region’ => ln_str_encode($xml->ip->region, $in_charset, $out_charset),
    ‘district’ => ln_str_encode($xml->ip->district, $in_charset, $out_charset),
    ‘lat’ => ln_str_encode($xml->ip->lat, $in_charset, $out_charset),
    ‘lng’ => ln_str_encode($xml->ip->lng, $in_charset, $out_charset),
    );

    return $GeoIP;

    }

    /**
    * Convert string to requested character encoding.
    * This function performs a character set conversion on the string str from in_charset to out_charset.
    *
    * @param string $str
    * @param string $in_charset
    * @param string $out_charset
    * @return string|false results of {@link _read_cache_file()}
    */
    function ln_str_encode($str, $in_charset, $out_charset)
    {

    if (function_exists(’mb_convert_encoding’))
    {
    return mb_convert_encoding($str, $out_charset, $in_charset);
    }
    else
    {
    return iconv($in_charset, $out_charset, $str);
    }

    }

    $ip_info = get_ip_info($_SERVER['REMOTE_ADDR']);

    /*
    foreach ($ip_info as $key => $val)
    {
    echo $key . ‘: ‘ . $val . ”;
    }
    */

    echo ‘Город: ‘ . $ip_info['city'] . ”;
    echo ‘Регион: ‘ . $ip_info['region'] . ”;
    echo ‘Округ: ‘ . $ip_info['district'] . ”;

    ?>

  20. 20
    Leonid ответил:

    >>> Какой именно запрос у Вас не работает? Напишите его пожалуйста в коментарии

    Всё очень просто :) Решил попробовать Вашу же форму (она приведена в конце поста). ИП указал одного из гугловских серверов. Жму ‘Ок’ - ошибка

  21. 21
    Администратор ответил:
    >>> Какой именно запрос у Вас не работает? Напишите его пожалуйста в коментарии

    Всё очень просто :) Решил попробовать Вашу же форму (она приведена в конце поста). ИП указал одного из гугловских серверов. Жму ‘Ок’ - ошибка

    Все работает. Возможно вы забыли обрамить запрос каким-либо из обязательных XML тегов. Помимо искомых ip (их надо обрамлять тегами <ip> и </ip>, например <ip>1.2.3.4</ip>) в форму надо вбить теги <ip-list>, <fields>, <ipquery>. Формат подробно описан в посте! Если в форму ввести только ip без XML тегов, сервер выдаст ошибку “incorrect request”.

  22. 22
    Leo ответил:

    Может быть, как необязательное поле/атрибут добавить кодировку?

  23. 23
    Администратор ответил:
    Может быть, как необязательное поле/атрибут добавить кодировку?

    Хорошее предложение, возможно в скором мы реализуем данную функцию. Пока сервер отдает ответ только в windows-1251

  24. 24
    Jozzyk ответил:

    Ктонибудь проверял код Laney ? Я плохо в php шарю и у меня ничего не выходит :-(

  25. 25
    redline ответил:

    Как вариант, но советую почитать комменты и добавить необходимое, в часности кеширование по IP и установки CURLOPT_CONNECTTIMEOUT.

    п.с. Данный сервис просто отличный, тем кто не юзает хеш бан надо замутить, чтобы с одним и тем же запросом в день по 20 раз не обращались. Он всё равно не изменится, а точнее вероятность этого крайне мала.

    Сам вариант кода: http://sunswordred.habrahabr.ru/blog/54728/.

  26. 26
    Сергей ответил:

    RE: Ктонибудь проверял код Laney ? Я плохо в php шарю и у меня ничего не выходит :-(

    Проверил, работает.
    Значения переменных
    $xml_query и $xml_response укажите.

  27. 27
    Администратор ответил:
    Как вариант, но советую почитать комменты и добавить необходимое, в часности кеширование по IP и установки CURLOPT_CONNECTTIMEOUT.

    п.с. Данный сервис просто отличный, тем кто не юзает хеш бан надо замутить, чтобы с одним и тем же запросом в день по 20 раз не обращались. Он всё равно не изменится, а точнее вероятность этого крайне мала.

    Сам вариант кода: http://sunswordred.habrahabr.ru/blog/54728/.

    Если бы по 20 раз… по 20000 раз обращаются :) сейчас вроде бы поубавили пыл.
    Спасибо Вам за отзыв, будем работать над улучшением сервиса!

  28. 28
    Jozzyk ответил:

    вопщем я так и не разобрался как их xml ответа вычленить нужную информацию… сделал по топорному. (мне нужны были только город и регион)

    <?php
    $ip=$_SERVER['REMOTE_ADDR'];
    $ip_len=strlen($ip);
    function get_city($ip)
    {
    $xml_encoding = ‘windows-1251′;
    $in_charset = ‘UTF-8′;
    $out_charset = ‘windows-1251′;
    $xml_query = “”.$ip.”";
    $xml_response = “”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ‘http://194.85.91.253:8090/geo/geo.html’);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_query);
    $xml_response .= curl_exec($ch);
    curl_close($ch);
    return $xml_response;;
    }

    function get_region($ip)
    {
    $xml_encoding = ‘windows-1251′;
    $in_charset = ‘UTF-8′;
    $out_charset = ‘windows-1251′;
    $xml_query = “”.$ip.”";
    $xml_response = “”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ‘http://194.85.91.253:8090/geo/geo.html’);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_query);
    $xml_response .= curl_exec($ch);
    curl_close($ch);
    return $xml_response;;
    }

    function ln_str_encode($str, $in_charset, $out_charset)
    {

    if (function_exists(’mb_convert_encoding’))
    {
    return mb_convert_encoding($str, $out_charset, $in_charset);
    }
    else
    {
    return iconv($in_charset, $out_charset, $str);
    }

    }

    $city=get_city($ip);
    $minus=$ip_len+102;
    $length=strlen($city)-$minus;
    $start=$ip_len+76;
    $city=iconv_substr ($city, $start , $length);

    $region=get_region($ip);
    $minus=$ip_len+106;
    $length=strlen($region)-$minus;
    $start=$ip_len+78;
    $region=iconv_substr ($region, $start , $length);
    ?>

    на выходе: город - $city, регион - $region.

  29. 29
    Администратор ответил:
    вопщем я так и не разобрался как их xml ответа вычленить нужную информацию… сделал по топорному. (мне нужны были только город и регион)

    Для того чтобы получать только город и регион, запрос должен выглядеть следующим образом:
    <ipquery>
    <fields>
    <city/>
    <region/>
    </fields>
    <ip-list>
    <ip>1.2.3.4</ip>
    <ip>5.6.7.8</ip>
    ….
    <ip>9.10.11.12</ip>
    </ip-list>

  30. 30
    Scorpio ответил:

    2Администратор:

    Спасибо огромное за сервис! Бесценная информация для анализа аудитории сайта по регионам.
    Однако не помешалобы в ответе вашего шлюза еще один параметр - название провайдера (ISP)
    как например выводится в ответе на запрос http://www.vline.ru/ip/?ip=x.x.x.x
    (поля netname и desc или хотябы только netname)

    Есть ли подобная информация в Вашей базе?
    Если да, то сможете ли Вы ее возвражать в ответе на запрос?
    Не планируете ли Вы создать HTTP-GET запрос по единственному IP по образцу приведенному мной выше? например чтото вроде http://194.85.91.253:8090/?ip=x.x.x.x
    Планируете ли Вы ввести ограничение на кол-во запрос с одного IP за единицу времени?
    Если да, то какой лимит будет установлен?

  31. 31
    Администратор ответил:
    2Администратор:

    Спасибо огромное за сервис! Бесценная информация для анализа аудитории сайта по регионам.
    Однако не помешалобы в ответе вашего шлюза еще один параметр - название провайдера (ISP)
    как например выводится в ответе на запрос http://www.vline.ru/ip/?ip=x.x.x.x
    (поля netname и desc или хотябы только netname)

    Есть ли подобная информация в Вашей базе?
    Если да, то сможете ли Вы ее возвражать в ответе на запрос?
    Не планируете ли Вы создать HTTP-GET запрос по единственному IP по образцу приведенному мной выше? например чтото вроде http://194.85.91.253:8090/?ip=x.x.x.x
    Планируете ли Вы ввести ограничение на кол-во запрос с одного IP за единицу времени?
    Если да, то какой лимит будет установлен?

    Вам спасибо за отзыв :)
    Поле netname не доступно, однако если в запросе указать тег <inet-descr/>, то сервер отдаст описание блока.
    Запрос GET не будет поддерживаться, т.к. сервис изначально задумывался для прокачивания большого количества адресов.
    пока сервис находится в тестовом режиме и ограничений не будет. Однако, если сервер будут спамить одним и тем же запросом, то адрес такого клиента будет забанен.

  32. 32
    Scorpio ответил:

    1) Насчет GET запроса - очень жаль ибо в 99% случаев передача 1-го адреса достаточно, что позволило бы упростить как клиентскую часть, так и парсер на вашей серверной стороне. Дополнительные атрабуты типа того же inet-descr тоже можно былоб передать в хвосте GET-запроса.
    Другими словами я предлагаю вовсе не отказ от использования POST запроса, а дополнительный GET-запрос в тех случаях когда нужно запросить всего 1 IP.

    2) Бан по IP в наше время уже неэффективен ибо региональные ISP раздают статику за дополнительную плату ежемесячно да и для сайтов все чаще используется DDNS. Банить же целыми диапазонами IP-адресов несправедливо по отношению к непровинившимся пользователям вашего сервиса. Самое эффективное средство в данном случае - ограничение колва запросов с одного IP в минуту.

    PS Лавинообразный рост интереса к вашему сервису думаю неизбежен и оба моих пожелания думаю помогли бы вам избежать проблем с нагрузкой на сервис в будущем. А мне как клиенту нехотелось бы потерять к нему доступ по причине чьихто злоупотреблений.

  33. 33
    Администратор ответил:
    1) Насчет GET запроса - очень жаль ибо в 99% случаев передача 1-го адреса достаточно, что позволило бы упростить как клиентскую часть, так и парсер на вашей серверной стороне. Дополнительные атрабуты типа того же inet-descr тоже можно былоб передать в хвосте GET-запроса.
    Другими словами я предлагаю вовсе не отказ от использования POST запроса, а дополнительный GET-запрос в тех случаях когда нужно запросить всего 1 IP.

    2) Бан по IP в наше время уже неэффективен ибо региональные ISP раздают статику за дополнительную плату ежемесячно да и для сайтов все чаще используется DDNS. Банить же целыми диапазонами IP-адресов несправедливо по отношению к непровинившимся пользователям вашего сервиса. Самое эффективное средство в данном случае - ограничение колва запросов с одного IP в минуту.

    PS Лавинообразный рост интереса к вашему сервису думаю неизбежен и оба моих пожелания думаю помогли бы вам избежать проблем с нагрузкой на сервис в будущем. А мне как клиенту нехотелось бы потерять к нему доступ по причине чьихто злоупотреблений.

    Cервер работает на достаточно шустрых алгоритмах и может искать адреса со скоростью 6000-8000 IP в секунду для каждого подключившегося клиента. Он изначально расчитывался для прокачки больших логов. Поэтому GET сводит на нет все достоинства данного сервера.
    Еще раз повторюсь, что он работает в тестовом режиме и в случае лавинообразного роста клиентов мы введем ограничение на кол-во запросов с одного IP-в минуту. Однако в случае с POST-запросом это не доставит неудобств для клиентов. Даже если ограничение будет один запрос в минуту, клиент сможет закешировать всех посетителей своего сайта за эту минуту, а потом отправить нам сразу несколько адресов в одном запросе. В случае с GET ограничение количества запросов с одного IP доставит массу неудобств.

  34. 34
    Rascal ответил:

    Очень полезный сервис, который, в отличение от MaxMind GeoIP знает о географии России.
    Внутри тега встречаются символы недопустимые по стандартам xml, может стоит для него добавить ?

  35. 35
    Rascal ответил:

    Внутри тега <inet-descr> встречаются символы недопустимые по стандартам xml, может стоит для него добавить <![CDATA[]]>. Не знал что теги вырезаются.

  36. 36
    Администратор ответил:
    Очень полезный сервис, который, в отличение от MaxMind GeoIP знает о географии России.
    Внутри тега встречаются символы недопустимые по стандартам xml, может стоит для него добавить ?

    Спасибо за отзыв :)

    Внутри тега встречаются символы недопустимые по стандартам xml, может стоит для него добавить < ![CDATA[]]>. Не знал что теги вырезаются.

    Какие, например, символы встречаются? Что значит вырезаются теги, опишите подробнее проблему.

  37. 37
    Rascal ответил:

    Вырезались теги внутри моего первого сообщения %)
    Насчет {inet-descr}:
    & - не валидный символ внутри нода, но довольно часто встречается.

  38. 38
    Администратор ответил:
    Вырезались теги внутри моего первого сообщения %)
    Насчет {inet-descr}:
    & - не валидный символ внутри нода, но довольно часто встречается.

    Ясно) Просто в теге inet-descr администраторы блоков ip-адресов указывают все что угодно

  39. 39
    Scorpio ответил:

    Очевидный, но недостаточно освещенный в “шапке” вопрос:

    Какова зона охвата вашей базы?

    Только Россия? Вся или частично? Планируется ли расширение базы?

  40. 40
    Администратор ответил:
    Очевидный, но недостаточно освещенный в “шапке” вопрос:

    Какова зона охвата вашей базы?

    Только Россия? Вся или частично? Планируется ли расширение базы?

    На главной странице написано: “Поиск географического местонахождения IP-адреса, выделенного RIPE локальным интернет-реестрам (LIR-ам) для Российской Федерации”.

  41. 41
    Rascal ответил:

    Заметил что некоторые адреса находятся на главной, но не находятся через xml-сервис, например 195.2.233.251.

    Главная:
    Город Отрадное
    Регион Ленинградская область

    XML-сервис:
    Not found

  42. 42
    Администратор ответил:
    Заметил что некоторые адреса находятся на главной, но не находятся через xml-сервис, например 195.2.233.251.

    Главная:
    Город Отрадное
    Регион Ленинградская область

    XML-сервис:
    Not found

    Это ошибка, уже исправлено. Завтра информация обновится. Спасибо за замечание

  43. 43
    Артем ответил:

    Здравствуйте!
    Заметил, что при отправке в запросе (пробел внутри тега) вместо (без пробела внтури тега) сервер не возвращает ни одного поля. Видимо вам нужно поправить парсер. Ведь это тоже well-formed XML.

  44. 44
    Артем ответил:

    В предыдущем посте я имел в виду теги <all /> (с пробелом) и <all/> (без пробела)

  45. 45
    Roman ответил:

    Спасибо за хороши сервис!
    Есть несколько замечаний, надеюсь они помогут улучшить работу сервиса:
    1. Сервис не возвращает информацию по IP если поставить пробел в опциях fields, например если указать вместо , хотя для xml это не является ошибкой
    2. В тексте присутствуют недопустимые для xml символы, например амперсент (R&D), если пользоваться стандартными парсерами, то они выдают ошибку при разборе этих тегов, желательно было бы указывать спец код этих символов (R&D)
    3. Ну и не замечание, а скорее пожелание, использовать кодировку UTF-8 все таки для xml она более стандартная, и поддерживается на разных платформах

  46. 46
    Alex ответил:

    Разместил вашу форму на http://kachay.ucoz.org/ip_geo.htm
    что -то не работает?

  47. 47
    Alex ответил:

    вопрос снят - кавычки ваши скопировал неправильные

  48. 48
    Администратор ответил:
    Здравствуйте!
    Заметил, что при отправке в запросе (пробел внутри тега) вместо (без пробела внтури тега) сервер не возвращает ни одного поля. Видимо вам нужно поправить парсер. Ведь это тоже well-formed XML.
    В предыдущем посте я имел в виду теги <all /> (с пробелом) и <all/> (без пробела)

    Исправили, спасибо за замечание!

  49. 49
    Администратор ответил:
    Спасибо за хороши сервис!
    Есть несколько замечаний, надеюсь они помогут улучшить работу сервиса:
    1. Сервис не возвращает информацию по IP если поставить пробел в опциях fields, например если указать вместо , хотя для xml это не является ошибкой
    2. В тексте присутствуют недопустимые для xml символы, например амперсент (R&D), если пользоваться стандартными парсерами, то они выдают ошибку при разборе этих тегов, желательно было бы указывать спец код этих символов (R&D)
    3. Ну и не замечание, а скорее пожелание, использовать кодировку UTF-8 все таки для xml она более стандартная, и поддерживается на разных платформах

    Спасибо за замечание, исправили недочет с пробелом и недопустимыми символами. Насчет кодировки - появится возможность выбирать кодировку в ближайшем будущем

  50. 50
    Сергей ответил:

    Вот 100% рабочий код на php, который по IP выдает только название города
    <?
    function getip($GetRIP)
    {
    $data = $GetRIP;

    $url = “http://194.85.91.253:8090/geo/geo.html”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
    curl_setopt($ch, CURLOPT_POST, 1); // set POST method
    curl_setopt($ch, CURLOPT_POSTFIELDS, “$GetRIP”); // add POST fields
    $result = curl_exec($ch); // run the whole process
    curl_close($ch);
    //echo $result;

    preg_match(”/(.*)/is”, $result, $tmp);

    $city=$tmp[1];

    return $city;

    }

    $my_ip=$_SERVER["REMOTE_ADDR"];
    echo $my_ip.”";

    echo getip($my_ip);

    ?>

  51. 51
    Serg ответил:

    А рабочий пример на perl можно опубликовать?
    Пример от Админа что-то вылетает с Connection timed out.

  52. 52
    Serg ответил:

    Косяк хостера - все работает.
    Спасибо за сервис

  53. 53
    Администратор ответил:
    А рабочий пример на perl можно опубликовать?
    Пример от Админа что-то вылетает с Connection timed out.

    Странно. У меня все работает. Возможно у Вас другая версия perl либо модуля LWP::UserAgent

  54. 54
    Alexander ответил:

    <ipquery><fields><all/></fields><ip-list><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip></ip-list></ipquery>

    Ответ сервера продублирует данный адрес 4 раза.

  55. 55
    Артем ответил:

    При запросе на сервер получаю в ответ:
    500 Server closed connection without sending any data back
    Что бы это значило?

  56. 56
    Администратор ответил:
    <ipquery><fields><all/></fields><ip-list><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip><ip>194.8.84.1</ip></ip-list></ipquery>

    Ответ сервера продублирует данный адрес 4 раза.

    Логично, ведь запрос тоже дублирует 4 раза.

    При запросе на сервер получаю в ответ:
    500 Server closed connection without sending any data back
    Что бы это значило?

    Опишите проблему поподробнее. С какого ip адреса делался зарос, когда, сколько ip примерно было в одном запросе.

  57. 57
    Артем ответил:

    Запрос делался с адреса 77.66.200.177, в запросах было до 3000 адресов. При снижении числа адресов до 50-100 всё отлично

  58. 58
    Администратор ответил:
    Запрос делался с адреса 77.66.200.177, в запросах было до 3000 адресов. При снижении числа адресов до 50-100 всё отлично

    Попробуйте указать в HTTP-загоровке запроса Connection: keep-alive

  59. 59
    phphel ответил:

    function checkip_sites($ip)
    {
    $data=”<<<XML $ip XML’”;
    $ch=curl_init(’http://194.85.91.253:8090/geo/geo.html’);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    $s=curl_exec($ch);
    curl_close($ch);
    if (stristr(trim($s),”Not found”)) {
    exit( “ip $ip не найден в базе \n”);
    }
    $s=simplexml_load_string($s);
    print

    диаппазон: ‘.$s->ip->inetnum.’

    описание: ‘.$s->ip->{’inet-descr’}.’

    город: ‘.$s->ip->city.’

    регион: ‘.$s->ip->region.’

    округ: ‘.$s->ip->district.’

    широта: ‘.$s->ip->lat.’

    долгота: ‘.$s->ip->lng.’
    ‘;
    }

    на php, попробовал взяв за основу один сниппетс, укажите если есть где ошибки

  60. 60
    bezhenez ответил:

    $data = “”.$_SERVER["REMOTE_ADDR"].”";
    $url = “http://194.85.91.253:8090/geo/geo.html”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
    curl_setopt($ch, CURLOPT_POST, 1); // set POST method
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // add POST fields
    $result = curl_exec($ch); // run the whole process
    curl_close($ch);

    возвращает пустоту((( хотя до майских выходных возвращал верно

  61. 61
    bezhenez ответил:

    поправка

    $data = ” “.$_SERVER["REMOTE_ADDR"].”";

  62. 62
    Jozzyk ответил:

    чтото изменили в сервисе штоли? вчера (14мая) примерно с обеда у меня сервис перестал работать :-(

  63. 63
    Роман ответил:

    Администрация, почему изменяется код?
    Функция выводит город в обход прокси-сервера. Ещё одно условие, функция работает на сессиях, чтобы сократить постоянные запросы к серверу (в ихбежание бана) и ускорить выполнение скрипта.
    http://img33.imageshack.us/img33/5683/51773719.jpg

  64. 64
    Роман ответил:

    Функция выводит город в обход прокси-сервера. Ещё одно условие, функция работает на сессиях, чтобы сократить постоянные запросы к серверу (в ихбежание бана) и ускорить выполнение скрипта.

    http://teams7.narod.ru/geoip.zip

    п.с. извиняюсь за предыдущие ответы :)

  65. 65
    Администратор ответил:
    чтото изменили в сервисе штоли? вчера (14мая) примерно с обеда у меня сервис перестал работать

    Вчера были технические проблемы на хостинге, весь проект лежал. Сейчас все поправили.

  66. 66
    Администратор ответил:
    Администрация, почему изменяется код?
    Функция выводит город в обход прокси-сервера. Ещё одно условие, функция работает на сессиях, чтобы сократить постоянные запросы к серверу (в ихбежание бана) и ускорить выполнение скрипта.
    http://img33.imageshack.us/img33/5683/51773719.jpg

    Теги в коментах вырезаются из соображений безопасности. Спасибо за ваш пример.

  67. 67
    Администратор ответил:
    $data = “”.$_SERVER["REMOTE_ADDR"].””;
    $url = “http://194.85.91.253:8090/geo/geo.html”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
    curl_setopt($ch, CURLOPT_POST, 1); // set POST method
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // add POST fields
    $result = curl_exec($ch); // run the whole process
    curl_close($ch);

    возвращает пустоту((( хотя до майских выходных возвращал верно

    Вчера были течнические проблемы на хостинге, поэтому сервис не работал.

  68. 68
    Администратор ответил:

    phphel, спасибо за Ваш пример.

  69. 69
    Роман ответил:

    Уважаемая Администрация. Исходя исходя из моего примера с сессиями ( http://teams7.narod.ru/geoip.zip ), как быть с ботами, ведь они не принимают куки т.е. будут идти постоянные запросы на сервер и явно что их частота будет более 2 раз за секунду. Так как быть?

  70. 70
    Администратор ответил:
    Уважаемая Администрация. Исходя исходя из моего примера с сессиями ( http://teams7.narod.ru/geoip.zip ), как быть с ботами, ведь они не принимают куки т.е. будут идти постоянные запросы на сервер и явно что их частота будет более 2 раз за секунду. Так как быть?

    А Вы просто кешируйте адреса всех посетителей (и ботов и не ботов), а потом отправляйте нам в одном запросе, скажем каждые 3000 адресов. И все, никаких проблем.

  71. 71
    Андрей ответил:

    В каком смысле кешируйте? зашел посетитель на сайт и ему сразу же нужно показать информацию, относящуюся к его городу. Т.е. прям на первой странице. И он не будет ждать, пока в кэше накопится 3000 адресов. какой смысл в этом кэше? или как им пользоваться?
    и почему в последнее время стала появляться ошибка: Warning: fsockopen() [function.fsockopen]: unable to connect to 194.85.91.253:8090???
    и еще такой вопрос - в самом начал вы писали про бан диапазонов ip-адресов. как узнать, какие адреса там находятся?

  72. 72
    Администратор ответил:
    В каком смысле кешируйте? зашел посетитель на сайт и ему сразу же нужно показать информацию, относящуюся к его городу. Т.е. прям на первой странице. И он не будет ждать, пока в кэше накопится 3000 адресов. какой смысл в этом кэше? или как им пользоваться?
    и почему в последнее время стала появляться ошибка: Warning: fsockopen() [function.fsockopen]: unable to connect to 194.85.91.253:8090???
    и еще такой вопрос - в самом начал вы писали про бан диапазонов ip-адресов. как узнать, какие адреса там находятся?

    В вашем случае кэширование не нужно. Смысл в кеше - если вы собираете гео-статистику для своих нужд. Для онлайн показа нет другого выхода, кроме как обращаться к сервису по одному запросу. Пока бана нет. В какое время и какого числа возникла эта ошибка?

  73. 73
    Павел ответил:

    «Для онлайн показа нет другого выхода, кроме как обращаться к сервису по одному запросу.»

    Но в этом случае надо сохранять полученные данные в сессию или лучше в БД, чтобы пока юзер ходит по сайту не долбить сервер одинаковыми запросами…

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

  74. 74
    Администратор ответил:
    «Для онлайн показа нет другого выхода, кроме как обращаться к сервису по одному запросу.»

    Но в этом случае надо сохранять полученные данные в сессию или лучше в БД, чтобы пока юзер ходит по сайту не долбить сервер одинаковыми запросами…

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

    Мы рассмотрим ваше предложение. По какому стандарту Вы предлагаете показывать двухцифровой код?

  75. 75
    Павел ответил:

    Коды, которые используются в автомобильных номерах, ИНН и др. - на основе алфавитного порядка регионов в Конституции. http://ru.wikipedia.org/wiki/Коды_регионов п.3.1, только первые числа.

  76. 76
    Андрей ответил:

    Подскажите пожалуйста как можно получить весь список городов и регионов которые можно определить при помощи вашего XML-сервиса? Очень важно их получить. Заранее спасибо.

  77. 77
    Администратор ответил:
    Коды, которые используются в автомобильных номерах, ИНН и др. - на основе алфавитного порядка регионов в Конституции. http://ru.wikipedia.org/wiki/Коды_регионов п.3.1, только первые числа.

    Ясно, мы обязательно подумаем над Вашим предложением

  78. 78
    Администратор ответил:
    Подскажите пожалуйста как можно получить весь список городов и регионов которые можно определить при помощи вашего XML-сервиса? Очень важно их получить. Заранее спасибо.

    Пока никак. Единственный способ, скачать базу http://ipgeobase.ru/files/db/Main/db_files.tar.gz и ,пропарсив ее, выделить список всех городов и регионов.

  79. 79
    Roman ответил:

    Вот обновлённая версия скрипта на PHP. Добавлена функция определения, является ли клиент “ботом” или браузером. Это так сказать оптимизация скрипта, если боты заходят на сайт, чтобы попусту не долбить сервер IPGEOBASE одними и теми же запросами.
    скачать скрипт можно отсюда - http://teams7.narod.ru/geo.zip

  80. 80
    Александр ответил:

    Написал класс для получения данных с XML-сервиса. Класс имеет следующие возможности:
    - выбор данных, которые нужно получить;
    - принимает IP-адреса из строки или массива;
    - использует все возможности сервиса и легко расширяется;
    - конвертирование кодировки (windows-1251, koi8-r, utf-8);
    - проверка IP на корректность до запроса и варианты завершить работу или игнорировать;
    - возвращает данные в массиве или в XML;
    - проверяет используется ли proxy-сервер если данные нужно получить об IP с которого зашел посетитель;
    - настраивается максимальное кол-во IP-адресов, которое нужно проверить (по умолчанию 4000)

    В архиве две версии обычная (geo_ip.class.inc) и облегченная (geo_ip_light.class.inc). В облегченной нет проверки IP, нет конвертирования кодировки, нет проверки на proxy, в качестве IP может принимать массив IP и строку из одного IP-адреса и еще некоторых настроек нет.

    Ссылка для скачивания: http://narod.ru/disk/11507102000/geo_ip_class_v.0.92b.rar.html

  81. 81
    Макс ответил:

    Спасибо! Замечательный сервис!
    Ждем с нетерпением возможности смены кодировки на utf-8

  82. 82
    С.Тарасов ответил:

    Во-первых спасибо за возможность пользоваться вашей базой.

    Во-вторых подскажите пожалуйста, если у меня реализована схема при которой по ip каждого нового посетителя первоначально запрашивается информация с вашего сервера и вносится в собственную аналогичную базу, для того чтобы в последующем брать эту инф. из собственной бд. - правильна ли это или в дальнейшем собственная бд будет выдавать не верную информацию. Т.е. может ли происходить такая ситуация когда одному и томуже ip в разное время будет принадлежать разная гео.информация?

  83. 83
    Egor N Zuskin ответил:

    Класс на php для использования IPGeo в своих скриптах
    http://www.it2k.ru/projects/class-ipgeo/

  84. 84
    Nick ответил:

    Делаю запрос через jQuery ajax:
    function GetCurrentRegion(ip)
    {
    var xmlDocument = createXMLDocument(’81.176.18.63′);
    alert(xmlDocument);
    $j.ajax({
    url: “http://194.85.91.253:8090/geo/geo.html”,
    type: “POST”,
    processData: false,
    data: xmlDocument,
    dataType: “xml”,
    success: function(xml){
    var region = $j(xml).find(’region’).text();
    alert(’ip detecting - ‘+ region);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
    alert(tesxtStatus);
    }
    })
    }
    //——————————————-
    function createXMLDocument(xml)
    {
    if( window.ActiveXObject && window.GetObject ) {
    var dom = new ActiveXObject( ‘Microsoft.XMLDOM’ );
    dom.loadXML( xml );
    return dom;
    }
    if( window.DOMParser )
    return new DOMParser().parseFromString( xml, ‘text/xml’ );
    }

    при вызове функции GetCurrentRegion из IE отрабатывает корректно, из других браузеров(FireFox, Opera, Chrome) получаю сообщение “error” (alert(tesxtStatus);) в мозилке Firebug 1.4.1 показывает результат запроса как “503 Method not implemented”

    я предполагаю что дело в том, что я подаю некорректный xml…
    Если это так, то как правильно его сформировать в javascript ?
    и если есть работающие во всех браузерах варианты запросов, не могли бы дать пример?

  85. 85
    Администратор ответил:
    Делаю запрос через jQuery ajax:
    function GetCurrentRegion(ip)
    {
    var xmlDocument = createXMLDocument(’81.176.18.63′);
    alert(xmlDocument);
    $j.ajax({
    url: “http://194.85.91.253:8090/geo/geo.html”,
    type: “POST”,
    processData: false,
    data: xmlDocument,
    dataType: “xml”,
    success: function(xml){
    var region = $j(xml).find(’region’).text();
    alert(’ip detecting - ‘+ region);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
    alert(tesxtStatus);
    }
    })
    }
    //——————————————-
    function createXMLDocument(xml)
    {
    if( window.ActiveXObject && window.GetObject ) {
    var dom = new ActiveXObject( ‘Microsoft.XMLDOM’ );
    dom.loadXML( xml );
    return dom;
    }
    if( window.DOMParser )
    return new DOMParser().parseFromString( xml, ‘text/xml’ );
    }

    при вызове функции GetCurrentRegion из IE отрабатывает корректно, из других браузеров(FireFox, Opera, Chrome) получаю сообщение “error” (alert(tesxtStatus);) в мозилке Firebug 1.4.1 показывает результат запроса как “503 Method not implemented”

    я предполагаю что дело в том, что я подаю некорректный xml…
    Если это так, то как правильно его сформировать в javascript ?
    и если есть работающие во всех браузерах варианты запросов, не могли бы дать пример?

    “503 Method not implemented” - это сообщение отдается сервером в случае неподдерживаемого HTTP запроса. Сервер поддерживает только POST запросы. Соответственно все другие методы, в том числе и GET не обрабатываются, а выдается ошибка 503. Ajax-примеров, к сожалению, пока нет.

  86. 86
    Администратор ответил:
    Во-первых спасибо за возможность пользоваться вашей базой.

    Во-вторых подскажите пожалуйста, если у меня реализована схема при которой по ip каждого нового посетителя первоначально запрашивается информация с вашего сервера и вносится в собственную аналогичную базу, для того чтобы в последующем брать эту инф. из собственной бд. - правильна ли это или в дальнейшем собственная бд будет выдавать не верную информацию. Т.е. может ли происходить такая ситуация когда одному и томуже ip в разное время будет принадлежать разная гео.информация?

    База обновляется ежедневно. Поэтому описанная Вами ситуация имеет место быть. Сегодня какой-либо ip будет соответствовать одному городу, а завтра другому. Именно поэтому мы открыли такой сервис. Делая запрос, Вам не надо напрягаться насчет достоверности данных. Если же вы будут хранить данные у Вас, то необходим некий механизм синхронизации.

  87. 87
    Nick ответил:

    Присоединяясь к другим - огромное спасибо за ваш сервис!

    может быть кому потребуется, вот код на C#:

    const string ServiceUrl = “http://194.85.91.253:8090/geo/geo.html”;
    const string RequestData = “{0}”;
    string ip = “213.142.32.63″;

    // делаем сам запрос
    WebRequest req = WebRequest.Create(ServiceUrl);
    req.Method = “POST”;

    byte[] data = Encoding.Default.GetBytes(string.Format(RequestData,ip));
    req.ContentLength = data.Length;
    req.GetRequestStream().Write(data, 0, data.Length);
    WebResponse resp = req.GetResponse();

    StreamReader reader = new StreamReader(resp.GetResponseStream(), Encoding.Default);
    string resString = reader.ReadToEnd();
    resp.Close();
    reader.Close();

    // парсим ответ (вытаскиваю имя региона)
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(resString);
    MyRegion = doc.SelectSingleNode(”ip-answer/ip/region”).InnerText;

  88. 88
    cCube ответил:

    База обновляется ежедневно в какое-то определенное время, или просто обновляется не реже чем раз в сутки? Это важно знать чтобы правильно сделать кэширование результатов, которые возвращает Ваш сервис, и соответственно, уменьшить нагрузку на него.

    П.С. у Вас на кнопке «Комментировать» одна буква «м».

  89. 89
    Шамиль ответил:

    Посоветуйте
    Как часто следует проводить валидацию ip адреса?
    То есть если запросы кешируются в моей базе, через какое время их желательно перепроверять у вас?

  90. 90
    Gennady ответил:

    хотелось бы увидеть следующую возможность:
    а именно постоянную ссылку
    http://194.85.91.253:8090/geo/ но!!! которая работает следующим образом:

    1. скрипт передает вашему сервису только 1 параметр, номер версии моей базы в формате скажем текущей даты(скажем 04102009:1700)
    2. если я еще не имею полную базу(первое обращение), то получаю полную базу
    3. если имею то получаю только изменения скажем между
    04102009:1700 (моя версия) и 06102009:0330 (актуальная ваша версия)
    скрипт импорта изменений (отработавший без ошибок), актуализирует дату, до скачанной, полная весит “копейки”, а изменения вообще крохи
    4. м.б данный функционал разрешать не всем а только зарегистрированным в системе сайтам

    получится, что фактически единожды скачав полную базу, я работаю с ней на своем сайте, с оптимальным интервалом скрипт по “крону” синхронизируется с вашей актуальной базой..
    конечно речь идет о сайтах с многотысячной аудиторией в день, которым не хочется быть забаненным или зависеть от временной недоступности вашего сервиса, (т.е с вероятностью ~99+% на основании своей версии от “вчера”) я смогу правильно определить регион пользователя, да и ваша нагрузка , думаю, существенно упадет.

    спасибо!

  91. 91
    SuhaRik ответил:

    Egor N Zuskin ответил:
    27 Августа, 2009 в 13:45
    Класс на php для использования IPGeo в своих скриптах
    http://www.it2k.ru/projects/class-ipgeo/

  92. 92
    SuhaRik ответил:

    Egor N Zuskin Огромное спасибо - потратил пол дня пока не нашёл твою ссылку

  93. 93
    Администратор ответил:
    Посоветуйте
    Как часто следует проводить валидацию ip адреса?
    То есть если запросы кешируются в моей базе, через какое время их желательно перепроверять у вас?

    База обновляется каждый день

  94. 94
    Администратор ответил:
    База обновляется ежедневно в какое-то определенное время, или просто обновляется не реже чем раз в сутки? Это важно знать чтобы правильно сделать кэширование результатов, которые возвращает Ваш сервис, и соответственно, уменьшить нагрузку на него.

    П.С. у Вас на кнопке «Комментировать» одна буква «м».

    База обновляется каждый день в 8 утра. Спасибо за замечание, исправили.

  95. 95
    gt_rocker ответил:

    пример с использованием xml-сервиса: http://grantorinoteam.blogspot.com/2009/10/blog-post.html

  96. 96
    Данила ответил:

    Класс на php для использования IPGeo в своих скриптах
    http://www.it2k.ru/projects/class-ipgeo/

    Спасибо, Egor N Zuskin! Работает!

  97. 97
    Egor Zuskin ответил:

    2Данила незашто … )
    немного обновил класс теперь есть кеширование данных и проверка на валидность ип адреса
    !ВАЖНО! для работы необходимо php-xml расширение для php
    http://www.it2k.ru/projects/class-ipgeo/

  98. 98
    Никита ответил:

    Здравствуйте, благодарю за сервис.

    Возникла некоторая сложность:
    Задача: требуется в зависимости от выданного города и региона вывести определенные значение. Есть ли в выдаче вашего сервера какая либо нумерация городов?, или что то типа того, или придется делать так: if ($city==”Воронеж”) {echo “…”;}

    Если так, то можете ли вы выложить базу с точными названиями всех городов и регионов, так как их выдает сервер? (желательно в удобном для работе формате, наример csv).

    Заранее большое спасибо.

  99. 99
    Администратор ответил:
    Здравствуйте, благодарю за сервис.

    Возникла некоторая сложность:
    Задача: требуется в зависимости от выданного города и региона вывести определенные значение. Есть ли в выдаче вашего сервера какая либо нумерация городов?, или что то типа того, или придется делать так: if ($city==”Воронеж”) {echo “…”;}

    Если так, то можете ли вы выложить базу с точными названиями всех городов и регионов, так как их выдает сервер? (желательно в удобном для работе формате, наример csv).

    Заранее большое спасибо.

    Нумерации городов нет, но специально по Вашей просьбе выложили список городов и регионов. соответственно файлы:
    http://ipgeobase.ru/files/db/Main/cities_list.db
    и
    http://ipgeobase.ru/files/db/Main/region_list.db

  100. 100
    Администратор ответил:
    хотелось бы увидеть следующую возможность:
    а именно постоянную ссылку
    http://194.85.91.253:8090/geo/ но!!! которая работает следующим образом:

    1. скрипт передает вашему сервису только 1 параметр, номер версии моей базы в формате скажем текущей даты(скажем 04102009:1700)
    2. если я еще не имею полную базу(первое обращение), то получаю полную базу
    3. если имею то получаю только изменения скажем между
    04102009:1700 (моя версия) и 06102009:0330 (актуальная ваша версия)
    скрипт импорта изменений (отработавший без ошибок), актуализирует дату, до скачанной, полная весит “копейки”, а изменения вообще крохи
    4. м.б данный функционал разрешать не всем а только зарегистрированным в системе сайтам

    получится, что фактически единожды скачав полную базу, я работаю с ней на своем сайте, с оптимальным интервалом скрипт по “крону” синхронизируется с вашей актуальной базой..
    конечно речь идет о сайтах с многотысячной аудиторией в день, которым не хочется быть забаненным или зависеть от временной недоступности вашего сервиса, (т.е с вероятностью ~99+% на основании своей версии от “вчера”) я смогу правильно определить регион пользователя, да и ваша нагрузка , думаю, существенно упадет.

    спасибо!

    Хорошее предложение, мы обязательно подумаем над его реализацией.

  101. 101
    Никита ответил:

    Большое спасибо, за точные базы.
    Соответственно парочка вопросов:

    1. Это все города которые есть у нас в россии, или это только те, где определяется IP (или где вообще существует интернет.)
    2. Изменяется ли это база со временем?
    3. В какой точно кодировке выдает их ваш сервис? (можно ли получать в utf-8 или конвертировать самому?)

  102. 102
    Администратор ответил:
    Большое спасибо, за точные базы.
    Соответственно парочка вопросов:

    1. Это все города которые есть у нас в россии, или это только те, где определяется IP (или где вообще существует интернет.)
    2. Изменяется ли это база со временем?
    3. В какой точно кодировке выдает их ваш сервис? (можно ли получать в utf-8 или конвертировать самому?)

    Спасибо за отзыв)
    1. Нет, это только наиболее крупные, самые маленькие населенные пункты как правило определяются как их областные или районные центры.
    2. Да, конечно, она обновляется каждый день. Среднее количество обновлений - 50-70 блоков в день.
    3. Сервис выдает в кодировке Windows-1251. Пока других кодировок нет, поэтому придется конвертировать самому.

  103. 103
    alemiks ответил:

    Планируется ли создание веб-службы? Если да, то когда появится?

  104. 104
    Администратор ответил:
    Планируется ли создание веб-службы? Если да, то когда появится?

    Уточните пожалуйста какой конкретно веб-службы?

  105. 105
    alemiks ответил:

    Я имел в виду оформление вашего сервиса в виде веб-службы по SOAP-протоколу

  106. 106
    Администратор ответил:
    Я имел в виду оформление вашего сервиса в виде веб-службы по SOAP-протоколу

    Пока не планируется, но в будущем мы рассмотрим Ваше предложение.

  107. 107
    Сергей ответил:

    Правильно ли я понял, что сейчас сервис работает в режиме “не более 44 IP в одном запросе”? Когда ожидается работа в полную мощность - до 4000 IP?

  108. 108
    Алексей ответил:

    Пожелание: было бы здорово если бы для регионов возвращался еще и их код, например для Новосибирской области 54. Это упростило бы задачу сопоставления региона, т.к. наименования могут отличаться, например может быть Новосибирская обл. и т.п.

  109. 109
    Евгений ответил:

    Согласен с предыдущим комментатором, очень было-бы удобно закрепить за каждым городом свой код, можно даже воспользоваться ОКАТО, или автомобильные, ну в крайнем случае вообще свою нумерацию введите.

  110. 110
    Администратор ответил:
    Правильно ли я понял, что сейчас сервис работает в режиме “не более 44 IP в одном запросе”? Когда ожидается работа в полную мощность - до 4000 IP?

    Нет, не правильно. Сервис работает с указанным ограничением. Если у Вас возникли проблемы, и сервис отказывается обслуживать более 44 адресов, опишите более подробно проблему: с какого адреса вы делаете обращения, что отвечет сервис, когда была последняя ошибка?

  111. 111
    Администратор ответил:
    Пожелание: было бы здорово если бы для регионов возвращался еще и их код, например для Новосибирской области 54. Это упростило бы задачу сопоставления региона, т.к. наименования могут отличаться, например может быть Новосибирская обл. и т.п.
    Согласен с предыдущим комментатором, очень было-бы удобно закрепить за каждым городом свой код, можно даже воспользоваться ОКАТО, или автомобильные, ну в крайнем случае вообще свою нумерацию введите.

    По многочисленным просьбам, скоро такая возможность появится. Как только нумерация будет введена, Вы узнаете об это из новостей проекта.

  112. 112
    Никита ответил:

    ***!!!прошу прощения, предыдущий пост не дописан, нечаяно отправил!!!***
    полная версия:

    Тоже хотелось бы видеть номера регионов и городов.
    А лучше единый номер совмещающий и то и другое, к примеру:
    4001=КАЛУГА (40 регион, 01 город),
    4002=ОБНИНСК (40 регион, 02 город соответственно).
    возможно мой пример не совершенен, и ваш будет продуман лучше в любом случае ждем.

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

    Заранее спасибо)

  113. 113
    Администратор ответил:
    ***!!!прошу прощения, предыдущий пост не дописан, нечаяно отправил!!!***
    полная версия:

    Тоже хотелось бы видеть номера регионов и городов.
    А лучше единый номер совмещающий и то и другое, к примеру:
    4001=КАЛУГА (40 регион, 01 город),
    4002=ОБНИНСК (40 регион, 02 город соответственно).
    возможно мой пример не совершенен, и ваш будет продуман лучше в любом случае ждем.

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

    Заранее спасибо)

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

  114. 114
    Дмитрий ответил:

    Мне нужно определять местное время посетителя. Было бы очень удобно если бы вы предоставляли такую информацию.
    ps
    хотел потестить сервис, а он выдаёт тайм аут, 194.85.91.253:8090 не пингуется.

  115. 115
    Дмитрий ответил:

    Извиняюсь, проблема в моём скрипте.

  116. 116
    Никита ответил:

    Уважаемая администрация.

    Вот тут,
    http://informer.gismeteo.ru/getcode/xml.php
    в погодном XML сервисе, уже есть единая система нумерации городов,
    возможно это поможет вам в поиске решения для вывода номеров города по ip.

    =))

  117. 117
    Администратор ответил:
    Мне нужно определять местное время посетителя. Было бы очень удобно если бы вы предоставляли такую информацию.
    ps
    хотел потестить сервис, а он выдаёт тайм аут, 194.85.91.253:8090 не пингуется.
    Извиняюсь, проблема в моём скрипте.

    Хорошее предложение, в ближайшее время сервис будет выдавать timezone города.

  118. 118
    sli ответил:

    > Egor N Zuskin ответил:
    > Класс на php для использования IPGeo в своих скриптах
    > http://www.it2k.ru/projects/class-ipgeo/

    Добавил кеширование на MySQL и, в виде плагина, кеширование средствами Joomla:
    http://bitbucket.org/sli/ipgeo/

    Данные сохраняются для всей подсети запрашиваемого IP, что должно снизить количество обращений к серверу ipgeobase.ru

    Спасибо за сервис!

  119. 119
    Kuvalda.Spb.RU ответил:

    Справочники нужно с инкрементальным апдейтом по серийнику (обычно это YYYYMMDDHHMMSS).
    Отмечать в справочнике каждую строчку при изменении и по апдейту отправлять только то чего нет у клиента. Справочники надо сделать полными, не только по России, конечно привязки к адресам может и не быть, а может быть очень грубая, например к стране. Но с геосправочником будет очень полезно, поскольку кроме айпи, есть немалая проблема управления регионами, приходится писать и собирать собственные базы.
    С идентификацией в этом смысле тоже не очень хорошо.
    ISO-3166 - дает только страны и федеральное деление. Подходят для грубого кодирования.
    А дальше должны идти города, но, как ни странно, единого стандарта нет.
    В России регионы (кторые называют автомобильными) на самом деле не автомобильные.
    Они к примере в налоговых идентификаторах используются.
    Коды ОКАТО и КЛАДР тоже чисто Российские, КЛАДР - классифицирует очень подробно, вплоть до номеров домов, за его поддержку отвечает ГНИВЦ ФНС, базу можно скачать у них с сайта http://www.gnivc.ru.
    В других странах собственные классификаторы. Это жутко неудобно в глобализированном обществе.
    Решите эту проблему - можете выйти в Инете на международный рынок с единым классификатором вплоть до населенного пункта или улицы, их координат и айпи-адресов.

  120. 120
    Никита ответил:

    Администрация, здравствуйте.

    Хочу напомнить, что многие из нас, как манны небесной ждут нумерации городов России. Скажите, если вам предоставить базу нумерации городов и обосновать ее систему (т.е. Почему именно такая нумерация логична, на чем базируется, итд…) поможет ли это ускорить процесс?

    Заранее спасибо.

    P.S. (сначала отправил это сообщение в тему “с праздниками”, извините, с тормозил, так как искал самый последний топик по дате, и видимо не там нашел… )

  121. 121
    Роман ответил:

    Класс для PHP
    Метод getLocation в качестве вводных параметров получает массив с IP адресами, и возвращает объект SimpleXML (UTF-8)

    asXML();

    $query = “POST /geo/geo.html HTTP/1.1\r\nContent-Length: “.strlen ($xml).”\r\n\r\n$xml\r\n\r\n”;

    if (!$socket = fsockopen($this->ipHost, $this->ipPort)) {
    $result=”No Connection”;
    } else {
    $response = ”;
    fwrite($socket, $query);
    while (!feof($socket)) $response.= fgets($socket, 2048);
    fclose($socket);
    // Конвертируем ответ в XML-строку в кодировке UTF-8
    $result=str_replace(’Windows-1251′, ‘UTF-8′, iconv(’Windows-1251′, ‘UTF-8′,str_replace(”\n”, ”, mb_substr($response.’ ‘, mb_strpos($response,’<?’ ,0,’Windows-1251′), -1, ‘Windows-1251′)) ));
    }
    return simplexml_load_string($result);
    }
    public function getLocation($ip) {
    $ipList=simplexml_load_string(”);
    for ($i=0;$i{’ip-list’}->addChild(’ip’,$ip[$i]);
    }
    return $this->connectGeoIPserver($ipList);
    }
    }

    $geoip=new GeoIP();
    $xml=$geoip->getLocation(array(’212.69.101.20′,’92.255.241.1′,’93.186.231.222′));
    echo $xml->asXML();
    ?>

  122. 122
    Роман ответил:

    Класс для PHP >5.x
    Метод getLocation в качестве вводных параметров получает массив с IP адресами, и возвращает объект SimpleXML (UTF-8)

    geoip.txt

  123. 123
    Антон ответил:

    Добрый день. Спасибо за сервис.
    Возникла сложность, на новом хостинге закрыт порт 8090, открыты только 80 и 443 (открыть нужный достаточно проблематично и затратно :( ).
    Есть ли возможность повесить данный сервис на один из этих портов?

  124. 124
    Администратор ответил:
    Добрый день. Спасибо за сервис.
    Возникла сложность, на новом хостинге закрыт порт 8090, открыты только 80 и 443 (открыть нужный достаточно проблематично и затратно :( ).
    Есть ли возможность повесить данный сервис на один из этих портов?

    Добрый день!

    К сожалению такой возможности нет. Не совсем ясна Ваша проблема. Вы же не поднимаете сервер у себя на хостинге, Вы обращаетесь к нам. По идее можно опрашивать любой порт.
    Мы не можем поменять порт сервиса, т.к. на 80 порту живет сайт, а 443 - зарезервирован для HTTPS

  125. 125
    Антон ответил:

    Проблема в том, что на хостинге закрыты все исходящие порты, кроме 80 и 443го. Такие у них правила.
    8090 можно открыть, но если заплатить за выделенный IP адрес, его стоимость это 50% от стоимости самого хостинга…
    Думаю у друзей на сервере сделать шлюз с 80 на 8090, но стабильность такого варианта будет низка…

  126. 126
    Администратор ответил:
    Проблема в том, что на хостинге закрыты все исходящие порты, кроме 80 и 443го. Такие у них правила.
    8090 можно открыть, но если заплатить за выделенный IP адрес, его стоимость это 50% от стоимости самого хостинга…
    Думаю у друзей на сервере сделать шлюз с 80 на 8090, но стабильность такого варианта будет низка…

    Дык Вам не нужен исходящий порт, Вы же делаете запрос к порту, а не поднимаете его у себя.

  127. 127
    Антон ответил:

    Не правильно выразился, возможно. Фаервол режет все порты исходящие/входящие, кроме двух.
    Вот цитата из хелпа хостинга:

    Problem:
    Why am I unable to use the fsockopen function?

    Solution:
    The fsockopen function will work for outbound connection to any URL on port 80 (HTTP) or 443 (HTTPS). If fsockopen is attempting to use another port, it will not work until we have added that port to the firewall.
    By default, your account is on a shared IP address. We have a firewall for our shared IP customers which prohibits opening additional ports. If you need to connect using a port number other than 80 or 443, this will require you purchase a Dedicated IP for your Hostmonster account.

  128. 128
    Виткор ответил:

    RE:Значения переменных $xml_query и $xml_response укажите.

    А какое значение указать для $xml_response ???

  129. 129
    Дмитрий ответил:

    Подскажите, есть где-то пример использования данных с сайта при помощи asp?

  130. 130
    Администратор ответил:
    Подскажите, есть где-то пример использования данных с сайта при помощи asp?

    Пока к сожалению нет.

  131. 131
    Иван ответил:

    Доброй день. Хочу сообщить, что блоки

    1.Населенный пункт Южно-Сахалинск
    Блок IP-адресов:
    188.168.64.0 - 188.168.65.255

    2.Населенный пункт Чита
    Блок IP-адресов
    188.168.60.0 - 188.168.60.255
    188.168.61.0 - 188.168.61.255

    распознаются сервисом как Москва, Москва,

    Хотя на сайте http://ipgeobase.ru/cgi-bin/AdvSearch.cgi в поиске выдается верный результат. Для контроля работы сервиса как раз данные с сайта и использовались.

  132. 132
    Иван ответил:

    86.110.176.0 - 86.110.179.0
    то же самое - Москва

  133. 133
    Администратор ответил:

    Иван, спасибо за замечание. Ошибка исправлена.

  134. 134
    xanc ответил:

    Вдохновившись сервисом http://jsonip.appspot.com создал похожую обвязку для xml-сервиса ipgeobase’а: http://jsonipgeobase.appspot.com

    Принимаемые параметры (все необязательные):
    callback - имя callback-функции для jsonp, если не передавать, то в ответ будет json
    fields - любые поля из [inetnum, inet-descr, inet-status, city, region, district, lat, lng], т.е. какие поля отправлять в запросе к ipgeobase, если не указаны, то в запросе будет “all”

    Выходные параметры:
    status - “ok” если был получен корректный ответ от ipgeobase, “error” - в противном случае
    ip - ip-адрес клиента
    inetnum, inet-descr, inet-status, city, region, district, lat, lng - из ответа ipgeobase

    Пример использования:
    http://jsonipgeobase.appspot.com/?callback=geoip&fields=city&fields=lng&fields=lat
    В ответ получим jsonp вида:
    geoip({”status”: “ok”, “ip”: “94.24.168.68″, “lng”: “61.402580″, “lat”: “55.159889″, “city”: “\u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a”});

  135. 135
    anak ответил:

    Пример для asp.net

    public class IpGeo
    {
    public string inetnum { get; set; }
    public string inet_descr { get; set; }
    public string inet_status { get; set; }
    public string city { get; set; }
    public string region { get; set; }
    public string district { get; set; }
    public string lat { get; set; }
    public string lng { get; set; }
    }

    protected void Page_Load(object sender, EventArgs e) {
    List ipgeo = readHtmlPage(”http://194.85.91.253:8090/geo/geo.html”);
    }

    private List readHtmlPage(string url)
    {
    string VisitorIP = Request.ServerVariables["REMOTE_ADDR"];
    String strPost = “” + VisitorIP + “”;
    StreamWriter myWriter = null;
    HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
    objRequest.Method = “POST”;
    objRequest.ContentLength = strPost.Length;
    try
    {
    myWriter = new StreamWriter(objRequest.GetRequestStream());
    myWriter.Write(strPost);
    }
    catch (Exception e)
    {
    }

    finally
    {
    myWriter.Close();
    }
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    Encoding encode = System.Text.Encoding.GetEncoding(”Windows-1251″);
    List ipGeo = new List();
    using (StreamReader sr =
    new StreamReader(objResponse.GetResponseStream(), encode))
    {
    string result = sr.ReadToEnd();
    TextReader tr = new StringReader(result);
    XElement xmlTree = XElement.Load(tr);
    sr.Close();
    try
    {
    ipGeo.AddRange(
    (from mi in xmlTree.Elements(”ip”)
    where mi.Attribute(”value”).Value == VisitorIP
    select new IpGeo
    {
    inetnum = mi.Element(”inetnum”).Value,
    inet_descr = mi.Element(”inet-descr”).Value,
    inet_status = mi.Element(”inet-status”).Value,
    lat = mi.Element(”lat”).Value,
    lng = mi.Element(”lng”).Value,
    city = mi.Element(”city”).Value,
    region = mi.Element(”region”).Value,
    district = mi.Element(”district”).Value
    }));
    }
    catch
    {
    }
    tr.Close();
    foreach (IpGeo ipgeo in ipGeo)
    {
    Response.Write(”IP: ” + VisitorIP + “”);
    Response.Write(”Округ: ” + ipgeo.district + “”);
    Response.Write(”Регион: ” + ipgeo.region + “”);
    Response.Write(”Город: ” + ipgeo.city + “”);
    Response.Write(”Широта: ” + ipgeo.lat + “”);
    Response.Write(”Долгота: ” + ipgeo.lng + “”);
    }
    }
    return ipGeo;
    }

  136. 136
    Саша ответил:

    а почему ругается?
    Call to undefined function curl_init() on line 13

  137. 137
    private-seo-soft ответил:

    function get_city ($ip)
    {
    $curl = curl_init();
    curl_setopt_array ($curl, array (
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => “http://194.85.91.253:8090/geo/geo.html”,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS =>”address=”.urlencode(”".$ip.”")
    )
    );
    $rez = curl_exec ($curl);
    if (preg_match (”|\(.*)\|”, $rez, $city))
    {
    return $city[1];
    }
    return “неизвестный город”;
    }
    $city = get_city ($_SERVER['REMOTE_ADDR']);
    Вот такой вариан с использованием курла :) юзайте на здоровье!

  138. 138
    Alex ответил:

    Есть в Вашей базе сервиса ipv6 локации?

  139. 139
    KDV ответил:

    Еще раз подыму вопрос про реализацию запросов к вашему сервису не со стороны сервера (PHP скрипта) а со стороны клиента (javascript+AJAX).
    Ктонибудь уже успешно реализовал данную задачу? Если нет, то думаю стоит об этом подумать ибо часто бывает что на хостинге в целях безопасности закрыт доступ к внешним IP да и еще к томуже на нестандартные порты TCP.

    PS Может админам сервиса стоит создать офиц.клуб обсуждения сервиса на Яндексе (clubs.ya.ru)?
    Очень много толковых людей пользуются тамошними клубами.

  140. 140
    Администратор ответил:
    Есть в Вашей базе сервиса ipv6 локации?

    Пока нет, но в будущем обязательно появятся.

  141. 141
    Администратор ответил:
    Еще раз подыму вопрос про реализацию запросов к вашему сервису не со стороны сервера (PHP скрипта) а со стороны клиента (javascript+AJAX).
    Ктонибудь уже успешно реализовал данную задачу? Если нет, то думаю стоит об этом подумать ибо часто бывает что на хостинге в целях безопасности закрыт доступ к внешним IP да и еще к томуже на нестандартные порты TCP.

    PS Может админам сервиса стоит создать офиц.клуб обсуждения сервиса на Яндексе (clubs.ya.ru)?
    Очень много толковых людей пользуются тамошними клубами.

    Пока мы не планируем реализацию клиентского приложения. Если вы напишите подобную программу и поделитесь с нами, мы выложим ее на сайте с указанием автора.

  142. 142
    xanc ответил:

    KDV, см. коммент 44993 (http://blog.ipgeobase.ru/?p=37#comment-44993)

  143. 143
    Сергей ответил:

    Народ, не забывайте в реальных применениях о таймаутах, ведь основная сфера использования ipgeo - на сайтах в составе других функций. Если, конечно, не хотите, чтобы сайт “встал” из-за отсутствия соединения с сервером NIC.RU.

    function cityByIp( $ip ) {
    if( !empty( $ip ) && filter_var( $ip, FILTER_VALIDATE_IP ) ):
    $ch = curl_init();
    curl_setopt_array( $ch, array (
    CURLOPT_CONNECTTIMEOUT => 2,
    CURLOPT_TIMEOUT => 3,
    CURLOPT_HEADER => FALSE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => ‘http://194.85.91.253:8090/geo/geo.html’,
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => ‘address=’ . $ip . ”
    )
    );
    $response = curl_exec( $ch );
    return ( !curl_errno( $ch ) && $xml = simplexml_load_string( $response ) ) ? $xml->ip->city : FALSE;
    endif;
    return FALSE;
    }

  144. 144
    Андрей ответил:

    Есть предложение: для упрощение разбора областей добавить к выводу еще и (допустим) автомобильные номера регионов, т.е. если это Москва то {city id=”77″}Москва{/city}, Белгород {city id=”31″}Белгород{/city}, Санкт-Петербург {city id=”78″}Санкт-Петербург{/city} и т.д. Это упростит работу со строками.

    Спасибо.

  145. 145
    Администратор ответил:
    Есть предложение: для упрощение разбора областей добавить к выводу еще и (допустим) автомобильные номера регионов, т.е. если это Москва то {city id=”77″}Москва{/city}, Белгород {city id=”31″}Белгород{/city}, Санкт-Петербург {city id=”78″}Санкт-Петербург{/city} и т.д. Это упростит работу со строками.

    Спасибо.

    Добрый день!

    Нам уже давно предлагают ввести регионы. Скоро на сайте появится оптимизированная база с блоками, идущими подряд без вложенности. Туда в качестве эксперимента мы планируем добавить id регионов. Если этот формат будет более удобен пользователям, то мы введем его в XML сервис.

  146. 146
    Dromok ответил:

    У меня цель была получение только названия города по айпи человека обратившемуся к скрипту. Вот что у меня получилось:

    $url = “http://194.85.91.253:8090/geo/geo.html”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, “”.$_SERVER['REMOTE_ADDR'].”");
    $result = curl_exec($ch);
    curl_close($ch);
    $doc = new DOMDocument();
    $doc->loadXML($result);
    $city = $doc->getElementsByTagName(’city’)->item(0)->textContent;

    в $city будет только название города. Очень удобно, спасибо за сервис!

  147. 147
    Romanick ответил:

    Добрый день!
    Очень хотелось бы уведить в xml-ответе id города. Это упростит жизнь программистов. :)

  148. 148
    kuzroman ответил:

    обьясните почему у меня не работает этот коД?

    $REMOTE = $_SERVER['REMOTE_ADDR'] ;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,”http://194.85.91.253:8090/geo/geo.html” );
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, “$REMOTE” );
    $result = curl_exec($ch);

    echo $result ;

    curl_close($ch);
    $doc = new DOMDocument();
    $doc->loadXML($result);
    $city = $doc->getElementsByTagName(’city’)->item(0)->textContent;

    echo $city ;

    в echo $result ; выводится Incorrect request
    а в echo $city ; ничего

  149. 149
    KDV ответил:

    Опечатку исправьте в названии тега message (вы шлете mesasge) в ответе Incorrect request.

  150. 150
    Администратор ответил:
    Опечатку исправьте в названии тега message (вы шлете mesasge) в ответе Incorrect request.

    Исправлено

Комментировать:

© 2007-2015 IpGeoBase