/
  • اموزش ساخت captcha

  • ارسال پاسخ   امتیاز موضوع:
    • 1 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی اموزش ساخت captcha
    نویسنده پیام
    php آفلاین
    hossein
    ****

    ارسال‌ها: 612
    تاریخ عضویت: ۱۳۸۷ دي ۴
    اعتبار: 13
    تشکرها : 467
    ( 798 تشکر در 277 ارسال )
    ارسال: #1
    اموزش ساخت captcha
    هر جا گشتم یه اموزش درست و حسابی برای ساخت captcha نبود . همشون یا کد ماده بود و یا کلاس از پیش نوشته شده برای همین تصمیم گرفتم این اموزش رو اماده کنم تا خودمون captcha مورد نظرمون رو بسازیم از نمونه های ساده شروع می کنی و کمکم توابع مختلف gd رو به اون اضافه می کنیم .


    اولین مورد برای شروع کار برسی نصب بودن کتابخانه gd بر روی سرور هست که برای این کار با اجرای دستور phpinfo میشه این رو به راحتی برسی کرد

    کد PHP:
    <?php
    phpinfo
    ();

    ?>
    کد بالا رو در یه صفحه اجرا کنین با اجرای این تابع اطلاعات کاملی در مورد نسخه php که در حال استفاده از ان هستید در اختیار شما قرار میگیرد در این صفحه به دنبال gd بگردید در جدول مروبط به کتابخانه gd می توانید از فعال بودن ان بر روی سیستم خود مطمئن شوید .

    خوب از این مرحله که گذاشتیم باید کار بر روی عکس ها رو شروع کنیم . در واقع captcha شامل یک عکس با محتوای رندم هست که محتوای عکس رو داخل یک session برای برسی نهایی ذخیره می کنیم . پس کار رو شروع می کنیم .

    برای شروع , کار روبا تابع imagecreate شروع می کنیم . این تابع دو پارامتر میگیره که مشخص کننده طول و عرض عکس مورد نظر هست و در واقع عکسمون رو با اندازه مشخص شده می سازیم ولی این هی رنگی رو به اون نصبت نمیده برای دادن رنگ به عکسمون از تابع imagecolorallocate استفاده می کنیم که شامل چهار پارامتر ورودی هست اولی دستگیره برگشتی از تابع imagecreate مون هست و سه پرامتر بعدی شامل تنظیمات رنگی قرمز , سبز و ابی هست که همون سه رنگ اصلی یا rgb هست .
    یک تابع دیگه که در اینجا بای دمعرفی کنم تابع یا در واقع توابعی برای نمایش نتیجه هست imagejpeg ,imagepng,imageong هست که عکسمون رو نمایش در میاره ولی برای اینکه به سرور بفهمونیم که مقدار نمایشی یک عکس هست نه متن از تابع هدر به صورت زیر باید استفده کنیم .

    به عنوان مثال
    کد PHP:
    header("content-type: image/jpeg"); 


    خوب حالا یه نمونه عکس با هم می سازیم .
    کد PHP:
    $img imagecreate(100,40);
    imagecolorallocate($img,100,100,100);
    header("content-type: image/jpeg");
    imagejpeg($img); 


    اندازه عکسمون رو 100 در 40 تنظیم کردیم و رنگ رو هم با تنظیم هر سه پارامتر با 100 یه رنگ تقریبا تیره گذاشتیم (همه رو یکی گذاشتم که دعوا بین بچه ها نشه )

    خوب حالا می خوایم یه متن رو داخل عکسمون قرار بدیم برای این کار میتونیم از تابع imagettftext استفاده کنیم پارامتر های این تابع به ترتیب از قرار زیر هست . اول دستگیره عکسمون , اندازه فونت قلم , زاویه متن , y ,x , رنگ متن , فونت و اخرین مورد هم متن مورد نظرمون هست .


    کد PHP:
    $img imagecreate(160,80);
    imagecolorallocate($img,0,0,0);

    $White=imagecolorallocate($img,255,255,255);
    imagettftext($img,30,12,30,50,$White,"UPCDL.TTF","iran php");
    header("content-type: image/jpeg");
    imagejpeg($img); 

    یه سول که ممکنه براتون پیش بیاد همون طور که برای من پیش اومده بود این هست که چطوری رنگ background مون رنگ سیاه نسبت داده شده چون در واقع تابع imagecolorallocate فقط برای ساخت رنگ هست در واقع اولین رنگ ساخته شده یا اولین باری که از تابع imagecolorallocate استفاده می کنین به عنوان background صفحه تعیین میشه یعنی اگر شما imagecolorallocate پاک کنین رنگ متن و زمینه یکی خواهد شد .
    دومین مطلب که باید در اینجا بگم پارامتر هفتم تابع imagettftext هست که ما نام یک فونت رو وارد کردیم در واقع شما باید برای اجرا شدن کد یکی از فونت های سیستم رو در کنار فایل php تون قرار بدین و اسم اون رو در اینجا وارد کنین .


    آین داستان ادامه دارد
    __________________________________________________________________________
    ۱۳۸۹ تير ۴ ۰۱:۵۹ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : admin faghani molana redhat2 M.J
    php آفلاین
    hossein
    ****

    ارسال‌ها: 612
    تاریخ عضویت: ۱۳۸۷ دي ۴
    اعتبار: 13
    تشکرها : 467
    ( 798 تشکر در 277 ارسال )
    ارسال: #2
    RE: اموزش ساخت captcha
    تشکر وحید نتیجه داد زود کار اول رو اماده کردم البته یه نمونه سادست ولی سعیم بر اینه که با هم یه captcha پیشرفته رو طراحی کنیم .(غیر قابل نفوذ Wink)

    کد PHP:
    function random($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        
    $rand=array_rand($array,$len);
        return(
    implode(' ',$rand));

    }
    function 
    randonWithReapet($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        for(
    $i=0;$i<$len;$i++)
        {
            
    $string.=' '.$array[rand(0,strlen($array))]    ;
        }
        return 
    $string;
    }
    $img imagecreate(160,80);
    imagecolorallocate($img,0,0,0);

    $White=imagecolorallocate($img,255,255,255);
    imagettftext($img,30,12,30,50,$White,"UPCDL.TTF",randonWithReapet(5));
    header("content-type: image/jpeg");


    imagejpeg($img); 

    دو تا تابع برای برگردوندن مقادیر رندوم تعریف کردم که هر کدوم از یک روش خاص استفاده می کنن . تابع random خونه های ارایه رو به صورت رندوم کنار هم قرار داده و تعداد خونه مشخص شده رو از ارایه بر می گردونه بنابراین در خروجی مقدار تکرار نداریم ولی در تابع دومی از خود تابع rand برای گرفتن رندوم استفاده کردم که باعث میشه مقادیر تکراری هم در خروجی داشته باشیم .
    __________________________________________________________________________
    (آخرین ویرایش در این ارسال: ۱۳۸۹ تير ۵ ۱۲:۳۰ صبح، توسط php.)
    ۱۳۸۹ تير ۴ ۰۳:۰۰ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : admin faghani molana M.J
    php آفلاین
    hossein
    ****

    ارسال‌ها: 612
    تاریخ عضویت: ۱۳۸۷ دي ۴
    اعتبار: 13
    تشکرها : 467
    ( 798 تشکر در 277 ارسال )
    ارسال: #3
    RE: اموزش ساخت captcha
    در مثال قبل یه نمونه ساده از captcha رو با هم ساختیم تنها کاری که برای استفادهخ از این captcha باید بکنین این هست که این کدها رو داخل ی فایل جداگانه قرار بدین و در فایلی که می خواین ز این captcha استفاده کنین به صورت زیر عمل کنین .

    کد PHP:
    <img src="test.php" /> 

    و کار دیگه ای که باید انجام میشد و ما انجام ندادیم قرار دادن کد تولید شده داخل یه session برای برسی کد وارد شده توسط کاربر .


    خوب حالا سعی می کنیم همین مورد رو با توابع دیگه gd یکمی پیشرفته تر کنیم تا خودندن اون توسط روبات ها کم کم غیر ممکن بشه .

    برای این کار از تابع imagefilledellipse استفاده می کنم که برای رسم بیضی استفاده میشه و سعی می کنیم با رسم بیضی هایی با ابعاد 1در 1 قسمت هایی از صفحه رو پر کنیم تا خوندن captcha تا حدودی برای روبات ها مشکل تر بشه .

    بنابر این بر نامه رو به صورت زیر تغییر میدیم .

    کد PHP:
    function random($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        
    $rand=array_rand($array,$len);
        return(
    implode(' ',$rand));

    }
    function 
    randonWithReapet($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        for(
    $i=0;$i<$len;$i++)
        {
            
    $string.=' '.$array[rand(0,strlen($array))]    ;
        }
        return 
    $string;
    }
    $width=180;
    $height=70;
    $img imagecreate($width,$height);
    imagecolorallocate($img,0,0,0);

    $text_color imagecolorallocate($img130150100);
    $noise_color imagecolorallocate($img100120180);

    for( 
    $i=0$i<($width*$height)/10$i++ ) 
    {
         
    imagefilledellipse($imgrand(0,$width), rand(0,$height), 11$noise_color);
    }          
    imagettftext($img,30,12,30,50,$text_color,"UPCDL.TTF",randonWithReapet(5));
    header("content-type: image/jpeg");


    imagejpeg($img); 



    دو خط اصلی که اضافه شده شامل دو خط زیر هست البته بعلاوه رنگ هایی که تعریف کردیم .

    کد PHP:
    for( $i=0$i<($width*$height)/10$i++ ) 
    {
         
    imagefilledellipse($imgrand(0,$width), rand(0,$height), 11$noise_color);


    در اینجا یه حلقه تکرار ایجاد کردیم که از صفر وتا ضرب طول درعرض تصویر تقسیم بر 10 تکرار میشه در واقع از این کار برای ایجاد تعداد دفعات رسم بیضی استفاده کردیم و با تابع imagefilledellipse به رسم بیضی ها پرداختیم که پارامتر اول دستگیره عکس پارامتر دوم موقعیت x شکل ترسیمی و سومین پارامتر موقعیت y شکل ترسیمی رو مشخص می کنه که در اینجا ما از تابع rand برای بدست اوردن موقعیت های تصادفی اسفاده کردیم دو پارامتر بعدی هم طول و عرض شی رو مشخص می کنه و پارامتر اخر هم که رنگ بیضی های ترسیمی رو مشخص می کنه .

    امیدوارم از این captcha بتونین در برنامه های خودتون استفاده کنین .
    __________________________________________________________________________
    (آخرین ویرایش در این ارسال: ۱۳۸۹ تير ۶ ۰۹:۴۴ عصر، توسط php.)
    ۱۳۸۹ تير ۶ ۰۹:۴۲ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : faghani oia amir.s parvane molana M.J
    php آفلاین
    hossein
    ****

    ارسال‌ها: 612
    تاریخ عضویت: ۱۳۸۷ دي ۴
    اعتبار: 13
    تشکرها : 467
    ( 798 تشکر در 277 ارسال )
    ارسال: #4
    RE: اموزش ساخت captcha
    امروز که توی نت داشتم می گشتم به یه روش باحال بر خوردم در واقع همون روشی بود که به صورت یک متن از کاربر جواب یک سوال ریاضی (3+2) رو می پرسید به صورت عکس در اورده بودن و یکمی هم شلوغش کرده بودن که به نظرم ایده جالبی بود .

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

    پارامتر اول شامل دستگیره عکس و چهار پارامتر بعدی برای دو موقعیت ابتدا وانتهای نقطه و پارامتر اخر هم رنگ خط رو مشخص می کنه .


    کد PHP:
    bool imageline  (  resource $image  ,  int $x1  ,  int $y1  ,  int $x2  ,  int $y2  ,  int $color  

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

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

    کد PHP:
    for( $i=0$i<15$i++ ) 
    {
        
         
    imageline($imgrand(0,$width), rand(0,$height),rand(0,$width) ,rand(0,$height), $background);


    و برنامه اصلی رو به صورت زیر کامل می کنیم .

    کد PHP:
    <?php
    function random($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        
    $rand=array_rand($array,$len);
        return(
    implode(' ',$rand));

    }
    function 
    randonWithReapet($len)
    {
        
    $array=array(1,2,3,4,5,6,7,8,9);
        for(
    $i=0;$i<$len;$i++)
        {
            
    $string.=' '.$array[rand(0,strlen($array))]    ;
        }
        return 
    $string;
    }
    $width=180;
    $height=70;
    $img imagecreate($width,$height);
    $background=imagecolorallocate($img,0,0,0);

    $text_color imagecolorallocate($img130150100);
    $noise_color imagecolorallocate($img100120180);

    for( 
    $i=0$i<($width*$height)/10$i++ ) 
    {
         
    imagefilledellipse($imgrand(0,$width), rand(0,$height), 11$noise_color);
    }          

    imagettftext($img,18,12,30,50,$text_color,"ABBESS__.TTF",randonWithReapet(5));
    for( 
    $i=0$i<15$i++ ) 
    {
        
         
    imageline($imgrand(0,$width), rand(0,$height),rand(0,$width) ,rand(0,$height), $background);
    }          
    header("content-type: image/jpeg");


    imagejpeg($img); 
    ?>

    یه نمونه از فایل captcha رو هم قرار دادم تابچه ها نمونه captcha ساخته شده تا اینجای کار رو ببینن


    فایل‌(های) پیوست شده بندانگشتی (ها)
       
    __________________________________________________________________________
    (آخرین ویرایش در این ارسال: ۱۳۸۹ تير ۱۰ ۰۲:۳۸ عصر، توسط php.)
    ۱۳۸۹ تير ۱۰ ۰۲:۳۳ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : oia mkmk M.J
    php آفلاین
    hossein
    ****

    ارسال‌ها: 612
    تاریخ عضویت: ۱۳۸۷ دي ۴
    اعتبار: 13
    تشکرها : 467
    ( 798 تشکر در 277 ارسال )
    ارسال: #5
    RE: اموزش ساخت captcha
    یه روشی که یه مدت پیش تو وبلاگ یکی از بچه های سایت (محمد نیک نام) خودندم اومده بود برای سخت تر کردن خوندن عکس توسط رو باتها یه پیشنهاد جالب داده بود و اون استفاده از چند فونت مختلف هست .

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




    با تشکر از محمد نیک نام عزیز
    __________________________________________________________________________
    ۱۳۸۹ تير ۲۲ ۰۱:۵۴ صبح
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : M.J
    molana آفلاین
    چالیست - chalist
    *******

    ارسال‌ها: 1,764
    تاریخ عضویت: ۱۳۸۷ آذر ۳۰
    اعتبار: 60
    تشکرها : 1644
    ( 1550 تشکر در 1015 ارسال )
    ارسال: #6
    RE: اموزش ساخت captcha
    البته کج و کوله کردی حروف هم تاثیر بسزایی داره در عدم خوانایی کپچا
    __________________________________________________________________________
    همه جوره اش رو داریم ظاهرن
    ۱۳۸۹ تير ۲۲ ۰۲:۵۲ صبح
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    « قدیمی تر | تازه‌ تر »

    ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS