Readme.ge Blog

FB image FB image

ქართველი ხარ ბიჭოო? :) ანუ User Country Detector

ავტორი: ალექსანდრე თარიღი: Sunday, May 30th, 2010

ძალიან მაგარი ფილმია, როგორც უმეტესი ქართული ფილმები, მაგრამ ამ პოსტს არანაირი კავშირი არ ააქვს ამ ფილმთან გარდა პოსტის სათაურისა 😉  მოკლედ განვიხილოთ რა გვინდა. ხშირად არის შემთხვევა როცა გვსურს ჩვენს საიტზე ქართველი ვიზიტორის დადგენა, ამის თითქმის ერთადერთი საშუალება არის ვიზიტორის ip-ის დადგენა, გარჩევა და შესაბამისი რეაგირება. არსებობს უცხოური რესურსები, რომლებიც გვაძლევენ მსოფლიო ip-ების სიას, დაჯგუფებულს ქვეყნების მიხედვით და შემდგომ შეგვიძლია მისი გარჩევა.
მე მინდა შემოგთავაზოთ შედარებით ლაკონური და უფრო სწრაფი მეთოდი ქართული Ip-ების აღმოსაჩენად. ამისთვის ვიღებთ ქართული Ip-ების ბაზას (29.05.2010-ის მდგომარეობით) , ვიგებთ ვიზიტორის Ip-ს, ვურევთ ერთმანეთში და ვიზიტორის Ip თუ არსად არ დაიკარგა ე.ი. ვიზიტორი ქართული Ip-დან არის.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'62.168.160.0/19','62.212.32.0/19','77.74.40.0/21',
'77.92.224.0/19','78.139.128.0/18','80.77.48.0/20',
'80.83.128.0/20','80.92.176.0/20','80.241.176.0/20',
'80.241.240.0/20','81.16.240.0/20','81.95.160.0/20',
'82.112.160.0/19','85.114.224.0/19','85.117.32.0/19',
'85.118.96.0/19','85.238.32.0/19','87.253.32.0/19',
'88.210.192.0/18','89.150.0.0/20','89.232.0.0/18',
'91.151.128.0/20','91.184.96.0/19','91.208.144.0/24',
'91.209.131.0/24','91.212.213.0/24','92.51.64.0/18',
'92.54.192.0/18','92.241.64.0/19','93.174.24.0/21',
'93.177.128.0/18','93.186.208.0/20','93.188.8.0/21',
'94.43.0.0/16','94.100.224.0/20','94.137.160.0/19',
'94.235.0.0/16','94.240.192.0/18','95.104.0.0/17',
'95.137.128.0/17','109.172.128.0/17','109.205.40.0/21',
'109.234.112.0/21','109.238.224.0/20','178.134.0.0/16',
'178.249.16.0/21','188.92.208.0/21','188.93.88.0/21',
'188.121.192.0/19','188.129.128.0/17','188.169.0.0/16',
'193.104.20.0/24','212.58.96.0/19','212.72.128.0/19',
'213.131.32.0/19','213.157.192.0/19','213.200.0.0/19',
'217.11.160.0/20','217.147.224.0/20','178.236.48.0/20'.

მოცემულ მაგალითში ip-ების ინტერვალის განმარტება გამოიყურება ესე –
81.95.160.0/20 = 81.95.160.0-81.95.175.255
ანუ მოცემული ინტერვალის საწყისი Ip არის 81.95.160.0 და
საბოლოოს ამ Ip + 2(32-20)

შემდეგ გამოვიყენებთ php-ის ჯადოსნურ ფუნქციას ip2long და მივიღებთ შეზავებულ ფუნქციას –

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function isGeorgianIp($userIp){

$_IPS = array( '62.168.160.0/19','62.212.32.0/19',
'77.74.40.0/21','77.92.224.0/19',
'78.139.128.0/18',
'80.77.48.0/20','80.83.128.0/20','80.92.176.0/20','80.241.176.0/20','80.241.240.0/20',
'81.16.240.0/20','81.95.160.0/20',
'82.112.160.0/19',
'85.114.224.0/19','85.117.32.0/19','85.118.96.0/19','85.238.32.0/19',
'87.253.32.0/19',
'88.210.192.0/18',
'89.150.0.0/20','89.232.0.0/18',
'91.151.128.0/20','91.184.96.0/19','91.208.144.0/24','91.209.131.0/24','91.212.213.0/24',
'92.51.64.0/18','92.54.192.0/18','92.241.64.0/19',
'93.174.24.0/21','93.177.128.0/18','93.186.208.0/20','93.188.8.0/21',
'94.43.0.0/16','94.100.224.0/20','94.137.160.0/19','94.235.0.0/16','94.240.192.0/18',
'95.104.0.0/17','95.137.128.0/17',
'109.172.128.0/17','109.205.40.0/21','109.234.112.0/21','109.238.224.0/20',
'178.134.0.0/16','178.249.16.0/21',
'188.92.208.0/21','188.93.88.0/21','188.121.192.0/19','188.129.128.0/17','188.169.0.0/16',
'193.104.20.0/24',
'212.58.96.0/19','212.72.128.0/19',
'213.131.32.0/19','213.157.192.0/19','213.200.0.0/19',
'217.11.160.0/20','217.147.224.0/20','178.236.48.0/20'); //ipbase 04.06.2010

$ip2long = array();
$userIp = ip2long($userIp);
foreach($_IPS as $ip){
list($sIp,$int) = split('/',$ip);
$fLongIp = ip2long($sIp);
$eLongIp = $fLongIp+pow(2,(32-$int));
if($userIp>=$fLongIp && $userIp< =$eLongIp) return true;
}
return false;
}

უკვე ფუნქციიდან მიღებული პასუხით შეგვიძლია შევასრულოთ ის რაც გვსურს (გვერდის გადამისამართება, ენის ავტომატური მინიჭება და.ა.შ. )

1
2
3
4
5
6
7
if (isGeorgianIp($_SERVER['REMOTE_ADDR'])==true){
header("Location: http://www.blog.readme.ge");
die();
} else {
header("Location: http://www.about.com");
die();
}

სულ ესაა. მაგრამ აქ არის ერთი ნიუანსიც – Ip-ების ბაზა რათქმაუნდა ცვალებადი, მატებადი და განახლებადია. შეძლებისდაგვარად შემოგთავაზებთ ip-ების განახლებულ ბაზას.
ცოცხალი მაგალითი

წარმატებულ იუზერ ქანთრი დეტექტს გისურვებთ 🙂

განახლება:
Ip-ების განახლბული ბაზის გადმოწერა შეგიძლიათ შემდეგი მისამართიდან – http://software77.net/geo-ip/
მარცხნივ Country IP listing-ში ვირჩევთ სასურველ ქვეყანას (Ge Georgia) და ვიწერთ.

.

კატეგორიებში: PHP, WEB, უბრალოდ მარტივი. |

9 გამოხმაურება “ქართველი ხარ ბიჭოო? :) ანუ User Country Detector”-ზე

  1. ალექსანდრე:

    კარგი სტატიაა. განახლებული მისამართების სია ხომ არ გაქვთ?

  2. ალექსანდრე:

    რადგან დაინტერესდი ახალი მისამართებით, მაქსიმუმ ხვალ დავდებ განახლებულ ბაზას.

  3. ოთო:

    მემგონი ეს უფრო მოხერხებულია იმ უპირატესობით რომ ბაზა არ გჭირდება:

    <?php

    $country = file_get_contents('http://ip2.cc/?api=cc&ip=127.0.0.1&#039;);

    echo $country; //GE

  4. ალექსანდრე:

    @ოთო
    პრინციპში გეთანხმები, იმიტომ რომ მალე ქართული ვარიანტიც ჩაირთვება ეგეთი

  5. ლევანი:

    გამარჯობა , მაქვს ესეთი კოდი და მინდა რომ ასევე დავაფიქსირო ქართველი და ქართული ფაილი ჩავურთო

    if(isset($_POST[‘submit’])) {
    require (“georgia/qartuli.php”);
    }

    მაქვს ეს და მინდა ესე, თუ დააჭირა მაგ კნოპკას && ან ქართველია ეგრევე რომ მისცეს require ესე არ გამოვა ? ჩVეულებრივ ჩავსვი ხოდა ერორი ამოაგდო

  6. ალექსანდრე:

    @ლევანი
    გამოვა, უბრალოდ რაღაც სხვა შეცდომა გაქვს.

  7. ლევანი:

    დამეხმარებით შედგენაში ?

  8. ლევანი:

    აქ არის კიდე რაღაცშეცდომა არ ამუშავა შეცდომააო

    $ip2long = array();
    $userIp = ip2long($userIp);
    foreach($_IPS as $ip){
    list($sIp,$int) = split(‘/’,$ip);
    $fLongIp = ip2long($sIp);
    $eLongIp = $fLongIp+pow(2,(32-$int));
    if($userIp>=$fLongIp && $userIp< =$eLongIp) return true;
    }
    return false;
    }

  9. ლევანი:

    მარტო ესეც რომ ჩავსვი შეცდომა დაწერა

    გთხოვ დამეხმარე რა როცა გეცლება.

დატოვე კომენტარი

...