2011年02月03日

[CakePHP]reCAPTCHA Plugin を作った。

前回、 reCAPTCHA 入力値の判定を CakePHP の Model 内での Validation 時に行う話を書きました。それならばいっそのこと Plugin 化してしまおう、ということで作りました。reCAPTCHA API 用 PHP ライブラリを CakePHP から簡単に使おうというものです。
tbsmcd/recaptcha_plugin - GitHub
使い方は README にも書いてありますが、

1. reCAPTCHA キーを取得。
こちらからサインインして取得します。PUBLIC と PRIVATE があるので両方ともメモってください。

2. ライブラリファイルを設置
こちらからダウンロード・解凍し、recaptcha_plugin/vendors/recaptchalib.php となるように設置してください。

3. 設定ファイルの記述
1 で取得したキーを recaptcha_plugin/config/key.php に記述します。
	$config = array(
		'Recaptcha' => array(
			'Public'  => 'YOUR_RECAPTCHA_PUBLIC_KEY',
			'Private' => 'YOUR_RECAPTCHA_PRIVATE_KEY',
		),
	);
key.php.default をコピーしてもらえばいいと思います。

4. コントローラへの記述
reCAPTHCA を使用するフォームのコントローラに
	public $components = array('RecaptchaPlugin.Recaptcha');
	public $helpers = array('RecaptchaPlugin.Recaptcha');
のように記述します。

5. ヘルパーへの記述
reCAPTCHA を使用する form 内に
	echo $this->Recaptcha->show();  // reCAPTCHA 本体の出力
	echo $this->Recaptcha->error(); // Validation メッセージ出力
このように記述します。Recaptcha->show() はデフォルトでテーマ 'red' を使用しますが、show('white') のような形でテーマを指定することが出来ます。使用できるテーマは

red
reCAPTCHA_Red.png
white
reCAPTCHA_White.png
blackglass
reCAPTCHA_Black.png
clean
reCAPTCHA_Clean.png
の4種類です。

これは何をしているのか?
→基本的には前回の記事と同じく、 reCAPTCHA 用の Validation を追加しています。
多少変わった点といえば、 ValidationBehavior で
	function beforeValidate(&$model) {
		$model->validate['recaptcha_response_field'] = array(
			'checkRecaptcha' => array(
				'rule' => array('checkRecaptcha', 'recaptcha_challenge_field'),
				'message' => 'You did not enter the words correctly. Please try again.',
			),
		);
	}
という形でフックして Validation を追加している点と RecaptchaComponent で
	function startup(&$controller) {
		$modelClass = $controller->modelClass;
		if (!empty($controller->params['form']['recaptcha_challenge_field']) && !empty($controller->params['form']['recaptcha_response_field'])) {
			$controller->data[$modelClass]['recaptcha_challenge_field'] = $controller->params['form']['recaptcha_challenge_field'];
			$controller->data[$modelClass]['recaptcha_response_field'] = $controller->params['form']['recaptcha_response_field'];
		}

		$controller->$modelClass->Behaviors->attach('RecaptchaPlugin.Validation');

	}
というように Model にフォーム値を渡しつつ先の ValidationBehavior を指定してる点でしょうか。

さほど分量があるものでもないしそもそも簡単に使えるものなのですが、多少気の利いたプラグインとして役立てばいいかな、と思っています。
posted by tbsmcd at 22:41| Comment(0) | TrackBack(0) | 技術 | このブログの読者になる | 更新情報をチェックする

2011年01月31日

CakePHP で ReCAPTCHA を使う際の Validate

MVC という点から見たらおかしな話…あれ?わからん。

ちょっと ReCAPTCHA に触る機会があったので
CakePHPでreCAPTCHAによる画像認証を実装するまで - 情報と音楽

こちらを見たりしながら ReCAPTCHA をいじっていたんですけど、ユーザー側からしたら CAPTCHA も入力値(しかも一番厄介なもの)なので、他の値と一緒に Validate してみてもいいんじゃない?という話。以下、上記サイトを参照。

いきなり例。CakePHP の blog チュートリアル と同じスキーマから bake していくと

app/posts
index.png

app/posts/add
add.png

こんな感じの画面ができます。App/models/post.php に validation を書いておけば

valid_add.png

valid_error.png

こんなエラーメッセージを表示するように出来るのですが、 CAPTCHA だけ別扱いにするのはユーザから見ると少し不便な気がします。
そこで、上記サイトのコードを参考に少しいじっていってみたいと思います。

App/views/posts/add.ctp に
App::import('Vendor', 'recaptchalib');
$publickey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
echo recaptcha_get_html($publickey);
echo $this->Form->error('recaptcha_response_field');
このようにエラー出力を追加します。

これで view は出来ました。
add_recaptcha.png

次に Controller ですが、 App/controllers/posts_controller.php の add() に
if (!empty($this->data)) {
	// ここから追加
	// ここで $this->data に入力値を渡す.
	$this->data['Post']['recaptcha_challenge_field'] = $this->params['form']['recaptcha_challenge_field'];
	$this->data['Post']['recaptcha_response_field'] = $this->params['form']['recaptcha_response_field'];
	// ここまで追加
bake したものにこれだけ加えます。

最後に Model ですが、App/models/post.php の $validate に
'recaptcha_response_field' => array(
	'checkReCaptcha' => array(
		'rule' => array('checkReCaptcha', 'recaptcha_challenge_field'),
		'message' => 'あ、なんか間違ったみたいだねー。',
	),
),

を加え、ルールを定義する関数として
function checkReCaptcha($data, $target) {
	App::import('Vendor', 'recaptchalib');
	$privatekey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
	$res = recaptcha_check_answer(
		$privatekey,
		$_SERVER["REMOTE_ADDR"], 
		$this->data[$this->name][$target],
		$data['recaptcha_response_field']);
	return $res->is_valid;
}

という風に書いていけば

recaptcha_input.png

recaptcha_error.png

こんな感じで他の入力値と同じようにチェックできるからいいかもね、という話でした。


まあしかし、ビジネスロジックもデータも扱ってない…いやフォーム値のチェックだからな。 /* 追記 */ プラグイン化しました。記事は今度。

tbsmcd/recaptcha_plugin - GitHub
posted by tbsmcd at 23:20| Comment(0) | TrackBack(0) | 技術 | このブログの読者になる | 更新情報をチェックする

2011年01月21日

NAVER まとめと VOW

「NAVER まとめ」 というものがあります。もう流行を超えて定番のツールとして定着した感がありますが、いままで「自分で『まとめ』を作るほど大好き」というほどではなかったんです。ちょっと好きなサービスかなぁ、ぐらいの位置で。

このサービスは画像・動画などのリンクや言葉などを集めた「まとめ」を作るもので、ユーザと Web 上にある資産のマッシュアップ的な雰囲気を出しています。たまに見るとクスッとくる画像やリンクがあったり、また純粋に感心させられる内容の発言であったり。ジャンルや形式は色々あるのですが、やはり目に付くものは「ネタ系」のまとめです。

そう、ネタ系。大好物なんですけどそれ故に受け付けない部分があって、「それ単なるコピペ集じゃね?」とか「〇〇な画像下さい」スレの焼き増しみたいな内容だと少し残念な気持ちになるんです。ものすごく個人的な感情で語りますが、「個人の発想力」みたいなもので企画・実行するからこそ楽しいのでは、と。そして個人を集約した有象無象こそが「集合 "痴"」なのでは、と。そんなシラケを感じる瞬間があって、「まあ好きだけど作るほどのことは無いなぁ」ぐらいに思っていました。

もう一つ理由はあって、それが VOW の存在です。皆さんご存知、読者から投稿された "新聞・雑誌の誤植や街で見つけたヘンなもの" 画像を集めた企画・書籍です。「クスっとくる」画像を集めている点では「ネタ系画像」のまとめと似ているようですが、何故か自分は両者に大きな違いを感じます。何でしょうか。

各所で散々語られていることですが、それは VOW に "画像 → 投稿人コメント → 編集コメント" の三段構えの笑いがある点だと考えています。果たして自分にコメント力があるのか。元ネタの面白さを潰してしまうんじゃないか。どうみても頭でっかちな一人相撲でしかないんですけど、そう考えていました。

まあでも、「欲しい時に画像を取り出せる便利なまとめ」でもいいかな?と考えるに到り、作ってみたのですが…

いいね、これ。

何がいいって、まとめを作り易いところです。

matome.png
作成時の UI が「まず何をしなければならないのか、何を作れるのか」という基本的な説明がわりも兼ねています。

画像を追加する時も、

search.png
このように検索結果から + をクリックして直接追加できるのでお手軽です。

・・・・・・
・・・

という感じで作ってみました。



我ながらなんてくだらないものを…と思うのですが、紳士の嗜みとして「セーフサーチ」を常にオフにしてる人間としては、栗と栗鼠の画像を探しにくいんですよね。これで「クリトリスの画像を下さい」と言われたときにも迷わず探し出すことが出来ます。皆さんも是非活用してくださいね!

ちなみに…
tbsmcd / Tsubasa Mochida
「NAVER まとめ」って初めて作ったけど、こんなんでいいの?/ 便利なクリとリス画像まとめ - NAVER まとめ: http://me.lt/6OxG at 01/20 17:15

naver_jp / NAVER
@tbsmcd ばっちりです! at 01/20 17:21



と、中の人に OK もらっちゃったのでこういう画像集もどんどん作っていいみたいですよ!(「栗と栗鼠」だからやましいところは何も無いよね!)

あ、この記事のタイトルはこれを意識して付けました。10,000人に1人ぐらい共感してくれたらいいなぁ。

クラーク博士と僕 / 四星球
タグ:哲学
posted by tbsmcd at 02:40| Comment(0) | TrackBack(0) | 雑文 | このブログの読者になる | 更新情報をチェックする