Nodejs 很明显,贵站需要给新用户提供人类识别服务

Nodejs 很明显,贵站需要给新用户提供人类识别服务

强烈建议给注册时间不超过一周(几天适合站长看着办)的用户加个发帖验证码。 老用户就免了,确实扰人。 另外后台是不是要做个黑名单,把广告专业户的ip封杀一段时间。

2 回复

当然可以。以下是一个基于Node.js的简单示例,展示如何为新用户提供人类识别服务,并且只对新用户启用验证码。

示例代码

  1. 安装必要的依赖: 首先,你需要安装一些常用的库,比如expressexpress-validator来处理HTTP请求和表单验证。

    npm install express express-validator
    
  2. 创建基本的Express应用

    const express = require('express');
    const { body, validationResult } = require('express-validator');
    
    const app = express();
    const PORT = 3000;
    
    // 模拟数据库中的用户数据
    const users = [];
    
    // 中间件:解析请求体
    app.use(express.urlencoded({ extended: true }));
    
    // 注册路由
    app.post('/register', [
        body('username').notEmpty().withMessage('用户名不能为空'),
        body('email').isEmail().withMessage('请输入有效的电子邮件地址'),
        body('password').isLength({ min: 5 }).withMessage('密码长度至少为5个字符')
    ], (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }
    
        const newUser = req.body;
        newUser.registeredAt = new Date();
    
        users.push(newUser);
    
        res.send('注册成功!');
    });
    
    // 发帖路由
    app.post('/post', [
        body('content').notEmpty().withMessage('帖子内容不能为空'),
        // 只对新用户启用验证码
        body('captcha').custom((value, { req }) => {
            const user = users.find(u => u.username === req.body.username);
            if (user && ((new Date() - user.registeredAt) / (1000 * 60 * 60 * 24)) < 7) {
                // 验证码检查逻辑
                if (value !== 'correctCaptcha') {
                    throw new Error('验证码错误');
                }
            }
            return true;
        })
    ], (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }
    
        res.send('帖子发布成功!');
    });
    
    app.listen(PORT, () => {
        console.log(`服务器运行在 http://localhost:${PORT}`);
    });
    

解释

  • 用户注册:用户通过POST请求向/register发送数据进行注册。我们使用express-validator来验证表单数据,并将其存储在模拟的users数组中。

  • 发帖:用户通过POST请求向/post发送帖子内容。如果用户注册时间不超过7天,则需要输入验证码。验证码的具体实现可以根据实际情况自定义,这里只是简单地检查是否等于'correctCaptcha'

  • 中间件:我们使用body()方法来验证表单数据,并使用custom()方法来添加自定义的验证码验证逻辑。

这样,我们就实现了对新用户的验证码保护,同时避免了对老用户的打扰。


针对你的需求,可以使用 Node.js 结合 expressrecaptcha 来实现一个简单的验证码功能。以下是具体的实现步骤和代码示例。

步骤

  1. 安装必要的依赖包
    • express: 用于创建服务器和处理 HTTP 请求。
    • express-validator: 用于验证表单输入。
    • google-recaptcha: 用于处理 Google reCAPTCHA 验证。
npm install express express-validator google-recaptcha
  1. 配置 reCAPTCHA

  2. 创建 Node.js 应用

    • 创建一个简单的 Express 应用,包含注册和验证码功能。

示例代码

const express = require('express');
const { check, validationResult } = require('express-validator');
const Recaptcha = require('google-recaptcha');

const app = express();
app.use(express.urlencoded({ extended: true }));

// 假设这是你的数据库,实际中应该用真实的数据库
let users = [];

app.get('/register', (req, res) => {
    res.send(`
        <form method="POST" action="/register">
            <label for="username">Username</label>
            <input type="text" name="username" id="username">
            <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
            <button type="submit">Register</button>
        </form>
    `);
});

app.post('/register', [
    check('username').not().isEmpty().withMessage('Username is required'),
    check('recaptcha').custom((value, { req }) => {
        const recaptcha = new Recaptcha({
            secret: 'YOUR_SECRET_KEY',
            response: req.body['g-recaptcha-response']
        });

        return recaptcha.verify()
            .then(() => {
                // 验证通过
                return true;
            })
            .catch(() => {
                // 验证失败
                throw new Error('Invalid captcha');
            });
    })
], (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }

    const newUser = {
        username: req.body.username,
        registrationDate: new Date(),
    };

    users.push(newUser);
    res.send(`User registered: ${newUser.username}`);
});

app.listen(3000, () => console.log('Server started on port 3000'));

解释

  1. Express 路由

    • /register GET 路由提供注册表单。
    • /register POST 路由处理表单提交,并进行验证码验证。
  2. reCAPTCHA 验证

    • 使用 google-recaptcha 包来验证用户的 reCAPTCHA 响应。
  3. 错误处理

    • 使用 express-validator 来验证表单数据,并处理验证错误。

通过这种方式,你可以为新用户添加一个简单的验证码系统,以防止机器人注册和发帖。

回到顶部