mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« : 1 Październik 2008, 13:28 » |
|
tak sobie dzisiaj dłubałem: <?php defined('SYSPATH') or die('No direct script access.'); /** * Captcha driver for "advmath" style. * @author mck */ class Captcha_Advmath_Driver extends Captcha_Driver {
private $math_exercice;
private $math_operators = array('+', '-', '*');
/**
* Generates a new Captcha challenge.
*
* @return string the challenge answer
*/
public function generate_challenge()
{
// Easy
if (Captcha::$config['complexity'] < 4)
{
$numbers[] = mt_rand(1, 5);
$numbers[] = mt_rand(1, 4);
$operator = 0;
}
// Normal
elseif (Captcha::$config['complexity'] < 7)
{
$numbers[] = mt_rand(10, 20);
$numbers[] = mt_rand(1, 10);
$operator = mt_rand(0, 1);
}
// Difficult
else
{
$numbers[] = mt_rand(10, 20);
$numbers[] = mt_rand(1, 10);
$operator = mt_rand(0, 2);
}
// Store the question for output
$this->math_exercice = implode(' '.$this->math_operators[$operator].' ', $numbers).'';
// Create answer
$result = array_sum($numbers);
switch($operator) {
case 1: $result = $numbers[0] - $numbers[1];
break;
case 2: $result = $numbers[0] * $numbers[1];
break;
}
// Return the answer
return $result;
}
/**
* Outputs the Captcha riddle.
*
* @param boolean html output
* @return mixed
*/
public function render($html)
{
// Creates $this->image
$this->image_create(Captcha::$config['background']);
// Add a random gradient
if (empty(Captcha::$config['background']))
{
$color1 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255));
$color2 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255));
$this->image_gradient($color1, $color2);
}
// Add a few random lines
for ($i = 0, $count = mt_rand(5, Captcha::$config['complexity'] * 4); $i < $count; $i++)
{
$color = imagecolorallocatealpha($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(100, 255), mt_rand(50, 120));
imageline($this->image, mt_rand(0, Captcha::$config['width']), 0, mt_rand(0, Captcha::$config['width']), Captcha::$config['height'], $color);
}
// Calculate character font-size and spacing
$default_size = min(Captcha::$config['width'], Captcha::$config['height'] * 2) / (strlen($this->math_exercice) + 1);
$spacing = (int) (Captcha::$config['width'] * 0.9 / strlen($this->math_exercice));
// Draw each Captcha character with varying attributes
for ($i = 0, $strlen = strlen($this->math_exercice); $i < $strlen; $i++)
{
// Use different fonts if available
$font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])];
// Allocate random color, size and rotation attributes to text
$color = imagecolorallocate($this->image, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));
$angle = mt_rand(-10, 20);
// Scale the character size on image height
$size = $default_size / 10 * mt_rand(12, 16);
$box = imageftbbox($size, $angle, $font, $this->response[$i]);
// Calculate character starting coordinates
$x = $spacing / 4 + $i * $spacing;
$y = Captcha::$config['height'] / 2 + ($box[2] - $box[5]) / 4;
// Write text character to image
imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $this->math_exercice[$i]);
}
// Output
return $this->image_render($html);
}
} // End Captcha Advmath Driver Class ?>
jest to połączenie dwóch driverów Captchy: Math i Basic (działanie wyświetla się w postaci obrazka), co powinno wielbicielom matematyki powstrzymać nalot spamu  jak widać są 3 stopnie skomplikowania (prawie jak w Math): 1-3: Basic - dodawanie 4-6: Normal - dodawanie i odejmowanie 7-9: Difficult - dodawanie, odejmowanie, mnożenie skopiować i zapisać jako Advmath.php i wrzucić do folderu: application\libraries\drivers\Captcha\miłej zabawy 
|
|
|
|
|
Zapisane
|
|
|
|
mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« Odpowiedz #1 : 5 Marzec 2009, 15:28 » |
|
okazało się, że ta captcha jest zbyt trudna nawet dla ludzi (podobno niektórzy przepisywali działanie zamiast jego wynik  ), więc po drobnych modyfikacjach coś takiego powinno się dać odczytać:  kod: <?php defined('SYSPATH') or die('No direct script access.'); /** * Captcha driver for "advmath" style. * * @package Captcha * @author mck * @license GNU GPL */ class Captcha_Advmath_Driver extends Captcha_Driver {
private $math_exercice;
private $math_operators = array('+', '-', '*');
/**
* Generates a new Captcha challenge.
*
* @return string the challenge answer
*/
public function generate_challenge()
{
// Easy
if (Captcha::$config['complexity'] < 4)
{
$numbers[] = mt_rand(1, 5);
$numbers[] = mt_rand(1, 4);
$operator = 0;
}
// Normal
elseif (Captcha::$config['complexity'] < 7)
{
$numbers[] = mt_rand(10, 20);
$numbers[] = mt_rand(1, 10);
$operator = mt_rand(0, 1);
}
// Difficult
else
{
$numbers[] = mt_rand(10, 20);
$numbers[] = mt_rand(1, 10);
$operator = mt_rand(0, 2);
}
// Store the question for output
$this->math_exercice = implode(' '.$this->math_operators[$operator].' ', $numbers).'';
// Create answer
$result = array_sum($numbers);
switch($operator) {
case 1: $result = $numbers[0] - $numbers[1];
break;
case 2: $result = $numbers[0] * $numbers[1];
break;
}
// Return the answer
return $result;
}
/**
* Outputs the Captcha riddle.
*
* @param boolean html output
* @return mixed
*/
public function render($html)
{
// Creates $this->image
$this->image_create(Captcha::$config['background']);
$txt = $this->math_exercice.'=?';
// Add a random gradient
if (empty(Captcha::$config['background']))
{
$color1 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255));
$color2 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255));
$this->image_gradient($color1, $color2);
}
// Add a few random lines
for ($i = 0, $count = mt_rand(5, Captcha::$config['complexity'] * 5); $i < $count; $i++)
{
$color = imagecolorallocatealpha($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(100, 255), mt_rand(50, 120));
imageline($this->image, mt_rand(0, Captcha::$config['width']), 0, mt_rand(0, Captcha::$config['width']), Captcha::$config['height'], $color);
}
// Calculate character font-size and spacing
$default_size = min(Captcha::$config['width'], Captcha::$config['height'] * 2.5) / (strlen($txt) + 1);
$spacing = (int) (Captcha::$config['width'] * 0.9 / strlen($txt));
// Draw each Captcha character with varying attributes
for ($i = 0, $strlen = strlen($txt); $i < $strlen; $i++)
{
// Use different fonts if available
$font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])];
// Allocate random color, size and rotation attributes to text
$color = imagecolorallocate($this->image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
$angle = mt_rand(-10, 20);
// Scale the character size on image height
$size = is_numeric($txt[$i]) ? $default_size / 10 * mt_rand(12, 16) : Captcha::$config['height'] / 2;
$box = imageftbbox($size, $angle, $font, $this->response[$i]);
// Calculate character starting coordinates
$x = $spacing / 4 + $i * $spacing;
$y = Captcha::$config['height'] / 1.2 + ($box[2] - $box[5]) / 4;
// Write text character to image
imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $txt[$i]);
}
// Output
return $this->image_render($html);
}
} // End Captcha Advmath Driver Class ?>
|
|
|
|
|
Zapisane
|
|
|
|
phpion
NKTeam
Zaawansowany użytkownik
Offline
Wiadomości: 378
|
 |
« Odpowiedz #2 : 5 Marzec 2009, 18:35 » |
|
W wolnej chwili przetestuję ale zapowiada się fajnie. Jeżeli działa tak jak myślę, to pozwolę sobie zapożyczyć kod ok? 
|
|
|
|
|
Zapisane
|
|
|
|
mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« Odpowiedz #3 : 5 Marzec 2009, 18:52 » |
|
no w końcu po coś to wrzucam... 
|
|
|
|
|
Zapisane
|
|
|
|
|
Zepco
|
 |
« Odpowiedz #4 : 5 Marzec 2009, 19:32 » |
|
Używam go od ponad 2 tygodni i sprawdza się bez zarzutu, poza właśnie przypadkami gdzie ktoś przepisywał cyferki zamiast wpisać wynik. :]
|
|
|
|
|
Zapisane
|
OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta). -- Zepco -- (: nʞnʞ
|
|
|
|
robos85
|
 |
« Odpowiedz #5 : 5 Marzec 2009, 19:39 » |
|
... poza właśnie przypadkami gdzie ktoś przepisywał cyferki zamiast wpisać wynik. :]
To w takim razie trzeba dawać informację "Podaj wynik działania" 
|
|
|
|
|
Zapisane
|
|
|
|
insert
NKTeam
Aktywny użytkownik
Offline
Wiadomości: 185
|
 |
« Odpowiedz #6 : 5 Marzec 2009, 19:42 » |
|
... poza właśnie przypadkami gdzie ktoś przepisywał cyferki zamiast wpisać wynik. :]
To w takim razie trzeba dawać informację "Podaj wynik działania"  Dokładnie - pisałeś tak Zepco?
|
|
|
|
|
Zapisane
|
|
|
|
|
Zepco
|
 |
« Odpowiedz #7 : 5 Marzec 2009, 20:13 » |
|
"Wpisz wynik działania z poniższego obrazka" Ale komu by się chciało to czytać. 
|
|
|
|
|
Zapisane
|
OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta). -- Zepco -- (: nʞnʞ
|
|
|
|
robos85
|
 |
« Odpowiedz #8 : 5 Marzec 2009, 21:17 » |
|
Skoro się nie domyślają, to trzeba im to napisać:D
|
|
|
|
|
Zapisane
|
|
|
|
mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« Odpowiedz #9 : 5 Marzec 2009, 23:43 » |
|
... poza właśnie przypadkami gdzie ktoś przepisywał cyferki zamiast wpisać wynik. :]
To w takim razie trzeba dawać informację "Podaj wynik działania"  @Zepco: a nie mówiłem 
|
|
|
|
|
Zapisane
|
|
|
|
|
ulotnachwila87
|
 |
« Odpowiedz #10 : 2 Luty 2010, 12:41 » |
|
nie rozumiem czemu mi nie działa ;/ podany przez MCK Advmath... w konfigu Captha dałam tak: $config['default'] = array (
'style' => 'advmath',
'width' => 143,
'height' => 50,
'complexity' => 5, 'background' => '',
'fontpath' => SYSPATH.'fonts/',
'fonts' => array('DejaVuSerif.ttf'),
'promote' => FALSE, );
a w bibliotece w systemie w katalogu Captha dodałam plik o nazwie Advmath.php o treści takiej jak podał MCK. a i efekt jest taki że wyświetla mi się napis "Captha" zamiast obrazka. Poprzednio miałam Math i było wszystko ok. Ps. moja wersja Kohany to: 2.3.4 Więc co jest źle?
|
|
|
|
« Ostatnia zmiana: 2 Luty 2010, 12:43 wysłane przez ulotnachwila87 »
|
Zapisane
|
zakoHana po uszy  ... koHam się codzieniie, zawsze i wszędzie  BEGINNER programmer czy jakoś tak no nie?:>
|
|
|
mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« Odpowiedz #11 : 2 Luty 2010, 13:12 » |
|
sprawdziłem i działa, zrobiłaś wszystko tak jak opisałem w pierwszym poście?
|
|
|
|
|
Zapisane
|
|
|
|
|
ulotnachwila87
|
 |
« Odpowiedz #12 : 2 Luty 2010, 15:48 » |
|
zapisałam jako Advmath.php i wrzuciłam do folderu: application\libraries\drivers\Captcha\
a w pliku Advmath.php dodałam to co podałeś jako KOD... w pierwszym poście
|
|
|
|
|
Zapisane
|
zakoHana po uszy  ... koHam się codzieniie, zawsze i wszędzie  BEGINNER programmer czy jakoś tak no nie?:>
|
|
|
mck
NKTeam
Ekspert
Offline
Wiadomości: 693
|
 |
« Odpowiedz #13 : 3 Luty 2010, 01:53 » |
|
no to nie ma innego wyjścia, musi działać 
|
|
|
|
|
Zapisane
|
|
|
|
|
Grejfrut27
|
 |
« Odpowiedz #14 : 26 Kwiecień 2010, 14:33 » |
|
Hm, mam to samo - wyświetla się tylko samo słowo Captcha, bez obrazka (w zasadzie, jako obrazek): <img height="50" width="150" src="http://www.adres_strony/captcha/default.html" alt="Captcha"> wizualnie: 
|
|
|
|
|
Zapisane
|
co się prestiż, że się ma?
|
|
|
|