دکمه ی مسدود شده لایک فیسبوک را به کاربران ایرانی نشان ندهیم

ارسال شده توسط در تاریخ آذر ۲۰, ۱۳۹۰ در طبقه طراحی وب ۳ | نظر



فراموشم نکن ;)

تعمیر دکمه لایک فیسبوک

نمایش دادن یا ندادن محتوی خاص برای یک کشور موضوعیه که اسکریپت های زیادی برای اون نوشته شده. اما در حقیقت آموزشی یا اسکریپتی وجود نداره که بتونه دکمه لایک فیسبوک، توییتر و بقیه API های این سایت و بقیه ی سایت های مسدود شده در ایرانی رو از دید کاربرای ایرانی خارج کنه(جست و جوی من برای پیدا کردن اسکریپت بی فایده بود) و معمولاً کاربران ایرانی در این بخش از سایت یک صفحه کوچک با محتوای صفحه سایت دولتی پیوندها رو میبینند که قالب سایت رو بهم میزنه و معمولاً با بازکردن پاپ آپ ها(Pop up: پنجره های نا خواسته) باعث نارضایتی کاربر میشه.
من با امروزصبح تصمیم که این اسکریپت رو بنویسم و آموزشی برای نحوه کار و استفاده از اون بزارم. این ایده وقتی به ذهنم رسید که در هفته گذشته شاهد کند شدن شدید گوگل و در نتیجه تمام سایت های دارای دکمه پلاس ۱ در ایران شدم، مقاله وبشهر در این مورد بحث کرده. پس با توجه به اینکه تضمینی برای عادی شدن سرعت گوگل در آینده نزدیک وجود نداره تصمیم گرفتم کدی بنویسم که کاربران ایرانی در سایتم این دکمه رو نداشته باشند تا بتونند سرعت لود صفحه براشون بیشتر بشه و با لود نکردن دکمه لایک مانع از بهم خوردن ظاهر سایت بشند. البته کار اصلی این اسکریپت لود کردن/نکردن محتوای خاص برای کاربران ایرانیه. به تصاویر زیر نگاه کنید:

دکمه فیلتر شده لایک فیسبوک

باز نکردن APIها فیسبوک مثل دکمه لایک، فن باکس و توییتر و بقیه اجزای سایت های مسدود شده در ایران کاربرد اصلی این اسکریپت است و شما میتوانید به سادگی با یک تغییر ساده در اسکریپت کارکرد اون رو برعکس کنید یعنی محتوایی مخصوص کاربران ایرانی داشته باشید.

 

فلسفه

ما به دو صورت میتونیم قسمتی از صفحه وب رو مخفی کنیم:

۱)      استفاده از جاوا(Client Side)

2)      جلوگیری از اضافه شدن قسمت مورد نظر به صفحه در سمت سرور(Server Side)

گزینه اول به سادگی ممکنه اما معایبی داره: اول اینکه این روش سرعت رو بالا نمیبره و تنها اون قسمت رو از دید پنهان میکنه. دوم اینکه جاوااسکریپت ممکنه در مرورگر بازدیدکننده پشتیبانی نشه یا غیر فعال شده باشه.

گزینه دوم بهترین روش ممکنه: در این روش IP کشور بازدیدکننده را با لیست IPهای ایران مقایسه میکنیم و اگر IP متعلق به ایران بود دکمه لایک و بقیه قسمت های مورد نظر رو لود نمیکنیم. این روش در کسری از ثانیه  در سرور انجام داده میشه و فوق العاده سریع و بهینست. این روشیه که ما در اینجا استفاده میکنیم.

روشی هست که APIهایی مثل فیسبوک رو بشه به صورت کامل برای کاربران ایرانی نشان داد و کاملاً فعال باشه ولی از دو جهت من این رو توصیه نمیکنم و آموزش نخواهم داد. یکی اینکه ممکن بعضی بازدبدکنندها با توجه به صافی که برای اینترنت کشور تعبیه شده انتظار نداشته باشند که از سایت شما توسط فیسبوک رهگیری بشند و دوم اینکه دسترسی به سایت هایی که در ایران مسدود شده از طرف شخص سوم(یا به هر صورت) خلاف جرایم رایانه ایه و شما(شخص سوم) قابل تعقیب خواهید بود، پس بهتره قوانین رو رعایت کنیم.

نحوه کار اسکریپت

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

لیست IPهای ایران

ما در قدم اول باید رنج IPهای ایران رو داشته باشیم که بتونیم IPبازدیدکننده رو با اون مقایسه کنیم. تهیه این لیست برای من بیشتر از کل کد نویسی طول کشید. من این لیست رو در یک آرایه به صورت کد زیر قرار دادم.

$ips[1] = array (42991616,45088768,520568832,520585216,521717760);
$ips[2] = array (43253759,46137343,520585215,520589311,521719807);

البته کد بالا فقط برای آموزش و اسکریپت اصلی که در انتهای مقالست لیست کامل رنج IPهای ایرانی رو داره و در آخر از اون استفاده کنید. شاید فکر کنید که اینها IP نیستند. درسته IP نسخه ۴  قالبی به صورت x.x.x.x داره که هر x یک بایت(عدد ۰ تا ۲۵۵)، پس داستان این عددها چیه؟ این عددها حالت ترکیب صحیح IP هستند. این کار در PHP با تابع ip2long و برعکسش با long2ip انجام میشه. برای مثال رنج IPهای اول(اعداد ۴۲۹۹۱۶۱۶ تا ۴۳۲۵۳۷۵۹) به این روش قابل کشفند:

echo long2ip(42991616) . " to " . long2ip(43253759);

 

که خروجی  ۲٫۱۴۴٫۰٫۰ to 2.147.255.255 رو به ما نشون میده و در واقعیت هم این رنج IPها متعلق به سایتها و کاربران ایرانیه. البته تعداد رنج های IP ایران ۲۶۳ تاست که در انتهای کار از لیست کامل استفاده میکنیم.

البته ما برای سریعتر کردن محاسباتمون از حالت عددی استفاده میکنیم. با این روش اسکریپت کوچکتر و پردازش سریعتر میشه.

 کشف IP کاربر

 در این مرحله IP کاربر رو بدست میاریم. این قطعه کد:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
		$TheIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
	else
		$TheIp=$_SERVER['REMOTE_ADDR'];
$TheIp=ip2long(trim($TheIp));

این اسکریپت کوچک IP آدرس واقعی بازدید کننده از سایتون رو بدست میاره. البته

$TheIp=$_SERVER['REMOTE_ADDR'];

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

 الگریتم جست و جو

حالا که ما لیست کامل رنج IPها رو داریم میتونیم جست و جو رو شروع کنیم. من برای این کار یک الگریتم ساده جست و جوی خطی نوشتم. این الگریتم بهینه شدست  و به محض کشف IP تو لیست رنج ها جست و جو رو قطع میکنه. البته روش جست و جوی باینری و درختی نسبتاً سریعتره ولی چون آرایه ما فقط ۲۶۳ تا ایندکس با محتوای عددی داره و خیلی سریعه ترجیه دادم از روش ساده تر استفاده کنم.

$IPsCount = IPsCount($IPs[1]);
$IranIPsFound=false;
for ($i = 0; $i <= $IPsCount; $i++) {
	if ($TheIp>=$IPs[1][$i]){
		if  ($TheIp<=$IPs[2][$i]){
			$ IranIPsFound =true;
			break;
		}
	}else if($TheIp<$IPs[1][$i]){$ IranIPsFound=false;break;}
}
unset($IPs);

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

ما تا اینجا فهمیدیم که آیا بازدید کننده ایرانی هست یا نه؟ متغیر IranIPsFound در صورت true بودن نشان میده که IP ما ایرانیه و در آخر تصمیم میگیریم که چکار کنیم. فرمان آخر هم آرایه رو پاک میکنه تا حافظه کمتری در سرور مصرف بشه.

نشان دادن/ندادن محتوا به کاربر ایرانی

در اینجا کدی رو قرار میدیم که تصمیم گیرنده نهاییه. در صورتی که مقدار مقایسه شرطی در دستور if مقدار false باشه مثل مثال زیر این محتوا برای کاربران غیر ایرانی به نمایش در میاد و شما میتونید دکمه لایک فیسبوک، جعبه توییتر و … رو در داخلش قرار بدید.

<?php
if ($IranIPsFound==false){
?>
</br><p>این کد به کاربران ایرانی نمایش داده نخواهد شد</p></br>
<?php
}
?>

اسکریپت نهایی

این اسکریپت کامله که لیست کامل رنج IPهای ایران در اون قرار داده شده و برای جلوگیری از اختلال به خاطر هم نام بودن متغیر ها به نام تمام متغیرها پیشوندی اضافه کردم که مشکلی برای دوستان غیر برنامه نویس پیش نیاد.

<?php
$ips[1] = array (42991616,45088768,520568832,520585216,521717760,521725952,521754624,521758720,521764864,521791488,522002432,522715136,523182080,523763712,528658432,531247104,531355648,532185088,532770816,532779008,534368256,772995072,773148672,773605376,773849088,774004736,774021120,774135808,774275072,778305536,781123584,781459456,782516224,783792128,785448960,786432000,787808256,788013056,788094976,788242432,788518912,1044152320,1046904832,1052835840,1054629888,1294237696,1296908288,1298677760,1307394048,1307418624,1307959296,1311113216,1315815424,1315860480,1315897344,1318723584,1318920192,1319018496,1333723136,1334099968,1336578048,1336901632,1346547712,1346760704,1346859008,1347092480,1354694656,1358036992,1358790656,1358794752,1359740928,1360797696,1360801792,1360916480,1361027072,1361031168,1361043456,1364889600,1364951040,1364955136,1369636864,1382268928,1383268352,1402191872,1412415488,1425080320,1426669568,1427046400,1434812416,1438187520,1439039488,1446576128,1449992192,1466630144,1475137536,1475846144,1475903488,1485250560,1502642176,1503985664,1505280000,1507676160,1508589568,1533149184,1538801664,1538965504,1540258304,1540327936,1540400384,1540485632,1540624384,1540625152,1540684800,1540883456,1540964352,1541164800,1541325824,1541434880,1541451776,1541485568,1541595136,1541717248,1541789184,1541808128,1541947392,1541948416,1541949440,1542010880,1546268672,1546780672,1547546624,1547612160,1559412736,1567490048,1572739072,1581940736,1583710208,1583722496,1583738880,1586208768,1588985856,1589116928,1589149696,1592305664,1592885248,1596325888,1599111168,1599160320,1599209472,1599225856,1602369536,1602416640,1603198976,1833484288,1833623552,1834956800,1834958848,1835868160,1835966464,1835999232,1836761088,1836941312,1839366144,1841889280,1842061312,1843494912,1843806208,1844359168,1844379648,2151784448,2156658688,2193180672,2197798912,2453831680,2654648320,2668912640,2684297216,2765563904,2765568000,2765586432,2953592832,2955837440,2956496896,2956890112,2957197312,2959417344,2959421440,2959532032,2967277568,2967289856,2987730944,2987761664,2987804672,2994929664,2996633600,2997714944,3000434688,3000754176,3001819136,3001991168,3002044416,3002607616,3002847232,3002892288,3002925056,3156344832,3159048192,3160227840,3161866240,3162071040,3162079232,3162406912,3163062272,3164471296,3166679040,3170172928,3170697216,3238562560,3239884032,3244824064,3244872704,3244884480,3244885504,3244999680,3250420224,3258770432,3264386048,3269525504,3272902656,3277372416,3278775808,3281133568,3282739968,3284093440,3285396480,3287631360,3556884480,3557834752,3558981632,3560103936,3562012672,3562422272,3563028480,3564683264,3583213568,3585081344,3585089536,3585097728,3586326528,3587162112,3587776512,3588857856,3641380864,3642265600,3642306560,3644887040,3645030400,3645034496,3650277376,3651858432,3651952640,3652063232,3654942720);
$ips[2] = array (43253759,46137343,520585215,520589311,521719807,521727999,521756671,521760767,521766911,521793535,522010623,522717183,523190271,524025855,528662527,531251199,531357695,532201471,532772863,532783103,534370303,772997119,773152767,773607423,773857279,774012927,774029311,774143999,774283263,778371071,781189119,781463551,782532607,783794175,785514495,786563071,787841023,788021247,788103167,788250623,788520959,1044185087,1046908927,1052844031,1054638079,1294270463,1296924671,1298694143,1307402239,1307426815,1307963391,1311244287,1315819519,1315864575,1315901439,1318731775,1318928383,1319026687,1333755903,1334108159,1336580095,1336918015,1346551807,1346764799,1346863103,1347096575,1354760191,1358041087,1358794751,1358798847,1359773695,1360801791,1360805887,1360920575,1361031167,1361035263,1361051647,1364893695,1364955135,1364959231,1369638911,1382285311,1383276543,1402208255,1412431871,1425096703,1426685951,1427062783,1434845183,1438253055,1439055871,1446608895,1450000383,1466695679,1475139583,1475854335,1475911679,1485254655,1502658559,1504018431,1505288191,1507680255,1508605951,1533280255,1538809855,1538973695,1540258815,1540328447,1540400639,1540485887,1540624639,1540625407,1540685055,1540883711,1540964863,1541165055,1541326847,1541435391,1541452287,1541486591,1541595647,1541717503,1541789695,1541808383,1541948415,1541948927,1541950463,1542011903,1546270719,1546797055,1547550719,1547616255,1559420927,1567555583,1572741119,1581957119,1583714303,1583726591,1583742975,1586216959,1589116927,1589149695,1589182463,1592307711,1592901631,1596391423,1599127551,1599176703,1599225855,1599242239,1602371583,1602418687,1603203071,1833488383,1833627647,1834958847,1834960895,1835876351,1835974655,1836007423,1836777471,1836957695,1839398911,1841897471,1842069503,1843511295,1843822591,1844363263,1844383743,2151792639,2156691455,2193182719,2197815295,2453833727,2654650367,2668916735,2684299263,2765565951,2765570047,2765619199,2953596927,2955845631,2956500991,2956892159,2957201407,2959421439,2959423487,2959540223,2967281663,2967291903,2987732991,2987763711,2987806719,2994995199,2996649983,2997747711,3000451071,3000758271,3001823231,3001995263,3002048511,3002609663,3002849279,3002908671,3002941439,3156410367,3159064575,3160229887,3161882623,3162079231,3162087423,3162415103,3163095039,3164602367,3166681087,3170238463,3170729983,3238562815,3239884287,3244824319,3244872959,3244884735,3244885759,3245000703,3250420735,3258771455,3264387071,3269591039,3272902911,3277372927,3278776319,3281141759,3282740223,3284093951,3285397503,3287631871,3556886527,3557842943,3558989823,3560112127,3562020863,3562430463,3563036671,3564691455,3583221759,3585089535,3585097727,3585114111,3586342911,3587178495,3587784703,3588866047,3641384959,3642269695,3642310655,3644891135,3645034495,3645038591,3650281471,3651862527,3651960831,3652067327,3655073791);
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$TheIp=$_SERVER['HTTP_X_FORWARDED_FOR'];else $TheIp=$_SERVER['REMOTE_ADDR'];
$TheIp=ip2long(trim($TheIp));
$count = count($ips[1]);$found=false;
for ($i = 0; $i <= $count; $i++) {
	if ($TheIp>=$ips[1][$i]){
		if  ($TheIp<=$ips[2][$i]){
			$found=true;
			break;
		}
	}else if($TheIp<$ips[1][$i]){$found=false;break;}
}
unset($ips);
if ($found==false){
?>

<p dir="rtl">این نوشته به کاربران ایرانی نمایش داده نخواهد شد</p></br>
<!-- شما میتوانید دکمه فیسبوک یا توییتر را در این قسمت قرار دهید-->

<?php
}else{
?>

<p dir="rtl">این اسکریپت IP شما را جزو IPهای ایران تشخیص داد.</p>
<!--شما با حذف این قسمت میتوانید چیزی به کاربران ایرانی نشان ندهید یا کد یا متن خاصی را فقط به کاربران ایرانی نشان دهید-->

<?php
}
?>

دو نمونه، دو نکته

دکمه لایک فیسبوک و گوگل+1

نمونه ها

یکی همین سایت شهر فناوری(تکنوپلیس) که این اسکریپت رو توش جاسازی کردم تا در صورتی که شما از ایران وارد این سایت شدید و IP ایران دارید کدهای Java SDK، API فیسبوک و دکمه ی گوگل+۱ و کل نوار بوکمارک  سایت(تصویر مقابل) براش لود نشه. حتی اگر به سورس سایت هم نگاه کنید اثری از کد این سایت ها رو نمیبینید. اینطوری در حال حاضر که دکمه ی لایک فیسبوک مسدود و دکمه گوگل+۱ شدیداً باعث کندی سرعت لود سایت میشه این قسمت برای کاربرای ایرانی لود  نمیشه ولی در صورتی که شما از ابزارهایی مثل VPN و پراکسی استفاده میکنید این نوار رو در سمت چپ سایت میبینید.(تعداد چند هزار تایی +۱ها و likeها نشون میده من چرا این کد رو نوشتم!)

 

و دوم کل کد در قالب PHP برای دانلود و دموی اونه:

نمونه این اسکریپت: دمو

دریافت اسکریپت: دانلود

در صورتی که برای شما سوالی در مورد برنامه نویسی تحت وب، وردپرس، مدیریت سایت، سئو یا شبکه های اجتماعی دارید میتوانید از سایت سوال و جواب برنامه نویسی و طراحی وب سوالات خود را مطرح کنید و پاسخ سوالات خود را از برنامه نویسان و طراحان وب دریافت کنید.

نکته ها

منبع پایگاه داده IPهای استفاده شده در این اسکریپت از سایت software77.net و تحت لیسانس GPL است. این سایت هیچ گونه مسئولیتی در قبال این دیتابیس به عهده نگرفته.

این اسکریپت تحت لیسانس Creative Commons منتشر شده. شما مجاز به هرگونه استفاده، تغییر و بهره برداری از این کد(با مسئولیت خود) هستید. اما انتشار آن تنها با معرفی لینک به سایت تکنوپلیس ممکن است.

۳ نظر در مورد “دکمه ی مسدود شده لایک فیسبوک را به کاربران ایرانی نشان ندهیم”

  1. نظر پژوهشکده ی فرهنگی سیاسی سیاه جامگان خراسان:

    سلام استاد
    گرفتم منظورت چیه و بسیار خاص و جالب بود تبریک عذض میکنم بهتون یه ضرب المثل داریم که میگه : اینو کجای دلم بذارم……….حتمن اینو شنیدی لینک به سایتهای شیلتر شده جرمه اینو چیکار کنم؟
    قسمت آخر حرفت در مورد تعداد لایکهات جک بود نه؟ .. در ضمن چجوری میتونم این قسمتی که برای لایک و اینجور چیزا الان برام بازه رو برای سایت خودمون درست کنیم؟

  2. سلام.
    مطلب بسیار مفید و کاربردی بود.
    Thanks

  3. پکیج سیستم نظرات شما عالیست. اگر امکان دارد افزونه آنرا معرفی کنید.

Trackbacks/Pingbacks

  1. ابزارک پیشرفته ایرانیان برای وردپرس | تکنوپلیس - [...] تا به حال از آن بهرمند نبودند. این افزونه با استفاده از الگریتم تشخیص کاربران ایرانی به شما این …