WordPress的验证码插件(扩展)
我的Blog, 时不时就能收到外国人发来的各种垃圾广告...
虽然blog系统有屏蔽垃圾评论的功能, 但是很有局限性...
所以这令我, 很是郁闷
一直就想着要做一个插件, 来防止任何外国人去评论...
(我也没有什么外国朋友, 有的话, 想要交流直接在qq上就好...)
当然, 只有"中文"能办到...
今天搜索, 发现了http://www.dualface.com/blog/?p=194 , 这上面的一个WP插件, 看了下代码, 超简单, 适合我等新手修改...
PS: 此修改未经原作者同意, 在此我深表抱歉...
1. 图片生成.php(UTF-8)
PHP 代码:
< ?php
#
# ImgCode - 用于评论的图像验证码
#
# Copyright (c) 2005 dualface
#
# Update By ETiV
#
/**
* 显示验证码
*
* @copyright Copyright (c) 2004 dualface.com
* @author 廖宇雷 <daut@dualface.com>
* @package register
* @version $Id$
*/
//初始化想要输出的字符(英文+数字), 及其长度(一共4个字符, 加上一个中文就足以屏蔽外国人了)
$string = '';
$string_len = 3;
//输出的英文+数字从下面的字符串中取材.
$stuff = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
//计算长度, 要减去1. 因为要用substr.
$stuff_len = strlen($stuff) - 1;
//循环建立起想要输出的非中文内容
for ($i = 0; $i < $string_len; $i++) {
$string .= substr($stuff, rand(0, $stuff_len), 1);
}
//这里就要开始建立汉字内容了, 下面引号里的内容随便写..基本上不太怪异的汉字就行...
$hanzi = '写几个汉字在里面';
//这里就要用到mb_strlen函数了, 因为汉字是"Multi-Byte, 多字节"字符. 获取到的汉字符串长度, 同样要减去1.
$hanzi_len = mb_strlen($hanzi, 'utf-8') - 1;
//抽取一个汉字.
$single_hanzi = mb_substr($hanzi, rand(0, $hanzi_len), 1, 'utf-8');
// 把随机数存入 session
@session_start();
//SESSION['IMGCODE'] = 非中文字符串.中文字符串
$_SESSION['IMGCODE'] = $string.$single_hanzi;
$_SESSION['IMGCODE_EXPIRED'] = time() + 15 * 60; // 15分钟后该验证码失效
// 生成验证码图片
$img_width = 90;
$img_height = 32;
$img = imagecreate($img_width, $img_height);
imagecolorallocate($img, 0x66, 0x66, 0x66);
$white = imagecolorallocate($img, 0xff, 0xff, 0xff);
$ix = 5;
$iy = 2;
$fontid = imageloadfont(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sketchey.gdf');
imagestring($img, $fontid, $ix, $iy, $string, $white);
//以上是原代码, 我就不做注释了.
//继续...
//设定字体路径, 然后取一个字体."微软雅黑.ttf"
putenv('GDFONTPATH=/font/');
$fontname = 'msyh.ttf';
//用ImageTTFText函数将汉字写到图片上.
ImageTTFText ($img, 12, 0, 66, 20, $white, $fontname, $single_hanzi);
// 输出图片
header("Content-type: " . image_type_to_mime_type(IMAGETYPE_PNG));
imagepng($img);
imagedestroy($img);
?>
2. 插件主体.php(UTF-8)
PHP 代码:
< ?php
/*
Plugin Name: WP-ImgCode
Plugin URI: http://www.dualface.com/
Description: 图形验证码
Version: 1.0.0
Author: dualface
Author URI: http://www.dualface.com/
*/
/*
* UpDate By ETiV
*/
//如果(非 类已存在('wp_imgcode')):
//..........易语言?!
if(!class_exists('wp_imgcode')):
//类名与类中的一个函数名相同:
//属于类的构造函数, 这样写可兼容PHP4...
class wp_imgcode
{
var $version = '1.0.0';
var $plugin_dir = '/wp-content/plugins/wp-imgcode';
function wp_imgcode() {
@session_start();
add_action('comment_form', array(& $this, 'edit_comment_blog'));
add_filter('preprocess_comment', array(& $this, 'preprocess_comment'));
}
function edit_comment_blog() {
//从此处开始修改...
//先写两个javascript的函数
//第一个函数, img_reload()
//可以重新载入验证码图片...
//并且将评论框(comment)及提交按钮解锁.
//warning函数, 将在提交上来的验证码错误时, 弹出一个错误提示.
//剩下就是基本的HTML了...
//**另外, 修正了原作者的
//
//虽然我不知道"{$this->plugin_dir}"中的{}是什么意思,
//但是这样会使在显示单篇帖子时发生错误.
//如果Blog使用了永久链接, 增强搜索引擎优化的话.
//则在察看帖子时, 将会使用当前地址读取图片, 造成图片显示为x.
?>
< ?php } function preprocess_comment($commentdata) { //strtolower函数, 将字符串变成小写. //这样可以避免验证码大小写输入错误造成的麻烦. if (strtolower($_POST['imgcode']) != strtolower($_SESSION['IMGCODE']) || time() >= $_SESSION['IMGCODE_EXPIRED']) {
//如果错误, 则终止程序运行, 且运行js函数->warning().
die('');
}
unset($_SESSION['IMGCODE']);
unset($_SESSION['IMGCODE_EXPIRED']);
return $commentdata;
}
}
//结束如果;
endif;
/**
* Instatiate the global object.
*/
if( !isset($wp_imgcode) )
{
$wp_imgcode =& new wp_imgcode();
}
?>
总结:
插件不错, 代码简洁, 而且易用性很高...
只不过作者考虑有些欠缺, 会造成一些麻烦...
比如, 如果验证码输入错误, 则必须刷新整个页面才能更换验证图片
(想给输入错误的人带来些惩罚?这惩罚未免太重了吧...)