Telegram正则表达式过滤群消息实战:从规则编写到机器人部署

本文深入讲解在Telegram群组中使用正则表达式过滤消息的实用技巧,涵盖Telethon脚本、自定义机器人和常见广告/敏感词过滤规则,帮助群主高效管理聊天内容。

阅读提示建议先浏览小标题,再根据需要深入阅读具体段落。

随着 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 机器人两套方案,你已经可以灵活地为不同大小的群组定制消息过滤策略。记住:好的规则不是一蹴而就的,要结合群聊内容持续迭代优化。现在就试着用起来吧,让群聊只留下有价值的信息。

FAQ

安装与配置指南

常见问题

Telegram 自带正则过滤功能吗?

Telegram 官方客户端没有提供正则表达式过滤功能,但可以通过 Bot API 或 Telethon 等第三方库实现同等甚至更强大的过滤效果。

使用正则过滤会误删正常消息吗?

可能。正则表达式如果过于宽泛或边界模糊,容易误删。建议先用宽松的规则在测试群运行,同时添加白名单机制,并优先使用警告代替删除,等规则稳定后再启用自动删除。

如何让过滤机器人长期稳定运行?

可以将机器人部署在云服务器或 NAS 上,使用 systemd 或 Docker 守护进程,并处理断线重连(如 Telethon 的自动重连)。同时,记录日志以便及时调整正则规则,避免性能瓶颈。