随着 Telegram 群组的日益活跃,广告、刷屏和垃圾信息成为群主最头疼的问题。手动删除不仅效率低下,还容易漏掉关键信息。正则表达式(Regex)作为文本匹配的利器,结合 Telegram 的开放 API 和丰富的客户端库,能够实现完全自动化的群消息过滤。本文将从零开始,带你理解正则过滤的核心原理,并手把手实现两种主流的过滤方案,附赠一组可直接套用的过滤规则,助你打造清静的群聊空间。
一、为什么需要正则表达式过滤?
Telegram 官方客户端只提供简单的关键词屏蔽功能,无法应对变形广告、短链接、附言等复杂模式。正则表达式可以描述字符的排列组合,例如识别以 http 开头的链接、纯数字附加码、中英文混合的广告词组,从而精准地筛选出你不想看到的内容。同时,正则过滤可以实时响应,不打扰正常聊天的成员,是群组自动化管理中不可或缺的一环。
二、三个主流过滤方案概览
- Telethon 脚本:适用于个人小群或白嫖用户,通过监听事件实现任意逻辑,灵活性最高,可集成数据库、统计等功能。
- 自定义机器人:基于 Bot API 的助手,适合大群,可公开给群成员使用,支持多群共享规则,并且不需要用户客户端常驻。
- 现成过滤机器人:如 Combot、Rose 等,开箱即用,但规则定制能力有限,无法应对深度场景。
本文重点讲解前两种方案,因为它们是实现“正则过滤”的最佳实践路径。
三、正则表达式快速入门
正则表达式由普通字符和元字符组成。在 Python 中通过 re 模块使用,以下基础元字符必须掌握:
\d 匹配任意数字 等价 [0-9]
\w 匹配字母、数字、下划线
\s 匹配空白字符
. 匹配任意字符(除换行)
* 重复前一个元素 0 次或多次
+ 重复前一个元素 1 次或多次
? 重复前一个元素 0 次或 1 次,也用于非贪婪匹配
[abc] 匹配字符集 a、b、c
(ab|cd) 匹配 ab 或 cd
例如:(https?://\S+) 可以匹配 http 或 https 开头的链接,\bVIP\b 可以精确匹配整个单词 VIP,避免误杀包含 VIP 的单词。
四、实战:用 Telethon 监听群消息并过滤
Telethon 是一个基于 Python 的 MTProto 客户端,可以模拟用户账户监听和操作消息。下面是完整步骤:
4.1 环境准备
安装 Telethon:
pip install telethon
前往 my.telegram.org 创建应用,获取 API ID 和 API Hash(注意保密)。
4.2 编写过滤脚本
创建 filter.py,内容如下:
from telethon import TelegramClient, events
import re
api_id = 1234567 # 替换成你的 API ID
api_hash = 'your_api_hash' # 替换成你的 API Hash
client = TelegramClient('session_name', api_id, api_hash)
# 编译过滤规则:匹配广告链接、加微信等关键词
pattern = re.compile(r'(https?://\S+|加微信|\bVIP\b)', re.IGNORECASE)
@client.on(events.NewMessage(incoming=True))
async def handler(event):
text = event.raw_text or ''
if pattern.search(text):
# 可选:删除消息或回复警告
await event.delete()
# await event.reply('⚠️ 你的消息已被过滤,请勿发布广告!')
async def main():
await client.start()
await client.run_until_disconnected()
if __name__ == '__main__':
import asyncio
asyncio.run(main())
运行脚本后,该账号会以用户身份在线,当群内出现匹配正则的消息时自动删除。注意:使用用户账号操作需要账号等级达到“可删除消息”的权限(通常是群管理员)。
五、实战:用 Bot API 创建过滤机器人
机器人适合作为群代言人,不会暴露个人账号。首先通过 @BotFather 创建机器人并获取 Token,然后使用 python-telegram-bot 库快速实现。
5.1 安装库
pip install python-telegram-bot
5.2 编写机器人代码
from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes
import re
TOKEN = 'YOUR_BOT_TOKEN'
# 过滤规则:识别链接和特定关键词
pattern = re.compile(r'(https?://\S+|广告|代购|加微信)', re.IGNORECASE)
async def filter_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not update.message or not update.message.text:
return
if pattern.search(update.message.text):
# 删除用户消息
try:
await update.message.delete()
except Exception:
pass
# 可选:发送警告
# await update.message.reply_text('❌ 该消息已被过滤,请勿发送违规内容。')
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, filter_message))
app.run_polling()
if __name__ == '__main__':
main()
将机器人加入群组,并授予“删除消息”的管理员权限,即可自动过滤。
六、常用组合过滤规则示例
根据实际需求,你可以组合以下正则来构建自己的规则库:
# 过滤所有短链接和长链接
r'(https?://|www\.)\S+'
# 过滤6位以上的数字(可能是邀请码或附言)
r'\b\d{6,}\b'
# 过滤常见广告词(注意用边界符避免误杀)
r'(?i)(广告|推广|代购|刷单|返利)'
# 综合规则(广告链接或广告词)
r'(?i)(https?://|www\.)\S+|(广告|推广|代购|加微信)'
建议从一开始就建立白名单机制,例如允许特定的群友链接,避免过度过滤。
七、性能优化与注意事项
- 正则设计:避免复杂的嵌套量词,防止灾难性回溯(ReDoS)。例如用
\S+?代替\S*等不必要贪婪匹配。 - 异步处理:Telethon 和 Bot 的处理器均为异步,尽量不要在事件循环中执行阻塞操作(如文件 I/O),可用
asyncio.create_task将耗时任务放到后台。 - 消息量突增:对于高活跃度群组,建议先做采样测试,调整过滤阈值,必要时将日志写入文件以便分析规则误判情况。
- 权限安全:机器人只授予必要的权限(删除消息),不要授予管理员全部权限,降低安全风险。
总结
正则表达式让 Telegram 群管理如虎添翼。通过本文的 Telethon 脚本和 Bot 机器人两套方案,你已经可以灵活地为不同大小的群组定制消息过滤策略。记住:好的规则不是一蹴而就的,要结合群聊内容持续迭代优化。现在就试着用起来吧,让群聊只留下有价值的信息。