Aug 27, 2005

[Library] JCAPTCHA にチャレンジ

JCAPTCHA とは

CAPTCHA を Java で実現するためのライブラリ。 CAPTCHA というのは、completely automated public Turing test to tell computers and humans apart の略で通信相手が人間かコンピュータかを判断するための機構のこと。 Hotmail やら GMail やらを登録する際に表示されるクネクネした画像とかでお馴染みのアレ。 この辺りに解説がある。

Captcha - Wikipedia, the free encyclopediaの翻訳(2005年2月27日版)
http://www.memb.jp/~deq/voice/captcha/wikipedia-captcha.html
はてなダイアリー - CAPTCHA とは
http://d.hatena.ne.jp/keyword/CAPTCHA

JCAPTCHA は簡単に CAPTCHA を実現できるらしいのでチャレンジ。 内部で EHCACHE という別のライブラリに依存しているらしいので、それも必要。

JCAPTCHA
http://jcaptcha.sourceforge.net/
EHCACHE
http://ehcache.sourceforge.net/

JCAPTCHA の実行環境構築

  1. JCAPTCHA (jcaptcha-all-1.0-RC2.0.1.jar) をクラスパスに追加
  2. EHCACHE (ehcache-1.2beta2.jar) をクラスパスに追加
  3. その他必要なライブラリ (commons-collections-2.1.1.jar, commons-logging-1.0.4.jar) をクラスパスに追加

実行例

↓のサンプルコードを動かしてみたところ。 [↓のサンプルコードの実行例(1)] [↓のサンプルコードの実行例(2)]

サンプルコード

package jp.in_vitro.codelets.jcaptcha;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.util.Locale;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;

import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class Codelet {

    public Codelet() throws CacheException {
        super();
    }

    public static void main(final String[] args) throws Exception {
        CaptchaImageCreator creator = new CaptchaImageCreator("my id", Locale
                .getDefault());

        ImageViewer viewer = new ImageViewer(creator);
        viewer.setVisible(true);
    }

    public static class CaptchaImageCreator {
        private String captchaId;
        private Locale locale;

        public CaptchaImageCreator(final String captchaId, final Locale locale)
                throws CacheException {
            super();

            this.captchaId = captchaId;
            this.locale = locale;

            this.initializeEhcache();
        }

        protected void initializeEhcache() throws CacheException {
            // ehcache-1.2beta2.jar 内にある XML ファイルで EHCACHE を初期化する。
            InputStream is = this.getClass().getResourceAsStream(
                    "/ehcache-failsafe.xml");
            CacheManager.create(is);
        }

        public BufferedImage createImage() {
            // イメージを生成する。
            ImageCaptchaService service = new DefaultManageableImageCaptchaService();
            BufferedImage image = service.getImageChallengeForID(
                    this.captchaId, this.locale);
            return image;
        }
    }

    public static class ImageViewer extends JFrame {
        private BufferedImage image;
        private CaptchaImageCreator creator;
        private Canvas canvas;
        private JButton nextButton;

        public ImageViewer(final CaptchaImageCreator creator) {
            super();

            this.creator = creator;
            this.initComponents();
        }

        protected void initComponents() {
            // ウィンドウ終了方法の指定。
            super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // 初回イメージの生成。
            this.image = creator.createImage();

            // ContentPane の設定。
            Container contentPane = super.getContentPane();
            contentPane.setLayout(new BorderLayout());

            // イメージ表示用キャンバスの準備。
            this.canvas = new Canvas() {
                @Override
                public void paint(Graphics g) {
                    g.drawImage(ImageViewer.this.image, 0, 0, this);
                }

                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(ImageViewer.this.image.getWidth(),
                            ImageViewer.this.image.getHeight());
                }
            };
            contentPane.add(this.canvas, BorderLayout.CENTER);

            // "次のイメージに進む"ボタンの準備。
            this.nextButton = new JButton(new AbstractAction("next image") {
                public void actionPerformed(final ActionEvent evt) {
                    ImageViewer.this.image = ImageViewer.this.creator
                            .createImage();
                    ImageViewer.this.canvas.repaint();
                }
            });
            contentPane.add(this.nextButton, BorderLayout.SOUTH);

            // ウィンドウサイズの自動調整。
            super.pack();
        }
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |