Polski support
KohanaPHP Framework
FORUM Polskiego Supportu KOHANA Framework
29 Lipiec 2010, 13:05 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: 18.10.2009 - wydanie 3.0.1
Strony: [1] 2   Do dołu
  Drukuj  
Autor Wątek: Advmath Captcha  (Przeczytany 1992 razy)
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« : 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(15);
	
	
	
$numbers[] = mt_rand(14);
	
	
	
$operator 0;
	
	
}
	
	
// Normal
	
	
elseif (
Captcha::$config['complexity'] < 7)
	
	
{
	
	
	
$numbers[] = mt_rand(1020);
	
	
	
$numbers[] = mt_rand(110);
	
	
	
$operator mt_rand(01);
	
	
}
	
	
// Difficult
	
	
else
	
	
{
	
	
	
$numbers[] = mt_rand(1020);
	
	
	
$numbers[] = mt_rand(110);
	
	
	
$operator mt_rand(02);
	
	
}

	
	
// 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->imagemt_rand(200255), mt_rand(200255), mt_rand(150255));
	
	
	
$color2 imagecolorallocate($this->imagemt_rand(200255), mt_rand(200255), mt_rand(150255));
	
	
	
$this->image_gradient($color1$color2);
	
	
}

	
	
// Add a few random lines
	
	
for (
$i 0$count mt_rand(5Captcha::$config['complexity'] * 4); $i $count$i++)
	
	
{
	
	
	
$color imagecolorallocatealpha($this->imagemt_rand(0255), mt_rand(0255), mt_rand(100255), mt_rand(50120));
	
	
	
imageline($this->imagemt_rand(0Captcha::$config['width']), 0mt_rand(0Captcha::$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->imagemt_rand(0150), mt_rand(0150), mt_rand(0150));
	
	
	
$angle mt_rand(-1020);

	
	
	
// Scale the character size on image height
	
	
	
$size $default_size 10 mt_rand(1216);
	
	
	
$box imageftbbox($size$angle$font$this->response[$i]);

	
	
	
// Calculate character starting coordinates
	
	
	
$x $spacing $i $spacing;
	
	
	
$y Captcha::$config['height'] / + ($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 Uśmiech

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  Duży uśmiech
Zapisane
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« 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 Duży uśmiech ), 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(15);
	
	
	
$numbers[] = mt_rand(14);
	
	
	
$operator 0;
	
	
}
	
	
// Normal
	
	
elseif (
Captcha::$config['complexity'] < 7)
	
	
{
	
	
	
$numbers[] = mt_rand(1020);
	
	
	
$numbers[] = mt_rand(110);
	
	
	
$operator mt_rand(01);
	
	
}
	
	
// Difficult
	
	
else
	
	
{
	
	
	
$numbers[] = mt_rand(1020);
	
	
	
$numbers[] = mt_rand(110);
	
	
	
$operator mt_rand(02);
	
	
}

	
	
// 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->imagemt_rand(200255), mt_rand(200255), mt_rand(150255));
	
	
	
$color2 imagecolorallocate($this->imagemt_rand(200255), mt_rand(200255), mt_rand(150255));
	
	
	
$this->image_gradient($color1$color2);
	
	
}

	
	
// Add a few random lines
	
	
for (
$i 0$count mt_rand(5Captcha::$config['complexity'] * 5); $i $count$i++)
	
	
{
	
	
	
$color imagecolorallocatealpha($this->imagemt_rand(0255), mt_rand(0255), mt_rand(100255), mt_rand(50120));
	
	
	
imageline($this->imagemt_rand(0Captcha::$config['width']), 0mt_rand(0Captcha::$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->imagemt_rand(50200), mt_rand(50200), mt_rand(50200));
	
	
	
$angle mt_rand(-1020);

	
	
	
// Scale the character size on image height
	
	
	
$size is_numeric($txt[$i]) ? $default_size 10 mt_rand(1216) : Captcha::$config['height'] / 2;
	
	
	
$box imageftbbox($size$angle$font$this->response[$i]);

	
	
	
// Calculate character starting coordinates
	
	
	
$x $spacing $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 Offline

Wiadomości: 378



Zobacz profil
« 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? Uśmiech
Zapisane

Warsztat: Eclipse Helios PDT + PHP 5.3.2 + PostgreSQL 8.4 + Kohana 2.3.4

Problem rozwiązałem, temat do zamknięcia
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« Odpowiedz #3 : 5 Marzec 2009, 18:52 »

no w końcu po coś to wrzucam...
Uśmiech
Zapisane
Zepco
Administrator
Ekspert
*****
Offline Offline

Wiadomości: 924



Zobacz profil
« 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
Użytkownik
**
Offline Offline

Wiadomości: 95


Zobacz profil
« 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" Mrugnięcie
Zapisane
insert
NKTeam
Aktywny użytkownik
*
Offline Offline

Wiadomości: 185



Zobacz profil
« 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" Mrugnięcie
Dokładnie - pisałeś tak Zepco?
Zapisane
Zepco
Administrator
Ekspert
*****
Offline Offline

Wiadomości: 924



Zobacz profil
« Odpowiedz #7 : 5 Marzec 2009, 20:13 »

"Wpisz wynik działania z poniższego obrazka"
Ale komu by się chciało to czytać. Chichot
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
Użytkownik
**
Offline Offline

Wiadomości: 95


Zobacz profil
« Odpowiedz #8 : 5 Marzec 2009, 21:17 »

Skoro się nie domyślają, to trzeba im to napisać:D
Zapisane
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« 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" Mrugnięcie
@Zepco: a nie mówiłem Duży uśmiech
Zapisane
ulotnachwila87
Użytkownik
**
Offline Offline

Wiadomości: 55


zakoHany BEGINNER


Zobacz profil WWW
« 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 Chichot ... koHam się codzieniie, zawsze i wszędzie Chichot

BEGINNER programmer czy jakoś tak no nie?:>
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« 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
Użytkownik
**
Offline Offline

Wiadomości: 55


zakoHany BEGINNER


Zobacz profil WWW
« 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 Chichot ... koHam się codzieniie, zawsze i wszędzie Chichot

BEGINNER programmer czy jakoś tak no nie?:>
mck
NKTeam
Ekspert
*
Offline Offline

Wiadomości: 693



Zobacz profil
« Odpowiedz #13 : 3 Luty 2010, 01:53 »

no to nie ma innego wyjścia, musi działać Uśmiech
Zapisane
Grejfrut27
Nowy użytkownik
*
Offline Offline

Wiadomości: 5



Zobacz profil WWW
« 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):
Kod:
<img height="50" width="150" src="http://www.adres_strony/captcha/default.html" alt="Captcha">

wizualnie:
Zapisane

co się prestiż, że się ma?
Strony: [1] 2   Do góry
  Drukuj  
 
Skocz do: