在Telegram社群中,广告和恶意消息如同杂草般不断滋生,轻则影响用户体验,重则导致账户被盗或财产损失。作为机器人开发者,我们迫切需要一个既快速又可靠的过滤机制。正则表达式(Regular Expression)因灵活、高效、可自定义,成为消息过滤的首选工具。本文将从实战角度出发,系统讲解如何在Telegram机器人中使用正则表达式识别并拦截广告与恶意内容,同时兼顾性能与误报控制。
一、正则表达式基础回顾
正则表达式是一种匹配字符串的强有力工具。在Telegram机器人开发中,我们通常用它来匹配消息文本中的特定模式。掌握几个核心语法即可覆盖大部分需求:
.匹配任意字符(换行除外)*匹配前一个字符0次或多次+匹配前一个字符1次或多次?匹配前一个字符0次或1次[]字符集,如[0-9]匹配数字()分组,用于捕获或逻辑组合|或逻辑,如cat|dog匹配cat或dog^和$分别匹配行首和行尾\d数字,\w字母数字下划线,\s空白
正则表达式可设置多种标志(flag),例如忽略大小写(i)、多行模式(m)、全局匹配(g)等,在具体编程语言中可灵活开启。
二、构建广告过滤黑白名单
广告消息往往是批量发送的,带有明显的营销词汇或链接。我们可以设计一套黑名单关键词规则,并用正则表达式匹配变体。以下是一些常见广告模式:
- 营销词汇:如“免费领取”、“限时优惠”、“点击链接”、“加微信”等。
- 短化链接域名:如
bit.ly、t.cn、goo.gl。 - 加密货币推广:如“比特币返利”、“保证收益”等。
- 乱码和符号干扰:如“免~费~领~取”、“f r e e”等。
为了应对“变体”绕过,我们可使用正则表达式增加容错性。例如匹配“免费”时,允许在两个字之间插入任意空白或特殊符号:
f\s*[\s。-]?\s*r\s*[\s。-]?\s*e\s*[\s。-]?\s*e -- 以上为示例,实际可简化为:free|f\W*?r\W*?e\W*?e
注意:过于宽泛的正则容易误伤正常消息,因此建议结合上下文和阈值判断。
三、恶意消息识别策略
除了广告外,机器人还需防范钓鱼链接、恶意代码、诈骗话术等。以下策略可提升安全性:
1. 检测高危链接
除了短链接域名,还可以匹配IP地址形式的URL,或匹配以@开头伪装用户名。示例:
(https?://)?[\d]{1,3}(\.[\d]{1,3}){3}(:\d+)?
2. 识别敏感金融词汇
例如“转账”、“验证码”、“账号密码”等。组合使用时,需判断是否属于可疑语境。
3. 拦截异常格式
消息中大量重复字符(如“!!!!!!”、“????”)往往是垃圾内容信号。可以用正则:
(.)\1{5,}
匹配任意字符重复6次及以上。
四、在Telegram机器人中实现正则过滤器
下面以Python + python-telegram-bot库为例,展示一个简单的过滤逻辑:
import re
from telegram.ext import Updater, MessageHandler, Filters
# 预编译模式,提升性能
AD_PATTERN = re.compile(r"(免费领取|点击链接|加微信|t\.cn/|bit\.ly/)", re.IGNORECASE)
MAL_PATTERN = re.compile(r"(https?://[\d]{1,3}(\.[\d]{1,3}){3}|验证码|转账)")
def filter_message(update, context):
text = update.message.text
if not text:
return
if AD_PATTERN.search(text) or MAL_PATTERN.search(text):
# 可执行删除、禁言或发警告
update.message.delete()
# 可选:通知管理员
context.bot.send_message(chat_id=update.effective_chat.id, text="检测到广告,消息已删除。")
def main():
updater = Updater(token="YOUR_BOT_TOKEN", use_context=True)
dp = updater.dispatcher
# 添加过滤处理器,在普通消息之前执行
dp.add_handler(MessageHandler(Filters.text & ~Filters.command, filter_message), 1)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
上述代码中,通过re.compile预编译正则,避免每次匹配都重新解析。添加了一个高优先级(group=1)的处理器,确保过滤消息先于普通处理。管理员可使用命令/whitelist来豁免某些用户或群组,或设计白名单机制,保证重要内容不被误删。
五、性能优化与误报处理
正则在群组消息量巨大时可能成为性能瓶颈。以下措施可保持机器人快速响应:
- 预编译正则:将正则模式在启动时编译为Pattern对象,避免每次匹配重复编译。
- 限制匹配范围:只对文本消息进行过滤,跳过命令和媒体描述(除非必要)。
- 使用“非贪婪”匹配:正则中尽量使用
.*?而非.*,防止回溯灾难。 - 设置超时:在编程语言中为正则匹配设置超时(如Python的
re.search无内置超时,可结合信号或使用第三方库),防止因异常输入卡死进程。
误报是过滤系统面临的最大挑战。为了减少误删正常消息,建议采用以下策略:
- 分层过滤:先进行轻度过滤(匹配明显广告词),再对疑似内容进行人工或更深度检查。
- 不直接删除,先警告或禁言:将消息保留但标记,待管理员确认或达到次数后再处理。
- 支持用户申诉:提供“解除屏蔽”的命令,被误删用户可要求管理员复审。
- 记录日志:保存被过滤消息的原文和触发规则,方便后续调整正则。
六、测试与调试技巧
正则表达式难以一次写对,建议按以下步骤验证:
- 使用在线正则测试工具(如regex101、regexr)粘贴你的模式,用真实垃圾样本测试,同时用正常消息样本测试误报率。
- 在开发环境搭建测试群组,将包络为垃圾文本发送给自己或测试机器人,观察过滤是否触发。
- 编写单元测试,覆盖典型广告、变体、恶意链接和正常消息,确保机器人在更新逻辑后不回归。使用pytest等框架可自动化此过程。
另外,一些高级技巧如捕获组可以提取被过滤消息中的关键信息,便于黑名单更新。例如,从消息中提取短链接域名,并动态加入黑名单。
总结
正则表达式是Telegram机器人过滤广告和恶意消息的有效武器。通过合理设计规则、预编译提升性能、并设置误报处理机制,您可以构建一个兼顾速度和准确性的过滤系统。然而,过滤器并非银弹,建议结合黑名单动态更新、用户举报反馈以及必要的审核流程,才能持续维护社区环境。从今天起,尝试在您的机器人中加入正则过滤功能,为群组成员营造一个清爽、安全的交流空间。