Telegram机器人实现入群验证码功能(防机器人)完整开发指南

详细介绍如何使用Telegram Bot API实现入群验证码功能,有效防止机器人进群骚扰,包含完整代码示例和配置步骤。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在Telegram群组中,恶意机器人和垃圾广告一直是管理员头疼的问题。每当有新成员加入,就可能引发一波刷屏骚扰。为了净化群组环境,入群验证码(Captcha Verification)成为最有效的防线之一。本文将带您从零开始,使用Telegram Bot API实现一个完整的入群验证码功能,让您的群组从此远离机器人骚扰。

一、入群验证码的工作原理

入群验证码的核心思想是:当新用户加入群组时,机器人立即向其发送一条私聊消息,内含一个随机生成的验证码。用户需要在指定时间内回复正确的验证码,才能获得发言权限;否则将被机器人移出群组。这样既能拦截自动化机器人,也不会给真实用户带来过多困扰。

二、准备工作

在编写代码之前,您需要完成以下准备:

  1. 创建机器人:在Telegram中向@BotFather发送/newbot,按提示获取API Token。
  2. 设置机器人权限:在群组中添加机器人为管理员,并授予以下权限:
    • 删除消息(用于清理广告)
    • 封禁用户(用于踢出验证失败者)
    • 发送私聊消息(自动启用)
  3. 安装开发库:本文使用Python的python-telegram-bot库,执行pip install python-telegram-bot安装。

三、监听新成员加入事件

使用python-telegram-bot可以轻松监听StatusUpdate事件。我们重点处理my_chat_membernew_chat_members,但这里需要的是新成员加入(非机器人自身)。因此,在MessageHandler中过滤status.new_chat_members即可。

四、生成并发送验证码

每个新成员需要获得一个唯一的验证码,并与其user.id绑定。同时设置一个过期时间(通常为60秒)。验证码建议使用不混淆的数字或字母组合,如ABC123。发送私聊消息时,明确告知用户:“您已加入「群组名」,请回复下方验证码完成验证,60秒内有效。”随后使用SimpleKeyboard或纯文本即可。

五、处理用户回复

在私聊消息中监听用户发来的文本。若匹配当前用户绑定的验证码,则更新群组中对应成员的权限(如解除限制),并发送欢迎消息;若超时或错误次数过多,则调用ban_chat_member将用户移出群组。

六、完整代码示例

以下是一个基于python-telegram-bot的完整实现(v20+):

from telegram import Update, ChatPermissions
from telegram.ext import Application, MessageHandler, filters, ContextTypes
import random, string, asyncio

# 存储验证码:user_id -> (code, expires)
captcha = {}

async def on_new_member(update: Update, context: ContextTypes.DEFAULT_TYPE):
    for member in update.message.new_chat_members:
        if member.is_bot:
            continue
        # 生成验证码
        code = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))
        expires = asyncio.get_event_loop().time() + 60  # 60秒后过期
        captcha[member.id] = (code, expires)
        # 私聊发送验证码
        try:
            await update.message.chat.send_message(
                f'请回复以下验证码以完成入群验证:\n有效期60秒。',
                chat_id=member.id
            )
        except Exception:
            # 无法私聊,直接移出
            await update.message.chat.ban_member(member.id)
            continue
        # 限制新成员发言
        await update.message.chat.restrict_member(
            member.id,
            permissions=ChatPermissions(can_send_messages=False)
        )

async def on_captcha_reply(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    text = update.message.text.strip()
    if user.id not in captcha:
        return
    code, expires = captcha[user.id]
    if asyncio.get_event_loop().time() > expires:
        del captcha[user.id]
        await update.message.reply_text('验证码已过期,请重新申请加入。')
        return
    if text == code:
        # 验证通过,解除限制
        chat_id = ???  # 此处需存储用户加入的群组ID
        await context.bot.restrict_chat_member(
            chat_id, user.id,
            permissions=ChatPermissions(can_send_messages=True)
        )
        await update.message.reply_text('验证成功,欢迎入群!')
        del captcha[user.id]
    else:
        # 答案错误,不处理或计数
        await update.message.reply_text('验证码错误,请重试。')

def main():
    app = Application.builder().token("YOUR_BOT_TOKEN").build()
    app.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, on_new_member))
    app.add_handler(MessageHandler(filters.TEXT & filters.ChatType.PRIVATE, on_captcha_reply))
    app.run_polling()

if __name__ == '__main__':
    main()

注意:代码中chat_id需要额外存储,建议将user_idchat_id映射,此处简化处理。

七、常见问题与优化

  • 验证码过期:在用户加入时启动一个定时任务,或在下一次交互时检查时间,超时后自动踢出。
  • 多次失败:允许重试3次,超过则移出,防止暴力尝试。
  • 防止绕过:确保机器人是管理员且设置了“删除消息”权限,可清除用户尝试发送的垃圾消息。
  • 隐私友好:验证码最好在私聊中发送,避免公开显示被其他机器人利用。

总结

通过Telegram Bot API实现入群验证码并不复杂,但能显著提升群组的安全系数。本文给出的方案已涵盖核心逻辑,您可以根据群组需求调整验证码形式(如数学运算、点击按钮等)。结合现有的群组管理功能,为您的社区打造一道坚实的“防机器人”屏障。

FAQ

下载与安装

常见问题

如何获取用户输入的验证码?

通过监听机器人私聊中的文本消息,将发送者ID与存储的验证码绑定,在回调中对比即可。确保机器人已启用"Privacy Mode"(私密模式)才能接收私聊消息。

验证码过期后如何处理?

在存储验证码时记录时间戳,当用户回复时检查时间差。若超过设定有效期(如60秒),直接调用ban_chat_member移出群组。也可以使用异步任务定时清理过期验证码。

如何防止用户通过多次加入绕过验证?

在用户被踢出后,如果再次加入,可以立即触发验证。也可以在数据库记录被封禁用户,若短时间内重复加入则自动拉黑。此外,开启"Slow Mode"(慢速模式)能降低垃圾消息风险。

验证码功能会影响真实用户吗?

只要验证码简单(如4-6位数字),真用户通常30秒内即可完成。设置清晰的提示和友好文案,可减少误操作。验证码仅在入群时触发,不影响后续体验。