SimpleAntiSpam

  • 简单数学题反垃圾评论插件 (手动调用版)

插件代码

您需要创建一个新的插件。请按照以下步骤操作。

第1步:创建插件目录和文件

在您的Typecho安装目录中,找到usr/plugins文件夹。
在此文件夹内创建一个新的文件夹,命名为SimpleAntiSpam
SimpleAntiSpam文件夹内,创建一个名为Plugin.php的文件。

第2步:将以下代码复制到Plugin.php文件中

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

/**
 * 简单数学题反垃圾评论插件 (手动调用版)
 *
 * @package SimpleAntiSpam
 * @author Gemini
 * @version 2.0.0
 * @link https://google.com
 */
class SimpleAntiSpam_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件方法
     */
    public static function activate()
    {
        // 【重要修改】移除了自动添加表单的钩子,只保留后台验证的钩子
        Typecho_Plugin::factory('Widget_Feedback')->comment = array('SimpleAntiSpam_Plugin', 'validateCaptcha');
        
        return _t('插件已激活,请务必参照说明,在主题的 comments.php 文件中手动添加代码。');
    }

    /**
     * 禁用插件方法
     */
    public static function deactivate()
    {
        return _t('插件已禁用。');
    }

    /**
     * 插件配置面板 (空)
     */
    public static function config(Typecho_Widget_Helper_Form $form){}

    /**
     * 个人配置面板 (空)
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form){}

    /**
     * 渲染并输出验证码HTML (此函数现在需要手动调用)
     */
    public static function renderCaptcha()
    {
        if (Typecho_Widget::widget('Widget_User')->hasLogin()) {
            return;
        }

        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }

        $num1 = rand(1, 9);
        $num2 = rand(1, 9);
        
        $_SESSION['simple_anti_spam_answer'] = $num1 + $num2;

        $html = '
        <p class="comment-form-captcha">
            <label for="captcha_code" class="required">真人验证</label>
            <input type="text" name="captcha_code" id="captcha_code" class="text" size="15" value="" required />
            <span class="captcha-question">'. $num1 .' + '. $num2 .' = ?</span>
            <style>.captcha-question{margin-left:10px;font-weight:bold;color:#333;}.comment-form-captcha input{width:60px;vertical-align:middle;}</style>
        </p>
        ';
        echo $html;
    }

    /**
     * 验证用户提交的答案 (此函数保持不变)
     */
    public static function validateCaptcha($comment)
    {
        if (Typecho_Widget::widget('Widget_User')->hasLogin()) {
            return $comment;
        }

        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }

        $correctAnswer = isset($_SESSION['simple_anti_spam_answer']) ? $_SESSION['simple_anti_spam_answer'] : null;
        $userAnswer = isset($_POST['captcha_code']) ? $_POST['captcha_code'] : null;

        if ($correctAnswer === null || $userAnswer != $correctAnswer) {
            if (isset($_SESSION['simple_anti_spam_answer'])) {
                unset($_SESSION['simple_anti_spam_answer']);
            }
            throw new Typecho_Widget_Exception(_t('验证问题回答错误,请返回重试。'));
        }

        unset($_SESSION['simple_anti_spam_answer']);
        
        return $comment;
    }
}

第3步:手动在主题文件中添加代码

这是最关键的一步,它将保证验证码输入框能正确显示。

找到文件:进入您当前正在使用的主题文件夹,路径通常是usr/themes/你的主题名/,然后找到comments.php文件。

编辑文件:打开comments.php文件。

找到位置:在文件中找到类似<button type="submit"<input type="submit"的代码,这通常是评论的“提交”按钮。

添加代码:在“提交”按钮的 上一行,添加以下这行PHP代码:

<?php SimpleAntiSpam_Plugin::renderCaptcha(); ?>

示例:

如果您原来的代码是这样的:

...
    <p>
        <button type="submit" class="submit"><?php _e('提交评论'); ?></button>
    </p>
...

请把它修改成这样:

...
    <?php SimpleAntiSpam_Plugin::renderCaptcha(); ?>
    <p>
        <button type="submit" class="submit"><?php _e('提交评论'); ?></button>
    </p>
...

保存文件。

第4步:最后测试

现在,回到您博客的文章页面,刷新一下,您应该就能在“提交评论”按钮的上方看到“真人验证”的算术题了。

标签: none

添加新评论

5 + 3 = ?