Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Страна по ip - помогите разобраться (http://www.flasher.ru/forum/showthread.php?t=99469)

Eric Gurt 07.08.2007 01:14

Страна по ip - помогите разобраться
 
Ниже приведен код функции, возвращающей страну по ip адресу:
Код:

function country_by_ip ($ip)
{
        $sock = fsockopen ("whois.ripe.net", 43, $errno, $errstr);
        if (!$sock)
        {
                return "??";
        }
        else
        {
                fputs($sock, $ip."\r\n"); // Здесь ошибка?
                while (!feof($sock))
                {
                        $str=fgets ($sock, 128);
                        //echo $str; // И видим, что что-то не так с fputs
                        $country=substr(strstr($str,"country:"), 8);
                        if ($country)
                        {
                                $country=trim($country);
                                $country=substr($country, 0, 2);
                                return strtoupper($country);
                        }
                }
                return "??";
        }
        fclose ($sock);
}

Эта функция возвразает EU (Европу) (!?) вместо UA, RU или PL. Причем год назад все работало.
Кто знает - просьба помочь. Нужно, чтобы возвращались страны (UA, RU, PL).

etc 07.08.2007 09:59

Найти другой сервак, который выдает нужное.

Eric Gurt 07.08.2007 10:33

если в этом коде добавить "echo $str;" перед "if ($country) " то видим, что ip адрес тут не передался:
Код:

fputs($sock, $ip."\r\n");
а разве есть другой?

etc 07.08.2007 10:37

Ну вместо whois.ripe.net использовать что-нибудь иное. Что именно — не знаю.

Kikasso 07.08.2007 11:56

Нарой где-нить базу айпишников, и whois не понадобится.

anant 13.08.2007 18:08

Цитата:

Сообщение от Kikasso
Нарой где-нить базу айпишников, и whois не понадобится.

Это действительно лучше

FFFantik 16.08.2007 01:47

Цитата:

Сообщение от Eric Gurt
Кто знает - просьба помочь. Нужно, чтобы возвращались страны (UA, RU, PL).

Так а в чем сложность? =) Тут буквально пару строк и писать..
Ну, вот я написал функцию....проверил на RU, выдает что надо...примерно так в общем:
Код:

function getCountry($ip) {                     

$adress='http://www.ripe.net/fcgi-bin/whois?form_type=simple&full_query_string=&searchtext='.$ip.'&do_search=Search';
       
        $str = file_get_contents($adress);
        $ar = explode('country:        ',$str);
        $country = $ar[1];
        $country = substr($country,0,2);
        $country = trim($country);
        return $country;
}


etc 16.08.2007 01:59

А откуда такая уверенность, что символов в названии страны только два?

FFFantik 16.08.2007 06:27

Хм =) Ну просто автор упомянул только три страны...и у всех двубуквенное обозначаение...
Цитата:

Сообщение от Eric Gurt
Нужно, чтобы возвращались страны (UA, RU, PL).

и я воспринял это (то, что ему нужна инфа только о трех странах) буквально...видимо зря =)
А сколько вообще максимально в буквенном коде стране может быть букв?
Думаю...больше 4 не будет всяко? Тогда исправить 2 на 4 :
Код:

$country = substr($country,0,4);
и дальше как было..

Skubent 16.08.2007 08:07

Вырезать от "country:" до "#" или до конца строки, обтримать.
Задача на регулярные выражения для начинающих.

Что характерно, автор вопроса скорее всего о нем уже забыл.

FFFantik 16.08.2007 09:38

Да, с регулярными выражениями пожалуй еще проще будет =) Тогда где-то так будет:
Код:

function getCountry($ip) {                     

$adress='http://www.ripe.net/fcgi-bin/whois?form_type=simple&full_query_string=&searchtext='.$ip.'&do_search=Search';
     
        $str = file_get_contents($adress);
        preg_match('/country:[\s]*([\w]*)/i',$str, $country);
        return $country[1];
       
}


Skubent 16.08.2007 11:41

решетку потерял. Но так да, направление верное :)

FFFantik 16.08.2007 20:14

А что за решетка-то? =) Понял что это "#", но что-то нигде её не видел...

Eric Gurt 20.08.2007 22:56

Warning: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in ...

ни один код не заработал. Хотя файлы с других серверов у меня читаются.

2FFFantik
У тебя этот код работает?

etc 20.08.2007 22:58

Гм, а вы хоть чуть-чуть представляете, как оно работает и почему оно может не работать?

Eric Gurt 20.08.2007 23:15

почему с других серверов читаются файлы, а с ripe.net нет - не понимаю

etc 20.08.2007 23:19

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

Eric Gurt 20.08.2007 23:29

:( жаль

Skubent 21.08.2007 01:22

FFFantik, от шара набрал адрес 184.23.2.1
получилось
country: EU # Country is really world wide

aQuestion 21.08.2007 02:06

RIPE возвращает EU для не-RIPE-шных сетей, и (теоретически) для сетей, не имеющих отношения к географии.

вообще говоря, такое насилие над whois не приветствуется и может караться баном хоста.

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

FFFantik 28.08.2007 21:07

Eric Gurt, у меня этот код работал с моего локалхоста.
Skubent, ну и возвратится искомое *EU*, чего еще надо-то.

Ну вот еще один небольшой код, с применением CURL-а на сей раз.
Проверил на бесплатном хостинге 110mb.com Там работает.

Код:

function getCountry($ip) {                     

$adress='http://www.ripe.net/fcgi-bin/whois?form_type=simple&full_query_string=&searchtext='.$ip.'&do_search=Search';
     
        $agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";   
        $c=curl_init();
        curl_setopt($c,CURLOPT_URL,$adress);
        curl_setopt($c,CURLOPT_USERAGENT,$agent);
        curl_setopt($c,CURLOPT_RETURNTRANSFER,1);
        $str = (curl_exec($c));
        preg_match('/country:[\s]*([\w]*)/i',$str, $country);
        return $country[1];
       
}



Часовой пояс GMT +4, время: 14:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.