___
/ _ \
| | | |
| | | |
| |_| |
\___/
|
_____
| __ \
| | | |
| | | |
| |__| |
|_____/
|
______
| ____|
| |__
| __|
| |____
|______|
|
/\
/ \
/ /\ \
/ ____ \
/_/ \_\
|
_____
| __ \
| | | |
| | | |
| |__| |
|_____/
|
______
| ____|
| |__
| __|
| |
|_|
|
___
/ _ \
| (_) |
\__, |
/ /
/_/
|
_____
| __ \
| | | |
| | | |
| |__| |
|_____/
|
# Random Number in Tcl
# http://wiki.tcl.tk/13120
# hex and decimal values in Tcl
# http://www.wellho.net/resources/ex.php4?item=t202/hddh
# hex and decimal values in javascript
# http://javascript.about.com/library/blh2d.htm
# captcha generation see in fossil
# <input type="button" value="Fill out captcha" onclick="document.getElementById('u').value='anonymous'; document.getElementById('p').value='b0b67076';"/>>
namespace eval captcha {}
set ::captcha::symbols {
"
___
/ _ \\
| | | |
| | | |
| |_| |
\\___/
" "
__
/_ |
| |
| |
| |
|_|
" "
___
|__ \\
) |
/ /
/ /_
|____|
" "
____
|___ \\
__) |
|__ <
___) |
|____/
" "
_ _
| || |
| || |_
|__ _|
| |
|_|
" "
_____
| ____|
| |__
|___ \\
___) |
|____/
" "
__
/ /
/ /_
| '_ \\
| (_) |
\\___/
" "
______
|____ |
/ /
/ /
/ /
/_/
" "
___
/ _ \\
| (_) |
>> _ <
| (_) |
\\___/
" "
___
/ _ \\
| (_) |
\\__, |
/ /
/_/
" "
/\\
/ \\
/ /\\ \\
/ ____ \\
/_/ \\_\\
" "
____
| _ \\
| |_) |
| _ <
| |_) |
|____/
" "
_____
/ ____|
| |
| |
| |____
\\_____|
" "
_____
| __ \\
| | | |
| | | |
| |__| |
|_____/
" "
______
| ____|
| |__
| __|
| |____
|______|
" "
______
| ____|
| |__
| __|
| |
|_|
"}
############################################
# http://dev.aolserver.com/wiki/AOLserver_Cookbook#Generating_random_passwords
# Generating random passwords
# puts [password 8]
proc captcha::random_string {{iStringLength 8}} {
# iStringLength - desired length of random string
# characters allowed to appear in the string
set sAllowableCharacters "0123456789ABCDEF"
# get length one time
set iAllowableCharacters [string length $sAllowableCharacters]
# begin random string as empty
set sRandomString ""
# loop until desired length is achieved
for {set ii 0} {$ii < $iStringLength} {incr ii} {
# get next random between 0 and length of allowed characters
set iRandomInt [ns_rand $iAllowableCharacters]
# retrieve this random character
set sRandomCharacter [string index $sAllowableCharacters $iRandomInt]
# append the character to our random string
append sRandomString $sRandomCharacter
}
return $sRandomString
}
puts "<html>><table>><tr>>"
foreach sym [split [ captcha::random_string 8] {}] {
puts <td>><pre>>[lindex $::captcha::symbols [expr 0x$sym]]</pre>></td>>
}
puts "</tr>></table>></html>>"
Comments
Правда на лицо как минимум один минус - большой размер такой каптчи, много места на странице будет занимать. Хотя в эру больших мониторов (20" и т.д.) это уже мало критично.
В любом случае - решение имеет право существовать ;)
Замечу, что алгоритм придуман не мной - я просто давно уже обратил внимание на утилиты типа banner в линуксе, а также на узнаваемость изображения, выводимого в mplayer через aaalib (невероятно, но запросто можно смотреть мультики). Есть и пример использования именно такой капчи, см. http://www.sqlite.org/src/login?anon=1&g=/src/timeline
Что интересно, в стандартных капчах все делается неправильно. Например, разноцветное изображение очень неудобно человеку, но совершенно не мешает роботам. Маленький размер изображения сложен для просмотра живым посетителям, но облегчает автоматизированное распознавание. Использование картинки часто приводит к тому, что она блокируется фильтрами или прокси. И так далее.