Telegram机器人自动禁言新成员直至通过验证的防广告方案

本文将详细介绍如何通过Telegram机器人在新成员入群时自动禁言,并发送验证码要求其通过验证后方可发言,从而有效抵御广告刷屏和恶意骚扰的统一防护方案。包含完整代码示例、常见问题与最佳实践。

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

Telegram群组因其开放性和高自由度,已成为广告机器人、垃圾消息和骚扰者的重点攻击目标。每当新成员涌入,广告信息便可能瞬间刷屏,严重破坏社群秩序。作为群主或管理员,你是否曾经因为无法24小时盯着群聊而头疼?本文将为提供一套完整的自动化防护方案——利用Telegram机器人将新成员自动禁言,直至其通过验证码验证后再解除禁言。这一方案不仅能有效拦截广告,还能极大减轻管理负担。

为什么需要自动禁言新成员?

绝大多数广告机器人会在加入群组的几秒内就开始发送垃圾信息。传统的屏蔽方式往往滞后,而启用“加入即禁言”策略可以争取到宝贵的验证时间。新成员无法在验证前发言,即使他们想在群内散布广告,也会被系统拦截。此外,这一做法还能过滤掉那些无心验证、只想“轰炸”的恶意账号,将群组维护成本降至最低。

解决方案总体设计

整个防护流程可拆解为以下四个关键环节:

  1. 监听新成员事件:机器人实时捕捉新成员加入群组的动作。
  2. 立即禁言:调用Bot API中的 restrict_chat_member 方法,将新成员权限设为“仅可阅读”。
  3. 私信或群内发送验证码:机器人随机生成一组数字/字母代码,通过私信或群内@方式告知用户。
  4. 验证并解除禁言:用户提交验证码后,机器人校验无误即恢复发言权限;若超时或验证失败则自动踢出。

该设计既能保证正常用户一步到位,又能让广告机器人无隙可乘。同时,支持自定义超时时间、防刷次数等参数,灵活适配不同场景。

准备工作:机器人创建与权限配置

在编码之前,请先完成以下两步:

  • 在Telegram中联系 @BotFather,使用 /newbot 创建属于你自己的机器人,并获取API Token。
  • 将机器人设为群组管理员,并授予“禁言成员”“删除消息”“发送消息”等权限。若使用私信验证,则无需授予“发消息”权限,但建议保留“禁言”核心权限。

安全提示:机器人Token是敏感信息,请勿公开或写入前端代码,建议使用环境变量保存。

实现自动禁言的核心代码

这里以Python为例,使用业界流行的 python-telegram-bot 库。首先安装依赖:

pip install python-telegram-bot

下方代码演示了监听新成员并立即禁言的操作:

from telegram import Update, ChatPermissions
from telegram.ext import Application, MessageHandler, filters

async def restrict_new_member(update: Update, context: ContextTypes.DEFAULT_TYPE):
    for member in update.message.new_chat_members:
        # 不包括机器人自己
        if member.id != context.bot.id:
            await context.bot.restrict_chat_member(
                chat_id=update.effective_chat.id,
                user_id=member.id,
                permissions=ChatPermissions(can_send_messages=False)
            )
            await update.message.reply_text(
                f"欢迎 @{member.username}!您已被暂时禁言,请发送 /verify 获取验证码。"
            )

app = Application.builder().token("YOUR_TOKEN").build()
app.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, restrict_new_member))
app.run_polling()

生成并校验验证码的具体实现

验证码是整个方案的灵魂。我们需要一个独立的数据结构存储每个用户的临时验证码和有效期。推荐使用内存字典(简单场景)或Redis(生产环境)。这里给出一个轻量级的实现思路:

  • 用户发送 /verify 后,机器人生成一个6位随机数字,并存入 user_codes[user_id] = {'code': '123456', 'expire': time.time()+300}
  • 私信或群内发送验证码,提示用户输入。
  • 用户回复验证码时,机器人比对并检查有效期,通过后调用 restrict_chat_member 恢复发言权限。
  • 若验证码错误或超时,则提示重新获取,连续失败达到3次自动踢出。

以下为验证命令的核心片段:

async def verify(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    if user_id in user_codes and user_codes[user_id]['expire'] > time.time():
        entered = update.message.text.strip()
        if entered == user_codes[user_id]['code']:
            await context.bot.restrict_chat_member(
                chat_id=update.effective_chat.id,
                user_id=user_id,
                permissions=ChatPermissions(can_send_messages=True)
            )
            await update.message.reply_text("✅ 验证成功,欢迎发言!")
            del user_codes[user_id]
        else:
            await update.message.reply_text("❌ 验证码错误,请重试。")
    else:
        await update.message.reply_text("请先发送 /verify 获取验证码。")

完整代码示例

为了方便你快速部署,这里提供一个可直接运行的完整脚本。请注意,实际使用时请将 YOUR_TOKEN 替换为你的Token,并考虑用更稳定的存储方案(如SQLite)代替内存字典。

import time
from telegram import Update, ChatPermissions
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

USER_CODES = {}  # user_id -> {'code': str, 'expire': float}

async def restrict_new_member(update: Update, context: ContextTypes.DEFAULT_TYPE):
    for member in update.message.new_chat_members:
        if member.id != context.bot.id:
            await context.bot.restrict_chat_member(
                chat_id=update.effective_chat.id,
                user_id=member.id,
                permissions=ChatPermissions(can_send_messages=False)
            )
            await update.message.reply_text(
                f"欢迎 {member.name}!请发送 /verify 获取验证码,通过后即可发言。"
            )

async def verify(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    if USER_CODES.get(user_id) and USER_CODES[user_id]['expire'] > time.time():
        entered = update.message.text.strip().split()[1] if len(update.message.text.split()) > 1 else None
        if entered == USER_CODES[user_id]['code']:
            await context.bot.restrict_chat_member(
                chat_id=update.effective_chat.id,
                user_id=user_id,
                permissions=ChatPermissions(can_send_messages=True)
            )
            await update.message.reply_text("✅ 验证成功,欢迎发言!")
            del USER_CODES[user_id]
        else:
            await update.message.reply_text("❌ 验证码错误,请重试。")
    else:
        code = str(random.randint(100000, 999999))
        USER_CODES[user_id] = {'code': code, 'expire': time.time() + 300}
        await update.message.reply_text(f"您的验证码是:,请在5分钟内输入。")

if __name__ == '__main__':
    app = Application.builder().token("YOUR_TOKEN").build()
    app.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, restrict_new_member))
    app.add_handler(CommandHandler("verify", verify))
    app.run_polling()

注意:这里将验证码直接发送在群内,方便用户复制,但若担心被截获,可以改为私信发送(使用 context.bot.send_message)。

验证码超时或多次失败的处置策略

再完美的方案也会遇到不配合的用户。建议以下策略:

  • 验证码有效期为5分钟,超时后自动失效,用户需重新请求。
  • 同一用户连续错误3次,直接将其移出群组,并可通过日志查看其ID以预防再入。
  • 对于长期不验证的用户,可设置24小时自动清理,以维持群内成员活跃度与纯净度。

这些策略可以通过定时任务(如 apscheduler)实现,也可以简单地在用户发起验证时检查上一次记录的时间。

其他重要注意事项

  • 隐私保护:在验证过程中,切勿收集用户敏感信息,短信验证码等任何形式的数据都应避免。本方案仅涉及用户ID和机器人交互,符合Telegram隐私使用条款。
  • 群组权限:机器人必须拥有“禁言成员”权限,否则调用API会报错。同时,请确保机器人未被用户手动解除管理员。
  • 错误处理:建议在代码中加入try-except,以应对网络波动或API限制。可使用RetryAfter异常机制平滑处理。
  • 性能考量:如果群组人数巨大,建议使用异步队列或消息队列,避免阻塞主循环。

总结

通过自动禁言新成员并强制验证,我们为Telegram社群筑起了一道坚实的防广告防线。这种方法看似简单,却极有成效,尤其适合大型公开群组。你还可以在本文基础上扩展,例如接入图形验证码、API反垃圾服务,或是结合关键词过滤系统。希望本文能为你的Telegram群组保驾护航,让每一位成员都能享受清爽的聊天体验。

FAQ

下载与安装

常见问题

如何获取Telegram机器人的Token?

在Telegram中搜索 @BotFather,发送 /newbot,按照提示设置机器人名称和后缀,即可获得API Token。该Token用于调用Bot API,必须妥善保管。

机器人需要哪些权限才能禁言新成员?

机器人必须是群组管理员,并且拥有“禁言成员”(restrict members)和“删除消息”(delete messages)权限。在群组管理员设置中为机器人勾选这些权限即可。

如果用户一直不验证,会怎么样?

默认情况下,不验证的用户会一直处于禁言状态。可额外设置自动清理任务,例如超过24小时未验证则将其移出群组,以避免“僵尸成员”保留。

该方案支持私信发送验证码吗?

支持。将回复验证码的代码改为调用 send_message 私聊发送即可。但要注意用户可能未开始私聊机器人,导致发送失败,因此建议同时保留群内发送作为备选。

验证码可以由图片验证码替代吗?

当然可以。你可以在 get_verification_image 中生成图片并发送,但实现复杂度更高。本文介绍的数字验证码已足以应对绝大多数广告机器人。