Telegram群组因其开放性和高自由度,已成为广告机器人、垃圾消息和骚扰者的重点攻击目标。每当新成员涌入,广告信息便可能瞬间刷屏,严重破坏社群秩序。作为群主或管理员,你是否曾经因为无法24小时盯着群聊而头疼?本文将为提供一套完整的自动化防护方案——利用Telegram机器人将新成员自动禁言,直至其通过验证码验证后再解除禁言。这一方案不仅能有效拦截广告,还能极大减轻管理负担。
为什么需要自动禁言新成员?
绝大多数广告机器人会在加入群组的几秒内就开始发送垃圾信息。传统的屏蔽方式往往滞后,而启用“加入即禁言”策略可以争取到宝贵的验证时间。新成员无法在验证前发言,即使他们想在群内散布广告,也会被系统拦截。此外,这一做法还能过滤掉那些无心验证、只想“轰炸”的恶意账号,将群组维护成本降至最低。
解决方案总体设计
整个防护流程可拆解为以下四个关键环节:
- 监听新成员事件:机器人实时捕捉新成员加入群组的动作。
- 立即禁言:调用Bot API中的
restrict_chat_member方法,将新成员权限设为“仅可阅读”。 - 私信或群内发送验证码:机器人随机生成一组数字/字母代码,通过私信或群内@方式告知用户。
- 验证并解除禁言:用户提交验证码后,机器人校验无误即恢复发言权限;若超时或验证失败则自动踢出。
该设计既能保证正常用户一步到位,又能让广告机器人无隙可乘。同时,支持自定义超时时间、防刷次数等参数,灵活适配不同场景。
准备工作:机器人创建与权限配置
在编码之前,请先完成以下两步:
- 在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群组保驾护航,让每一位成员都能享受清爽的聊天体验。