在Telegram群组中,恶意机器人和垃圾广告一直是管理员头疼的问题。每当有新成员加入,就可能引发一波刷屏骚扰。为了净化群组环境,入群验证码(Captcha Verification)成为最有效的防线之一。本文将带您从零开始,使用Telegram Bot API实现一个完整的入群验证码功能,让您的群组从此远离机器人骚扰。
一、入群验证码的工作原理
入群验证码的核心思想是:当新用户加入群组时,机器人立即向其发送一条私聊消息,内含一个随机生成的验证码。用户需要在指定时间内回复正确的验证码,才能获得发言权限;否则将被机器人移出群组。这样既能拦截自动化机器人,也不会给真实用户带来过多困扰。
二、准备工作
在编写代码之前,您需要完成以下准备:
- 创建机器人:在Telegram中向@BotFather发送
/newbot,按提示获取API Token。 - 设置机器人权限:在群组中添加机器人为管理员,并授予以下权限:
- 删除消息(用于清理广告)
- 封禁用户(用于踢出验证失败者)
- 发送私聊消息(自动启用)
- 安装开发库:本文使用Python的
python-telegram-bot库,执行pip install python-telegram-bot安装。
三、监听新成员加入事件
使用python-telegram-bot可以轻松监听StatusUpdate事件。我们重点处理my_chat_member和new_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_id与chat_id映射,此处简化处理。
七、常见问题与优化
- 验证码过期:在用户加入时启动一个定时任务,或在下一次交互时检查时间,超时后自动踢出。
- 多次失败:允许重试3次,超过则移出,防止暴力尝试。
- 防止绕过:确保机器人是管理员且设置了“删除消息”权限,可清除用户尝试发送的垃圾消息。
- 隐私友好:验证码最好在私聊中发送,避免公开显示被其他机器人利用。
总结
通过Telegram Bot API实现入群验证码并不复杂,但能显著提升群组的安全系数。本文给出的方案已涵盖核心逻辑,您可以根据群组需求调整验证码形式(如数学运算、点击按钮等)。结合现有的群组管理功能,为您的社区打造一道坚实的“防机器人”屏障。