تبلیغات

قطعه کد بدست آوردن کشور از طریق IP در PHP + اطلاعات دیگر

گاهی اوقات نیاز است تا بدانیم که کاربر از چه کشوری وارد سایت ما شده است. برای مثال اگر بخواهیم خدماتمان را به کشور خاصی محدود کرده و یا کشوری را منع کنیم؛ یا آنکه بخواهیم به کاربر اطلاع دهیم که وبسایت ما ترافیک دانلود نیم‌بها داشته و درصورت استفاده از قندشکن، می‌تواند آن را خاموش کند.

قطعه کد

تابع زیر، علاوه بر بدست آوردن کشور مربوط به یک آی‌پی، می‌تواند اطلاعات دیگری را نیز در بر داشته باشد:

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "country_code":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

ورودی‌ها:

  • ip: آی پی مورد نظر که اگر مقدار آن یک آی پی صحیح نباشد، آی پی کاربر بازدید کننده از سایت درنظر گرفته خواهد شد.
  • purpose: هدف چیست؟! در حال حاظر می‌تواند مقادیر رشته‌ای زیر را در بربگیرید:
    • location: اطلاعاتی را در یک آرایه برمی‌گرداند که شامل city و state و country و country_code و continent و continent_code می‌‌باشد.
    • address: آدرس را برمی‌گرداند. (ممکن است تشخیص نداده و خالی باشد)
    • city: نام شهر را برمی‌گرداند. (ممکن است تشخیص نداده و خالی باشد)
    • state: نام منطقه را برمی‌گرداند. (ممکن است تشخیص نداده و خالی باشد)
    • region: مثل مقدرا قبل. می‌تواند این مورد را از داخل کد حذف کنید.
    • country: نام کشور را برمی‌گرداند. مثل Iran
    • country_code: کد کشور را برمی‌گرداند. مثل IR
  • deep_detect: اگر آی‌پی صحیح نباشد، اسکن دقیقی برروی بدست آوردن آی‌پی دقیق انجام شود.

مثال 1

در اینجا قصد داریم تا اطلاعات مختلفی را برای آی پی بازدید کننده بدست آوریم. مقدار Visitor یک مقدار دلخواه است تا داخل تابع درست تشخیص داده نشده و خود تابع آی‌پی بازدیدکننده را در نظر بگیرید. مقابل هرکدام یک خروجی مثال زده شده است که می‌تواند با توجه به آی پی، چیز دیگری باشد.

<?php

echo ip_info("Visitor", "country"); // India
echo ip_info("Visitor", "country_code"); // IN
echo ip_info("Visitor", "state"); // Andhra Pradesh
echo ip_info("Visitor", "city"); // Proddatur
echo ip_info("Visitor", "address"); // Proddatur, Andhra Pradesh, India

print_r(ip_info()); // Array ( [city] => Proddatur [state] => Andhra Pradesh [country] => India [country_code] => IN [continent] => Asia [continent_code] => AS )

?>

مثال 2

در اینجا برای یک آی‌پی خاصی عملیات انجام شده است:

<?php

echo ip_info("173.252.110.27", "country"); // United States
echo ip_info("173.252.110.27", "country_code"); // US
echo ip_info("173.252.110.27", "state"); // California
echo ip_info("173.252.110.27", "city"); // Menlo Park
echo ip_info("173.252.110.27", "address"); // Menlo Park, California, United States

print_r(ip_info("173.252.110.27", "location")); // Array ( [city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA )

?>

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

یه کلاسِ تعریف نشده ... فقط برای ارتباط کاری تلگرام پیام بدید ...

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک