MacBook で CAPTCHA を試してみる(編集中)
MacBook で CAPTCHA を使ってみる。言語は Perl。
GD 導入
↓を見れば GD 導入まで楽々でしたw
http://wiki.livedoor.jp/kojima_ichiro/d/How%20to%20install%20GD%20on%20Mac%20OS%20X%2010.4
作業場所
$ mkdir ~/work $ cd ~/work
zlib の導入
$ curl -O http://www.zlib.net/zlib-1.2.3.tar.gz $ tar zxvf zlib-1.2.3.tar.gz $ cd zlib-1.2.3; $ ./configure --shared && make && sudo make install Password: $ cd ..
libjpeg の導入
$ curl -O http://www.ijg.org/files/jpegsrc.v6b.tar.gz $ tar xzvf jpegsrc.v6b.tar.gz $ pushd jpeg-6b/ $ ln -s `which glibtool` ./libtool $ ./configure --enable-shared && make && sudo make install Password: $ popd
libpng の導入
$ curl -O ftp://ftp.simplesystems.org/pub/libpng/png/src/lpng1225.zip $ unzip lpng1215.zip $ pushd lpng1215/ $ cp scripts/makefile.darwin makefile $ make ZLIBINC="/usr/lib" ZLIBLIB="/usr/lib" && sudo make install Password: $ sudo ranlib /usr/local/lib/libpng.a $ popd
freetype2 の導入
$ curl -O http://download.savannah.gnu.org/releases/freetype/freetype-2.1.10.tar.gz $ tar xzvf freetype-2.1.10.tar.gz $ pushd freetype-2.1.10 $ ./configure && make && sudo make install Password: $ popd
GD の導入
$ curl -O http://www.boutell.com/gd/http/gd-2.0.33.tar.gz $ tar xzvf gd-2.0.33.tar.gz $ pushd gd-2.0.33 $ ln -s `which glibtool` ./libtool $ ./configure \ CPPFLAGS=-I/usr/X11R6/include/freetype2 \ --prefix=/usr/local \ --mandir=/usr/local/man \ --bindir=/usr/local/bin \ --with-freetype=/usr/X11R6 \ --includedir=/usr/local/include $ make && sudo make install Password: $ popd
CPAN モジュールの導入
- 利用モジュール
- GD
- HTML::Template
- Authen::Captcha
- コマンド
$ sudo -H cpan -i GD $ sudo -H cpan -i Authen::Captcha
これであとは Authen::Captcha を使って CGI を作り込めばよい。
概要
ソースコード
#!/opt/local/bin/perl -w use strict; use CGI; use Authen::Captcha; # _init_ my $q = new CGI; my $captcha = Authen::Captcha->new( data_folder => '/Library/WebServer/Documents/md5', #MD5キー出力先 output_folder => '/Library/WebServer/Documents/md5', #生成画像の相対パス ); eval { my $code = $q->param("mycode") || undef; my $cmd = $q->param("mycmd") || undef; my $md5 = $q->param("mymd5") || undef; if( $code && $cmd && $md5 && $cmd eq 'check'){ &do_check($code, $md5); } else { &do_create(); } }; if($@){ print <<HTML; Content-type: text/plain Exception: $@ HTML } sub do_create { my $md5 = $captcha->generate_code(5); #5桁の画像を作成 my $created_captcha_name = "/md5/${md5}.png"; print <<HTML; Content-type: text/html <html> <head><title>captcha test</title></head> <body> <h1>hello world</h1> <p><img src="$created_captcha_name" /></p> <form action="captcha.cgi" method="POST"> <input type="hidden" name="mycmd" value="check" /> <input type="hidden" name="mymd5" value="$md5" /> <input type="text" name="mycode" /> <input type="submit" value="Submit" /> </form> </body> </html> HTML } sub do_check { my($code,$md5) = @_; my %result2message ={ 1 => "ok", #"認証成功", 0 => "error",#"ファイルエラーのためコードのチェックが出来ませんでした。", -1 => "NG", #"コードが違います(期限切れ)", -2 => "NG", #"コードが違います(存在しません)", -3 => "NG", #"コードが違います(コード不一致)", }; my $result = $captcha->check_code($code,$md5); my $message = $result2message{$result}; print <<HTML; Content-type: text/html <html> <head><title>result</title></head> <body> <h1>result:$result</h1> <p>message:$message</p> <p>code:$code</p> </body> </html> HTML }
実行結果
ソースができたら。
発生したエラー、対応内容
あっさり終わるかと思いきや、Perl の再インストール周りで何かが悪さしているらしい。何が原因なのかを調査ー
[Fri Jan 18 00:03:48 2008] [error] (2)No such file or directory: exec of /Library/WebServer/CGI-Executables/hello.cgi failed [Fri Jan 18 00:03:48 2008] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/hello.cgi
とおもったら、Perl のパスが違ってました。
$ which perl /opt/local/bin/perl
ちゃんと確認しないとだめだぁね。