دریافت آدرس آی پی کاربر و تشخیص کشور مربـوطـه
#1
Lightbulb 
به نام خـدا
سلام دوستان؛
امیدوارم ایام به کام باشه.....
حتماً براتون پیش اومده که بخواین آی پی آدرس کاربر رو در بازی دریافت کنین و روی اون پردازش هایی انجام بدین. حالا اون پردازش ها میتونن ذخیره آی پی کاربر مورد نظر در دیتابیس باشه یا نمایش آی پی به کاربر و یا حتی مسدود کردن دسترسی افرادی با آی پی غیر از ایران به بازی.....
من روی آخرین مورد یعنی شناسایی کشور آی پی کاربر تأکید دارم توی این تاپیک.....
میدونیم که هر کشور یک رنج (محدوده) آی پی مشخص براش تعریف شده هست. من یک کد php نوشتم که ضمن دریافت آی پی کاربر کشورش رو هم شناسایی میکنه و به همراهش نتیجه رو نمایش میده.....
شما میتونین از این مورد هر استفاده ای بکنین؛ یعنی مثلاً دسترسی کاربر به یک بخش یا مرحله رو محدود کنین و یا ......
دقت کنین که چون توی کشور ما همه از آی پی استاتیک استفاده نمیکنن بعد از هر بار روشن و خاموش کردن دستگاه و یا قطع و وصل اتصال به اینترنت شناسه آی پی تغییر میکنه پس نمیشه بهش به عنوان یک آیتم برای احراز هویت تکیه کرد.....

خُب بریم سر اصل مطلب!

در واقع من دو تا کد نوشتم؛
  • کد اول (ip.php) هست که با استفاده از API یک سایت معروف کشور آی پی شما رو تشخیص میده و بعد شناسه آی پی شما و همچنین کشور مربوطه اش رو توی دیتابیس در ردیف های ipaddress و country ذخیره میکنه......
  • کـد دوم (matrix_ip.php) هست که در واقع میاد بررسی میکنه که آیا کاربر آی پی اش ثبت شده داخل دیتابیس یا نه......
در اصل در فایل اول ذخیره آی پی و کشور مربوطه اش توی دیتابیس لازم نیست و من اینو برای کاربردی تر شدن لحاظ کردم و شما میتونین از اون تیکه ای که مربوط به ذخیره در دیتابیس هست صرف نظر کنین و کدهاش رو پاک کنین. پس حضور فایل دوم هم ضرورت زیادی نداره و در صورت اینکه توی دیتابیس خواستین آی پی ها و کشورهاشون ذخیره بشه میتونین ازش استفاده کنین....
تـوجه: این کدها روی لوکال هاست کار نمیکنن و اگر روی لوکال هاست ران کنین اشتباهاً آدرس آی پی لوکال هاست رو دریافت میکنین!

کد اول (ip.php
این کد کارش دریافت آی پی کاربر و همچنین نمایش کشور مربوطه (و در صورت استفاده از قابلیت ثبت آی پی ها و کشورهاشون در دیتابیس) حاوی پیغام موفقیت آمیز بودن ثبت رکورد در دیتابیس هست.
خروجی این کد (در صورت استفاده از قابلیت ثبت آی پی ها و کشورهاشون در دیتابیس) حاوی سه تا پارامتر هست که با یک bitwise or از هم جدا شدن. مثلاً اینطوریه:
127.0.0.1|New record created successfully|Iran
شما میتونین در داخل کانستراکت با استفاده از اکسپرشن tokenat مقدار آی پی یا کشور مربوطه رو از میان این رشته خروجی استخراج کنین به طوری که اگر بخواین آدرس آی پی رو استخراج کنین ایندکس (Index) اکسپرشن رو برابر با یک و اگر بخواین کشور مربوطه رو دریافت کنین ایندکس اکسپرشن رو برابر 0 قرار میدین.....
اما کد به این شرحه:

کد:
<?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", "
", "    ", " ", "-", "_"), 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 "countrycode":
                   $output = @$ipdat->geoplugin_countryCode;
                   break;
           }
       }
   }
   return $output;
}
echo ip_info($_SERVER['REMOTE_ADDR'],'country');
echo "|". $_SERVER['REMOTE_ADDR'];
//بخش مربوط به ثبت اطلاعات در دیتابیس (می توانید در صورت نیاز این بخش را پاک کنید و کد را خاتمه دهید)
$servername = "yourseveraddress";
$username = "yourusername";
$password = "yourpassword";
$dbname = "yourdatabasename";

$ipaddress = $_SERVER['REMOTE_ADDR'];
$country = ip_info($_SERVER['REMOTE_ADDR'],'country');
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
   die("Connection failed: " . $conn->connect_error);
}

$sql = "INSERT INTO your_table (ipaddress,country)
VALUES ('$ipaddress', '$country')";

if ($conn->query($sql) === TRUE) {
   echo "|New record created successfully";
} else {
   echo "|Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>
نکات فوق الذکـر:
  • در بخش ارسال به دیتابیس برخی عبارات به شکل "yourservername" یا "your_table" هستن که شما باید به جای اونا مشخصات مربوط به سرور و یا هاست خودتون رو وارد کنین.
  • همونطور که گفتم میتونین از بخشی که مشخص شده (که مربوط به ارسال دیتابیس هست) کدها رو حذف کنین و از قابلیت ارسال به دیتابیس صرف نظر کنین.

کد دوم (matrix_ip.php)
 این کد کارش اینه که بررسی کنه آیا شناسه آی پی و کشوری که وارد میکنیم در دیتابیس ثبت شده یا خیر.  
کد به این شرحه:

کد:
<?php
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$servername = "yourserveraddress";
$username = "yourusername";
$password = "yourpassword";
$dbname = "yourdatabasename";

//if (!isset($_GET['ipaddress']) || !isset($_GET['country']) {
   // die ("field does not exit !")  ;
//}
$ipaddress = $_GET['ipaddress']  ;
$country = $_GET['country'] ;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
mysqli_set_charset($conn,"utf8");
// Check connection
if ($conn->connect_error) {
   die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT ipaddress,country FROM `your_table` WHERE ipaddress='$ipaddress'and country='$country' ";


if($res = mysqli_query($conn, $sql))
{
   $rowcount=mysqli_num_rows($res);
  if ($rowcount > 0)
  {
    while($row = $res->fetch_assoc()) {
       echo "Item found!";
   }
  }else
  {
   echo "Not found!";
  }
}

$conn->close();
?>

  • نکات فوق الذکـر:
  • در بـعضی بخشها برخی عبارات به شکل  "yourservername" یا "your_table" هستن که شما باید به جـای اونا مشخصات مربوط به سرور و یا هاست خودتون رو وارد کنین.
  • خروجی این کد میتونه چندین پارامتر باشه. یعنی ممکنه بیش از یک بار رشته "Item found!" رو توی خروجی شاهد باشیم. دلیلش هم اینه که تعداد دفعاتی که عبارت "Item found!" رو مشاهده میکنیم در واقع تعداد دفعات ثبت شدن آی پی آدرس و کشور مربوطش (یا به عبارت دیگه تعداد دفعات ورود یک کاربر) رو نمایش میده که میتونیم با اکسپرشن tokencount این تعداد رو به دست بیاریم و پردازش لازم رو روش داشته باشیم. در نظر داشته باشین  اگر میخواین یک ایونتی بنویسین که توش بگین مثلاً Ajax.Lastdata برابر هست با "Item found!" باید از شرط equal to استفاده نکنین و بلکه از عبارت Greater than or equal to استفاده کنین. چرا که اگر شما شرط equal to رو لحاظ کنین و کاربر بیش از یک بار مشخصاتش ثبت شده باشه شرطی که گذاشتین بیانگر این هست که کاربر تنها یک بار مشخصاتش ثبت شده (به زبان ساده تر شرط شما این معنی رو داره که در خروجی یکبار عبارت "Item found!" رو می بینیم و مقدار خروجی دقیقاً برابر هست با مقدار "Item found!") در نتیجه ایونت تون به درستی کار نمیکنه و برای یک کاربری که مشخصاتش بیش از یک بار ثبت شده واکنشی نمیده!
  • برای اینکه بخواین تعداد دفعات ورود کاربر رو با اکسپرشن tokencount به دست بیارین باید از اکسپرشن به صورت زیر استفاده کنین:
کد:
tokencount(AJAX.Lastdata,"!")-1
دلیل اینکه حاصل به دست اومده از اکسپرشن رو منهای یک کردم این بود که نمیخواستم ورود کنونی کاربر هم لحاظ بشه، اگر شما میخواین این اتفاق بیفته کافیه از منهای یک کردن صرف نظر کنین.
نکته فوق العاده مـهم:
  • اگر قصد دارین شناسه آی پی کـاربر رو در داخل یک متغیر ذخیره کنین، حتمـاً نوع متغیر رو از نوع تکست (Text) انتخاب کنین. چون اگر نوع متغیر رو از نوع عددی (Number) انتخاب کنین فقط یک رقم از شناسه آی پی ذخیره میشه. در اصل یک IPV4 یک عدد ۳۲ بیتی است که برای سادگی آن را به شکل چهار بخش عددی در مبنای ده می‌نویسند که با نقطه از هم جدا می‌شوند (مانند ۱۹۹٫۲۱۱٫۴۵٫۵). این روش نشانی‌دهی را ده‌دهی نقطه‌دار می‌نامند هر یک از چهار بخش را یک هشتایی (Octet) می‌گویند زیرا طول آن ۸ بیت (یا ۱ بایت) است و می‌تواند عددی از ۰ تا ۲۵۵ باشد. پس ۲ به توان ۳۲ آدرس مختلف داریم. اگر خواستین شناسه آی پی رو در یک متغیر عددی ذخیره کنین باید حتمـاً آدرس آی پی رو به مبنای هشت (اوکتال) برگردونین تا آدرس آی پی تبدیل به یک عدد بشه. آموزش این کار رو قرار میدم......

من یک پروژه ساده توسعه دادم با استفاده از کدهایی که نوشتم و در اختیار شما عزیزان قرار دادم که آی پی کاربر رو بهش نمایش میده به همراه کشور مربوطش و بعد بهش میگه که برای اولین بار ورود داشته یا خیر و اگر برای چندمین بار ورود داشته بار چندمش هست.....
میتونین  ایـنجا آنلاین تست کنین.......

  • در نظر داشته باشین هاستی که روش آپلود کردم آی پی های غیر از ایران رو براش فیلتر کردم پس از ابزارهای تغییر آی پی و پروکسی و فیلترشکن استفاده نکنین که لینک براتون باز نمیشه و به یک صفحه نامربوط ریدایرکت میشین.....

در نهایت امیدوارم خوشتون اومده باشه.....
  • خـوشحال میشم نظراتتون رو بیان کنین 1
  • اگر براتون کاربردی بود سپاس فراموش نشه 4
غایب
  پاسخ


 سپاس شده توسط: mhp ، oak ، ghasem ، Morj7 ، mostafanastary ، M.gh ، persiangamer ، amin hosseini ، ᔕinaᗪehghani
#2
ممنونم
لازمم می شد
[تصویر:  default-yellow.svg]
غایب
  پاسخ


 سپاس شده توسط: Master Badfar
#3
(1398/11/17، 11:54 عصر)oak نوشته است: ممنونم
لازمم می شد
خواهش میکنم؛
راستش API که استفاده کردم دقتش نسبتاً بالاست و میتونه مناسب باشه....
خودم که هر چه circut با تور ساختم رو تونست کشور و آی پی رو بدون مشکل شناسایی کنه......
اگر استفاده کردین و عملکرد مطلوب رو نداشت حتماً اعلام کنین.....

غایب
  پاسخ


 سپاس شده توسط: oak ، M.gh ، ᔕinaᗪehghani
#4
خسته نباشی
داداش صندوق پیام هاتو میشه خالی کنی کارت دارم یا ایدی تلگرامتو بده اینجا بنویس یا برام بفرس
  پاسخ


 سپاس شده توسط: M.gh


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  لیست بسیار کامل از پابلیشرهای خارجی 2020 Mehrdad 16 10,687 1403/12/24، 08:04 عصر
آخرین ارسال: xcmpunkgtsx
  قبول کردن سفارش شما (:--ALI--:) 0 594 1403/1/30، 09:06 عصر
آخرین ارسال: (:--ALI--:)
  استخدام چند ردیف شغلی در تهران hasansanaei 0 755 1402/6/1، 02:13 عصر
آخرین ارسال: hasansanaei
Heart یلدا مبارک ? oak 2 2,449 1400/10/4، 09:46 عصر
آخرین ارسال: amin hosseini
  پرداخت درون برنامه M.Y 3 2,266 1400/9/27، 03:59 عصر
آخرین ارسال: mostafanastary

پرش به انجمن: