انشاء كود التحقق او captcha:اعلان:
  

السلام عليكم اخواني .
كلنا يعرف او شاهد كود التحقق او ما يسمى بـ "captcha" و هي تستخدم عند التسجيل في الخدمات مثل "google mail ,hotmail" او عند التعليقات لكي يتم التعرف على رسائل التي تسمى بالسبام "spam"
مثلا التسجيل بعدد كبير من الحسابات أو ارسال عد من التعليقات فيتم استخدام ال"captcha" وهي اختصار ل
Completely Automated Public Turing test to tell Computers and Humans Apart
للتفريق بين الانسان والروبوت
وهذا الدرس سيشرح طريقة عمل كابتشا بسيطة بالتفصيل .
يوجد في الphp مكتبة تسمىGD وهي مسؤولة عن القيام بعمليات على الصور 
اول ما نقوم به هو انشاء "مقبض" للصورة لانشاء صورة نستخدم الدالة التالية :
 الكعبة 


[ltr]$image = imagecreatetruecolor(150, 60);[/ltr]


طبعا المدخل (انا ما لقيت كلمة مناسبة اكتر من هي  ) الاول عرض الصورة و الثاني الارتفاع
الصورة رح تكون بدون لون (لون اسود) ولكي نلونها بلون معين نضع


[ltr]$bgcolor = imagecolorallocate($image, 223, 225, 230);
imagefill($image, 0, 0, $bgcolor);
[/ltr]


السطر الاول ل"تركيب اللون" المدخل الاول هو "مقبض" الصورة و الثاني قيمة اللون الاحمر و الثالث قيمة اللون الاخضر و الرابع الازرق طبعا القيمة تتراوح بين 0 -255
و السطر الثاني المدخل الاول هو "مقبض" للصورة و الثاني سينات المكان المراد استخدام اللون فيه و الثالث العينات و الرابع اللون نفسو
حاليا فد قمنا بتهيئة الصورة اوليا الان سنقوم بانشاء الكود الذي سيكتب على الصورة و يجب على هذا الكود ان يكون عشوائيا فلذلك سنقوم باستخدام السطور التالية :
 حصان 


[ltr]$chars = 'abcdefghjkmnpqrstwxyz2345689';
for($x=0; $x<6; $x++)
{
$key .= $chars[mt_rand(0, 28)];
}
[/ltr]


 سبحان الله 
طبعا المتغير chars يحوي على بعض الاحرف و الارقام (لا يفضل استخدام الصفر و ال o و غيرها من الاحرف المتشابها ) 
طبعا حلقة for تكرر لست مرات و في كل مرة يضاف حرف الى المتغير key الاختيار العشوائي للحروف يتم باستخدام الدالة mt_rand المدخل الاول هو العدد الاصغر والثاني العدد الاكبر و هي تقوم باخذ قيمة عشوائية بينهما
الان لدينا المتغير $key فيه الكود المكون من 6 محارف
الخطوة التالية هي كتابة النص على الصورة 
 فاصل كتابي 


[ltr]$start_x_pos = 15;
$start_y_pos = 40;
for($y=0; $y<6;$y++)
{
$x_pos = $start_x_pos + $y*20;
$y_pos = $start_y_pos + (mt_rand(-10,+10));
$color = imagecolorallocate($image, mt_rand(0,128), mt_rand(0,128), mt_rand(0,128));
imagettftext($image,mt_rand(15,20),mt_rand(-10, 10), $x_pos,$y_pos,$color,'arial.ttf',$key[$y]);
}
[/ltr]


$start_x_pos و $start_y_pos هي احداثيات اول حرف من الحروف طبعا حلقة  علم مصر 
for من اجل كتابة كل حرف بلون مختلف و زاوية مختلفة و احداثيات مختلفة حتى تزداد صعوبة ادراكه من قبل بوت 
$x_pos السينات النهائية للحرف طبعا يتم حسابها باضافة مسافة تتناسب طردا مع ترتيب الحرف
$y_pos العينات النهائية طبعا تضاف اليها او تطرح منها قيمة عشوائية كي لا يكون للحروف جميعها نفس العينات
ال $color لا داعي لشرحها 


[ltr]imagettftext($image,mt_rand(15,20),mt_rand(-10, 10), $x_pos,$y_pos,$color,'arial.ttf',$key[$y]);[/ltr]


هذا اهم سطر يتستخدم لكتابة الحرف على الصورة المدخلات : موسيقي2  بسم الله  بسم الله 
الاول *** للصورة الثاني قياس الخط الثالث زاوية الكتابة الرابع السينات الخامس العينات السادس اللون
السابع مسار الخط يجب ان يكون لديك الخط في نفس المجلد و بنفس الاسم الذي قد قمت بتحديده او استخدم مسار اخر لملف الخط لديك
الثامن الحرف المراد طباعته
الان لكي نقوم بزيادة صعوبة قرائة الكود بالنسبة للبوت نقوم باضافة تاثير للتموج wave


[ltr]$new_image = imagecreatetruecolor(150, 60);
$bgcolor = imagecolorallocate($new_image, 223, 225, 230);
imagefill($new_image, 0, 0, $bgcolor);
$wave_rand = mt_rand(6, 10);
for($i=0;$i<149;$i++)
{
for($j=0;$j<59;$j++)
{
$color_here = imagecolorat($image, $i, $j);
if($color_here == $bgcolor)
{
$color_here = imagecolorallocate($image, 223, 225, 230);
}
$nx = $i - ($wave_rand * sin ((14-$wave_rand)*3.1495*$j/180));
imagesetpixel($new_image, $nx, $j, $color_here);
}
}
[/ltr]


قمنا بانشاء صورة جديدة حتى لا تختلط الصورتين مع بعضهم و وضعنا لون الخلفية نفس لون خلفية الصورة الاصلية ثم باستخدام حلقات ال for تم الوصول الة جميع بكسلات الصورة و من ثم تعديلها اذا لم تفهم السطر "المعقد" فانت لم تكن تحب المثلثات في الثانوي :happy: على كل حال يتم فيها كل بكسل حسب المعدلة المثلثية اللتي اغلبها فقط للتحويل من درجة الى راديانانا هنا لم استخدم دالة deg2rad فقط للتنويه
هنا اصبحت الصورة جاهزي الان لكي تظهر الصورة سنضع السطرين التاليين :


[ltr]header('Content-type: image/jpeg');
imagejpeg($new_image)
[/ltr]


طبعا بامكانك استخدام صيغة png اذا اردت
الان سنستخدم الجلسات لكي نحتفظ بقيمة الكود "المشفر بشفرة md5 طبعا"
لا ننسى السطر في اول الملف 


[ltr]session_start();[/ltr]


الان نقوم بتخزين الكود المشفر بمتحول 
شكل 


[ltr]$_SESSION['key'] = md5($key);[/ltr]


وفي حال اردنا التحقق من الكود نقوم بتشفير الكود الذي ادخله المستخدم و من ثم نتحقق من المساواة
لكي تظهر الصورة نستخدم 


[ltr][/ltr]


انا قمت ببرمجة class كامل مع مميزات كثير جدا لكن المشكلة ان البور سبلاي لجهازي قد احترقت قبل العيد بيومين و السكربت عليه و انا في سوريا و الاشتباكات كانت في اوجها في وقفة العيد فلم اتمكن من شراء واحدة :sad: إن شاء الله عندما اشغل جهازي ساعرضها عليكم لابداء ارائكم فيها  
صورة للدرس 
[url=http://arabteam2000-forum.com/uploads/monthly_10_2012/post-268329-005537200 1351467786.jpg][/url]  
 موسيقي2 
والسلام عليكم ورحمة الله وبركاته
 موسيقي2 اتمني ان يعجبكم الدرس موسيقي 
وا هام جدا موقع المهند نت تابع للمدونة

المصدر : المهند نت: http://almohaned14.clubme.net/t31-topic#ixzz3dtjjrzww
By