AL Master الــمــديــر الــعــامــ
المساهمات : 646 تاريخ التسجيل : 10/11/2010
| موضوع: طريقة عمل الكابتشا بأسهل الطرق الجمعة نوفمبر 12, 2010 1:12 pm | |
| بسم الله الرحمن الرحيم السلام عليكم ورحمة وبركاته في درس اليوم سنتناول طريقة عمل الكابتشا أو التحقق بالصورة بأسهل الطرق الممكنه اولا نرتب أفكارنا هنا اكثر من طريقة لعمل الكابتشا ولكن ماهي الكابتشا الكابتشا هي عبارة عن سؤال وإجابة ويمكن عمل ذلك بأكثر من طريقه سواء بعمل صورة او عمل سؤال واجابة ويمكن عمل ذلك بأكثر من طريقة اما بقاعدة البيانات مثلا او عن طريق السيزون وبما اننا نحاول قدر الامكان تخفيف الاستعلامات عن قاعدة البيانات فسأقوم بشرح طريقة عمل الكابتشا عن طريق السيزون اذن خطوات العمل 1 - إنشاء كود عشوائي 2 - وضع هذا الكود في صورة 3 - إنشاء سيزون بهذا الكود 4 - عرض الكود 5 التحقق من الكود اذن لنقوم بعمل كلاس بسيط جدا يقوم بهذه المهمه على الطريقه التالية رمز PHP: class Captcha { // الأكواد هنا } ثانيا نقوم بعمل مفردات الكلاس التي سنحتاجها وهي 1- الكود 2 - طول الصورة 3 - عرض الصورة ليصبح الكلاس كالتالي رمز PHP: class Captcha { protected $code; // كود التحقق الذي سيظهر في الصورة ويحمله السيزون protected $width = 35; // ؟؟ عرض الصورة protected $height = 150; // إرتفاع الصورة
} ثالثا نقوم بعمل الكنسرتكتور للكلاس وهو دالة إنشاء الكلاس التي تقوم بتنفيذ بعض المهام عند استدعاء الكلاس وفي هذه الحالة ستقوم هذه الدالة بعمل شيء واحد فقط وهو انشاء الكود العشوائي الذي سيتم تعيينه الى صورة التحقق وهناك اكثر من طريقه لعمل كود عشوائي هذه هي إحداها رمز PHP: function __construct() { $this->code = substr(sha1(mt_rand()), 17, 6); } وبالتالي يصبح الكلاس كالتالي رمز PHP: class Captcha { protected $code; // كود التحقق الذي سيظهر في الصورة ويحمله السيزون protected $width = 35; // ؟؟ عرض الصورة protected $height = 150; // إرتفاع الصورة function __construct() { $this->code = substr(sha1(mt_rand()), 17, 6); }
} اذن انتهينا من الاعدادات وكود التحقق نحتاج الى دالة بداخل الكلاس تعود لنا بالكود الذي تم انشاؤه من قبل الكونستركتور يعني دالة ترجع بالكود الذي تم إنشاؤه وهي سهله جدا بما ان الكود هو أحد متغيرات الكلاس فكل ما نحتاجه انها تعود به فقط وهي ما سيتم إستخدامها خارج الكلاس لجلب الكود لعملية التحقق والدالة كالتالي رمز PHP: function getCode(){ return $this->code; } وهي ايضا يمكن دمجاه مع الكنستركتور لانها تعود بقيمة الكنتسركتور لكن كنوع من النظام فاننا نقوم بعملها في دالة لحالها اذ ربا تحتاج الى اداء بعض العمليات في المستقبل على الكود فيفضل فصله في دالة لوحده اذن اصبح الكلاس كالتالي رمز PHP: class Captcha { protected $code; // كود التحقق الذي سيظهر في الصورة ويحمله السيزون protected $width = 35; // ؟؟ عرض الصورة protected $height = 150; // إرتفاع الصورة function __construct() { $this->code = substr(sha1(mt_rand()), 17, 6); }
function getCode(){ return $this->code; } } أخيرا بقى دالة واحده فقط وهي دالة التي تقوم بإنشاء الصورة ودمج الكود فيها وهي تحتاج بعض النظام ولنمشي على الخطوات التالية :1 اولا إنشاء صورة بالطول والعرض المحدد في الكلاس رمز PHP: $image = imagecreatetruecolor($this->height, $this->width); ثانيا جلب بعض المتغيرات عن هذه الصورة التي تم إنشاؤها مثل الطول والعرض الحقيقي لها والهدف من هذا هو عمل بعض الإضافات العشوائية على الصورة بحيث لا تصبح الخلفية بيضاء كنوع من أنواع التصعيب وهي كالتالي رمز PHP: $width = imagesx($image); $height = imagesy($image); ثالثا عمل بعض أكواد الالوان العشوائية إستنادا الى الصورة التي تم إنشاؤها كود إنشاء البقعه السوداء رمز PHP: $black = imagecolorallocate($image, 0, 0, 0); كود إنشاء بقعه بيضاء رمز PHP: $white = imagecolorallocate($image, 255, 255, 255); كود إنشاء بقعه حمراء (( نلاحظ هنا اننا استخدمنا الدالة imagecolorallocatealpha وهي تحتاج الى مكتبة GD 2 أو أعلى رمز PHP: $red = imagecolorallocatealpha($image, 255, 0, 0, 75); كود إنشاء بقعه خضراء رمز PHP: $green = imagecolorallocatealpha($image, 0, 255, 0, 75); كود إنشاء بقعه زرقاء رمز PHP: $blue = imagecolorallocatealpha($image, 0, 0, 255, 75); ولمزيد عن الدوال السابقه من الرابط التالي http://www.php.net/manual/en/functio...ocatealpha.phphttp://www.php.net/manual/en/functio...orallocate.phpوما نلاحظه في الدوال السابقه اننا نعطيها أكود الالوان التي تريد ويمكنك إنشاء المزيد من الالوان على حسب البارميترات التي تعطيها للدالة ومن ثم نقوم بعمل صورة مربعه بيضاء خالية تماما بالمقاسات السابقه عن طريق الدالة imagefilledrectangle وطبعا نعطيها كود اللون الابيض الذي قمنا بانشاؤه سابقا كالتالي رمز PHP: imagefilledrectangle($image, 0, 0, $width, $height, $white); ومن ثم نقوم بدمج بقع الالوان العشوائية الى الصورة السابقه ولن نحدد مكان ثابت للبقع بل مكان عشوائي كل مرة عن السابقه وهو عن طريق تغيير الاحداثيات كالتالي رمز PHP: imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $red); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $green); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $blue); ثم نقوم بعمل إطار لهذه الصورة وليكن لونه أسود وفي هذه العملية يتم التعامل مع كل ضلع من أضلاع الصورة لوحده ليتم رسم الإطار إليه كالتالي رمز PHP: imagefilledrectangle($image, 0, 0, $width, 0, $black); imagefilledrectangle($image, $width - 1, 0, $width - 1, $height - 1, $black); imagefilledrectangle($image, 0, 0, 0, $height - 1, $black); imagefilledrectangle($image, 0, $height - 1, $width, $height - 1, $black); وطبعا يمكن تجاوز الخطوة السابقه لالغاء عمل اطار الصورة او تغيير لونه (( براحتك يعني )) الى هنا الكود السابق يقوم بإنشاء صورة كهذه ما بقى هو ادارج الكود العشوائي الى الصورة وسنستخدم هنا الدالة imagestring كالتالي رمز PHP: imagestring($image, 10, intval(($width - (strlen($this->code) * 9)) / 2), intval(($height - 15) / 2), $this->code, $black); وقمنا يتحديد الخيارات ان حجم الخط 10 ثم إحداثيات الكود من أسفل وأعلى لكي يظهر بالضبط في المنتصف ومن ثم الكود ومن ثم لون الكود وبالتالي تعيين الهيدر الى نوعيه الصورة ومن ثم عرض الصورة ثم تدمير الصور من المتصفح كالتالي رمز PHP: header('Content-type: image/jpeg'); imagejpeg($image); imagedestroy($image); وبهذا تكون الدالة إنتهت وكذلك الكلاس وتكون الدالة في داخل الكلاس كالتالي رمز PHP: class Captcha { protected $code; protected $width = 35; protected $height = 150;
function __construct() { $this->code = substr(sha1(mt_rand()), 17, 6); }
function getCode(){ return $this->code; }
function showImage() { $image = imagecreatetruecolor($this->height, $this->width);
$width = imagesx($image); $height = imagesy($image); $black = imagecolorallocate($image, 0, 0, 0); $white = imagecolorallocate($image, 255, 255, 255); $red = imagecolorallocatealpha($image, 255, 0, 0, 75); $green = imagecolorallocatealpha($image, 0, 255, 0, 75); $blue = imagecolorallocatealpha($image, 0, 0, 255, 75); imagefilledrectangle($image, 0, 0, $width, $height, $white); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $red); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $green); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $blue);
imagefilledrectangle($image, 0, 0, $width, 0, $black); imagefilledrectangle($image, $width - 1, 0, $width - 1, $height - 1, $black); imagefilledrectangle($image, 0, 0, 0, $height - 1, $black); imagefilledrectangle($image, 0, $height - 1, $width, $height - 1, $black); imagestring($image, 10, intval(($width - (strlen($this->code) * 9)) / 2), intval(($height - 15) / 2), $this->code, $black); header('Content-type: image/jpeg'); imagejpeg($image); imagedestroy($image); } } وتكون طريقة إستخدام الكلاس كالتالي رمز PHP: $m = new Captcha(); $string = $m->getCode(); $_SESSION['key'] = md5($string); print $m->showImage(); ولاستخدام الكلاس سيكون إدراجه على هيئة صورة في صفحات الفورم كالتالي طبعا بعد إستدعاؤه بالطريقه السابقة الذكر في صفحه على المثال السابق اسمها captcha.php ولابد من إنشاء السيزون ايضا في نفس هذه الصفحه رمز PHP: <img src="captcha.php" alt="" border="0" /> وستكون الصورة التي تنتج من الكلاس كالشكل التالي واخيرا هذا هو كود الكلاس كاملا رمز PHP: session_start();
class Captcha { protected $code; protected $width = 35; protected $height = 150;
function __construct() { $this->code = substr(sha1(mt_rand()), 17, 6); }
function getCode(){ return $this->code; }
function showImage() { $image = imagecreatetruecolor($this->height, $this->width);
$width = imagesx($image); $height = imagesy($image); $black = imagecolorallocate($image, 0, 0, 0); $white = imagecolorallocate($image, 255, 255, 255); $red = imagecolorallocatealpha($image, 255, 0, 0, 75); $green = imagecolorallocatealpha($image, 0, 255, 0, 75); $blue = imagecolorallocatealpha($image, 0, 0, 255, 75); imagefilledrectangle($image, 0, 0, $width, $height, $white); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $red); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $green); imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $blue);
imagefilledrectangle($image, 0, 0, $width, 0, $black); imagefilledrectangle($image, $width - 1, 0, $width - 1, $height - 1, $black); imagefilledrectangle($image, 0, 0, 0, $height - 1, $black); imagefilledrectangle($image, 0, $height - 1, $width, $height - 1, $black); imagestring($image, 10, intval(($width - (strlen($this->code) * 9)) / 2), intval(($height - 15) / 2), $this->code, $black); header('Content-type: image/jpeg'); imagejpeg($image); imagedestroy($image); } } // الإستخدام $m = new Captcha(); $string = $m->getCode(); $_SESSION['key'] = md5($string); print $m->showImage(); ارجو الإستفاده ولأي سؤال إن شاء الله متواجد معكم | |
|