به نام خـدا
سلام دوستان؛
امیدوارم ایام به کام باشه.....
حتماً براتون پیش اومده که بخواین آی پی آدرس کاربر رو در بازی دریافت کنین و روی اون پردازش هایی انجام بدین. حالا اون پردازش ها میتونن ذخیره آی پی کاربر مورد نظر در دیتابیس باشه یا نمایش آی پی به کاربر و یا حتی مسدود کردن دسترسی افرادی با آی پی غیر از ایران به بازی.....
من روی آخرین مورد یعنی شناسایی کشور آی پی کاربر تأکید دارم توی این تاپیک.....
میدونیم که هر کشور یک رنج (محدوده) آی پی مشخص براش تعریف شده هست. من یک کد php نوشتم که ضمن دریافت آی پی کاربر کشورش رو هم شناسایی میکنه و به همراهش نتیجه رو نمایش میده.....
شما میتونین از این مورد هر استفاده ای بکنین؛ یعنی مثلاً دسترسی کاربر به یک بخش یا مرحله رو محدود کنین و یا ......
دقت کنین که چون توی کشور ما همه از آی پی استاتیک استفاده نمیکنن بعد از هر بار روشن و خاموش کردن دستگاه و یا قطع و وصل اتصال به اینترنت شناسه آی پی تغییر میکنه پس نمیشه بهش به عنوان یک آیتم برای احراز هویت تکیه کرد.....
خُب بریم سر اصل مطلب!
در واقع من دو تا کد نوشتم؛
تـوجه: این کدها روی لوکال هاست کار نمیکنن و اگر روی لوکال هاست ران کنین اشتباهاً آدرس آی پی لوکال هاست رو دریافت میکنین!
کد اول (ip.php)
این کد کارش دریافت آی پی کاربر و همچنین نمایش کشور مربوطه (و در صورت استفاده از قابلیت ثبت آی پی ها و کشورهاشون در دیتابیس) حاوی پیغام موفقیت آمیز بودن ثبت رکورد در دیتابیس هست.
خروجی این کد (در صورت استفاده از قابلیت ثبت آی پی ها و کشورهاشون در دیتابیس) حاوی سه تا پارامتر هست که با یک bitwise or از هم جدا شدن. مثلاً اینطوریه:
127.0.0.1|New record created successfully|Iran
شما میتونین در داخل کانستراکت با استفاده از اکسپرشن tokenat مقدار آی پی یا کشور مربوطه رو از میان این رشته خروجی استخراج کنین به طوری که اگر بخواین آدرس آی پی رو استخراج کنین ایندکس (Index) اکسپرشن رو برابر با یک و اگر بخواین کشور مربوطه رو دریافت کنین ایندکس اکسپرشن رو برابر 0 قرار میدین.....
اما کد به این شرحه:
نکات فوق الذکـر:
کد دوم (matrix_ip.php)
این کد کارش اینه که بررسی کنه آیا شناسه آی پی و کشوری که وارد میکنیم در دیتابیس ثبت شده یا خیر.
کد به این شرحه:
دلیل اینکه حاصل به دست اومده از اکسپرشن رو منهای یک کردم این بود که نمیخواستم ورود کنونی کاربر هم لحاظ بشه، اگر شما میخواین این اتفاق بیفته کافیه از منهای یک کردن صرف نظر کنین.
نکته فوق العاده مـهم:
من یک پروژه ساده توسعه دادم با استفاده از کدهایی که نوشتم و در اختیار شما عزیزان قرار دادم که آی پی کاربر رو بهش نمایش میده به همراه کشور مربوطش و بعد بهش میگه که برای اولین بار ورود داشته یا خیر و اگر برای چندمین بار ورود داشته بار چندمش هست.....
میتونین ایـنجا آنلاین تست کنین.......
در نهایت امیدوارم خوشتون اومده باشه.....
سلام دوستان؛
امیدوارم ایام به کام باشه.....
حتماً براتون پیش اومده که بخواین آی پی آدرس کاربر رو در بازی دریافت کنین و روی اون پردازش هایی انجام بدین. حالا اون پردازش ها میتونن ذخیره آی پی کاربر مورد نظر در دیتابیس باشه یا نمایش آی پی به کاربر و یا حتی مسدود کردن دسترسی افرادی با آی پی غیر از ایران به بازی.....
من روی آخرین مورد یعنی شناسایی کشور آی پی کاربر تأکید دارم توی این تاپیک.....
میدونیم که هر کشور یک رنج (محدوده) آی پی مشخص براش تعریف شده هست. من یک کد 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) میگویند زیرا طول آن ۸ بیت (یا ۱ بایت) است و میتواند عددی از ۰ تا ۲۵۵ باشد. پس ۲ به توان ۳۲ آدرس مختلف داریم. اگر خواستین شناسه آی پی رو در یک متغیر عددی ذخیره کنین باید حتمـاً آدرس آی پی رو به مبنای هشت (اوکتال) برگردونین تا آدرس آی پی تبدیل به یک عدد بشه. آموزش این کار رو قرار میدم......
من یک پروژه ساده توسعه دادم با استفاده از کدهایی که نوشتم و در اختیار شما عزیزان قرار دادم که آی پی کاربر رو بهش نمایش میده به همراه کشور مربوطش و بعد بهش میگه که برای اولین بار ورود داشته یا خیر و اگر برای چندمین بار ورود داشته بار چندمش هست.....
میتونین ایـنجا آنلاین تست کنین.......
- در نظر داشته باشین هاستی که روش آپلود کردم آی پی های غیر از ایران رو براش فیلتر کردم پس از ابزارهای تغییر آی پی و پروکسی و فیلترشکن استفاده نکنین که لینک براتون باز نمیشه و به یک صفحه نامربوط ریدایرکت میشین.....
در نهایت امیدوارم خوشتون اومده باشه.....
- خـوشحال میشم نظراتتون رو بیان کنین
- اگر براتون کاربردی بود سپاس فراموش نشه