PDA

View Full Version : یک CAPTCHA جایگزین برای نسخه پیشفرض فریمورک Yii



MMSHFE
جمعه 21 شهریور 1393, 21:00 عصر
اول از همه کد رو ببینید:

<?php
$yii = dirname(__FILE__) . '/../../framework/yii.php';
$config = dirname(__FILE__) . '/../protected/config/main.php';
require_once ($yii);
Yii::createWebApplication($config);
/**
* Simple and powerful CAPTCHA
* @author Mohammad Mostafa Shahreki
* @copyright All rights reserved for Saina Intelligent Processing Co.
* @link http://www.ncis.ir
*/
// Configuration
$height = 75;
$width = 190;
$length = 4;
$lineCount = 5;
$circleCount = 5;
$maxRadius = 50;
$space = 45;
// Generate random code
$alpha = range('A', 'Z');
$string = '';
for($i = 0; $i < $length; $i++) {
$string .= $alpha [rand() % count($alpha)];
}
Yii::app()->session->open();
Yii::app()->session->add('captcha', strtolower($string));
// Create image
header('Content-type: image/png');
$im = imagecreate($width, $height);
// Create fixed colors
$backColor = imagecolorallocate($im, 255, 255, 255);
// Asign font
$font = './coopbl.ttf';
$fontsize = $height * 0.5;
// Calculate the bounding box of the text
$box = imagettfbbox($fontsize, 0, $font, $string);
// Start position of the text
$positionX = ($width - $space * $length) / 2;
// Rotation Direction (1: Anti-clockwise, -1: Clockwise)
$direction = 1;
// Fill the image with background color
imagefill($im, $width / 2, $height / 2, $backColor);
// Write the text in the image using font, rotation, position, etc.
for($i = 0; $i < $length; $i++) {
$char = substr($string, $i, 1);
$textColor = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
imagettftext($im, $fontsize, (rand() % 15 * $direction), $positionX, ($height - $box [5]) / 2, $textColor, $font, $char);
$direction = -$direction;
$positionX += $space;
}
// Add lines to the image
for($i = 0; $i < $lineCount; $i++) {
$x1 = rand() % $width;
$y1 = rand() % $height;
$x2 = rand() % $width;
$y2 = rand() % $height;
$lineColor = imagecolorallocate($im, rand() % 256, rand() % 256, rand() % 96);
imageline($im, $x1, $y1, $x2, $y2, $lineColor);
}
// Add circles to the image
for($i = 0; $i < $circleCount; $i++) {
$cx = rand() % $width;
$cy = rand() % $height;
$rx = rand() % $maxRadius;
$ry = rand() % $maxRadius;
$start = rand() % 360;
$end = rand() % 360;
$lineColor = imagecolorallocate($im, rand() % 256, rand() % 256, rand() % 96);
imagearc($im, $cx, $cy, $rx, $ry, $start, $end, $lineColor);
}
imagepng($im);
imagedestroy($im);
?>
یک نمونه از این کپچا اینجا استفاده شده: http://irgoogle.sainanet.ir/register
123373
فقط دو خط اول رو اصلاح کنید که به مسیر فریمورک و فایل تنظیمات پروژه شما اشاره کنه. حالا توی برنامه خودتون میتونید با Yii::app()->session->get('captcha') کد کپچا رو بخونید. من توی پروژه، این فایل رو در مسیر webroot/images گذاشتم و فونت رو هم همونجا کپی کردم و اینطوری کپچا رو توی صفحه نشون دادم:

echo CHtml::image(Yii::app()->homeUrl . 'images/captcha.php', 'CAPTCHA');

اگه ابهام یا مشکلی بود در خدمتم.

desatir7316
جمعه 21 شهریور 1393, 21:14 عصر
تشکر
چه امکانات بیشتری از کپچای پیش فرض داره؟
راستی میشه background ش رو transparet کرد؟
من الان دارم پروژه ای می نویسم نیاز دارم که transparet کنم که به راحتی توی کپچای پیش فرض قابل انجام بود

راستی یه سوال دیگه، گرافیک اون سایتی که اشاره کردید رو با چی انجام دادن؟

MMSHFE
جمعه 21 شهریور 1393, 21:34 عصر
والا هرکاری بخواین میشه انجام بدین چون خروجی PNG هست. قابلیت اصلیش اینه که مثل کپچای اصلی بیریخت نیست! ضمناً کپچای اصلی سیستم قبلی recaptcha گوگله که سیستمهای پردازش تصویر اخیراً کرکش کردن و این کپچا میتونه با اضافه کردن خطوط و... و چرخش حروف کار رو سخت کنه. میتونید کارکترهایی که توی کپچا به کار میره رو هم تعیین کنید.

desatir7316
جمعه 21 شهریور 1393, 21:53 عصر
نمی دونم سیستم های پردازش تصویر هم مثه آدمها نگاه می کنن یا نه ولی اگه مثه ما باشن خدایی مال خود yii براشون سخت تره تا این
الان این رو ببینید:
123376

اینم یه نمونه از کپچای کاستوم شده :

http://yii-demo.synet.sk/site/captchaExtended

راستی اگه بشه یه کپجای فارسی ایجاد کنیم بهتره، با سایت هامون میاد البته نه مثل اون اکستنشنی که توی سایت اصلی yii هست (http://www.yiiframework.com/extension/rezvan-captch/) که زود تشخیص داده میشه

MMSHFE
جمعه 21 شهریور 1393, 22:03 عصر
نه سیستمها با الگوریتمهای پردازش تصویر کار میکنن. هرچی خط و خطوط اضافه بگذارین سخت تر میشه. تو این کپچا میتونید فونت و... رو هم راحت عوض کنید. بهرحال خواستم راه ساخت کپچای سفارشی رو نشون بدم چون خیلیا میپرسیدن.

under22
یک شنبه 23 شهریور 1393, 10:57 صبح
میشه یه دکمه رفرش ایجکسی کپچا بهش اضافه کرد ؟

MMSHFE
دوشنبه 24 شهریور 1393, 19:07 عصر
بله میشه: لینک (http://barnamenevis.org/showthread.php?468969-%D8%B9%D8%AF%D9%85-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%81%D8%B1%D9%85-%D8%A8%D8%A7-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1&p=2103094&viewfull=1#post2103094)