Kaip su PHP nustatyti lankytojo šalį pagal jo IP adresą

Pastaruoju metu internetas darosi vis globalesnis – žmonės bendrauja iš skirtingų pasaulio taškų. Bet, kita vertus, visai miela gauti pasveikinimą savo kalba – dėl to lokalias puslapių versijas daro ir Google, ir Microsoft, ir tas pats Facebook yra iš dalies verčiamas į lietuvių kalbą. Ir čia kyla klausimas – o kaip nustatyti, iš kurios šalies lankytojas? Kaip tik vakar teko spręsti šį klausimą, tai pasidalinsiu patirtimi.

Panaršius internete, galima rasti daugybę variantų, kaip atsekti lankytojo šalį. Bet iš esmės egzistuoja du būdai:
- tiesiog kreiptis į nutolusią tarnybą, kuri grąžina tau šalies duomenis pagal IP
- parsisiųsti IP adresų duomenų bazę pas save ir ją naudoti su trečios šalies skriptu, arba parašyti savąjį

Pabandžiau abudu variantus. Pirmasis bandymas buvo interneto tarnyba hostip.info, viskas ką reikėjo padaryti – tai parašyti tokį kodą, nurodytą jų pačių puslapyje.

$country = '';
$IP = $_SERVER['REMOTE_ADDR'];
if (!empty($IP)) {
  $country = file_get_contents('http://api.hostip.info/country.php?ip='.$IP);
}
if ($country == "LT") {
 ... // veiksmai lietuvių kalba
}

Rezultatai: mano asmeninį kompiuterį jis gražiai atpažino kaip lietuvišką, bet davus patestuoti kolegoms iš Latvijos, teko nusivilti – jų šalies neatpažindavo. Nežinau, galbūt aš kažką dariau ne taip, bet neturėjau laiko labai gilintis, pradėjau ieškoti kitokio greito sprendimo. Ir radau skriptuką pavadinimu “ip2coutnry” iš phpweby.com. Ten principas yra toks:

1. Parsisiunti archyvą, kuriame yra IP adresų CSV failas;
2. Parsisiunti patį “ip2country” skriptą;
3. Išarchyvuoji viską į vieną katalogą, tarkime, “ip2country” ir įkeli jį į serverį
4. Įkeli IP adresus į savo duomenų bazę: nurodai importo skripte prisijungimo prie DB duomenis ir tiesiog naršyklėje paleidi “jusuadresas.com/ip2country/import.php”
5. Naudojies skriptu ir savo IP adresų duomenų baze. Konkrečiau šis punktas:

include_once('ip2c/ip2country.php');
$ip2c=new ip2country();
$ip2c->mysql_host='localhost';
$ip2c->db_user='useris';
$ip2c->db_pass='passwordas';
$ip2c->db_name='duombaze';
$ip2c->table_name='ip2c';
$country = $ip2c->get_country_code();
if ($country == "LT") {
 ... // veiksmai lietuvių kalba
}

Šis variantas suveikė tvarkingai ir be klaidų. Bijojau, kad ilgai užtruks IP adresų įkelimas į duomenų bazę (9 MB CSV failas), bet apie 100 tūkst. eilučių sukėlė greitai – per keliolika sekundžių. Daviau patestuoti tiems patiems latviams – nusiskundimų nebuvo.

O ką jūs naudojote ar naudojate tokiai užduočiai spręsti? Gal parekomenduosite kitokį servisą ar savo būdą atsekti lankytojo šalį?

* * *
Norite gauti Skaitykit.lt naujienas operatyviau? Prenumeruokite RSS įrašus
Jei nežinote, kas yra RSS ir kaip juo naudotis, apie tai galima pasiskaityti šiame puslapyje.

Komentarų: 9

    Aleksandras:
    April 28, 2010 3:46 pm

    Kitas variantas – naudoti ‘HTTP_ACCEPT_LANGUAGE’ kliento (naršyklės) kintamąjį.

    Aišku, čia yra Skonio reikalas ir priklauso nuo atvejo, bet man šitas būdas atrodo patikimėsnis ir labiau nuo pačio vartotojo norų priklauso. T.y. kaip vartotojas sukonfigūravęs klientą, tokius ir turėtų matyti puslapius. Per IP nustatyta kalba, bent jau mane, dažnokai suerzina.

    Pagal nutylėjimą, suinstaliavus klientą, dažniausiai kliento kalba kaip tik ir būna nustatoma pagal operacinės lokalę. Taip kad dažnai šitas būdas turėtų tenkinti, o labiau išsprusę vartotojai susikonfigūruos kaip jam reikia, ir neverta riboti jų laisvės. :)

    Pranas:
    April 28, 2010 3:51 pm

    Pritariu. Visai nenorėčiau kad kai būsiu įšvykęs į užsienį visas internetas pradėtų su manimi kalbėti ta kalba. Pats naršyklę esu sukonfigūravęs naudoti en-US kalbą ir labai džiaugiuosi nes dauguma portalų tai palaiko ir mane pasveikina anglišku turiniu (net turėdami LT versiją).

    Pats savo sprendimuose taip pat kalbą parenku pagal naršyklėje nustatytą kalbą su galimybe pakeisti ir išsaugau tą kalbą į kurią vartotojas pakeičia.

    Ričardas Š.:
    April 28, 2010 3:54 pm

    Galima pagal naršyklės informaciją ir jos kalbą daryti, bet ten reikia žinoti, kaip naršyklė rašo sutrumpinimus kalbų ir jie visi skirtingi, todėl būna daugiau vargo, jei nori tuo būdu pasinaudot.

    Laurynas:
    April 28, 2010 3:59 pm

    Tam reikalui geriausia naudoti GeoIP duombazę, kuri yra nemokama, turi savo .dat failo API PHP side ir kitoms programavimo kalboms. Labai greitas seek’as per failą, visiškai menki resursų eikvojimai laiko atžvilgiu – duombazė atnaujinama kas mėn. http://www.maxmind.com/app/geoip_country

    Karvė:
    April 28, 2010 4:22 pm

    Žinau daugybę žmonių, kurie nemėgsta Lietuviškų naršyklių, todėl diegia EN. Tačiau susikonfiguruoti kalbų prioritetų jie nemoka (tiesiog apie tai nežino).

    Manau geriausias būdas yra nustatyti šalį pagal IP pirmą kartą, o paskui nustatyti kalbos cookie ir kaip jau vartotojas pasirinks, taip jam rodys ir kitą kartą.

    Taip kiltų problema jei žmogus pirmą kartą ateitų iš užsienio. Tačiau abejoju ar tokių yra bent 10% tiek, kiek žmonių, kurie naudoja EN naršyklę ir nėra nusistatė kalbų prioritetų.

    Usability is the answer ;)

    insane:
    April 28, 2010 4:29 pm

    Manau kad geriau atprintint kelias saliu veliaveles ir useris pats pasispaus ka nores.
    Tos ip duombazes geriau tiktu tam tikru saliu vartotoju blokavimui:)

    Vytautas:
    April 28, 2010 8:28 pm

    Tik kodėl su telekominiu IP gražina DE? :) DE – Lietuva? :)

    TeaR:
    April 29, 2010 3:28 pm

    $iparr = explode(‘.’, $ip);
    $ipkodas = $iparr[3] + $iparr[2] * 256 + $iparr[1] * 256 * 256 + $iparr[0] * 256 * 256 * 256;

    $sql = “SELECT two_char_code FROM iptocountry WHERE lower_bound = $ipkodas LIMIT 1″;
    $result = mysql_query($sql);
    $salis = mysql_result($result, 0);

    echo “$salis”;

    :) Cia irgi su ip2country.csv

    dromey:
    November 13, 2010 1:43 pm

    Sveiki, as sita pabandyt bandziau bet man neikelia .csv failo!

    Man meta sia klaida : “Mysql packet size is 1MB and it is lower than the size of the file GeoIPCountryWhois.csv which is 9.67MB.
    Please download the other version of import.php at http://phpweby.com/software/ip2country

    Kas galite padeti susisiekite dromey94@gmail.com

Parašykite komentarą


Powered by WordPress | Designed by: BlueHost Coupon | Compare CD Rates, Online Brokers and Press Release