Skip to content

ramsayleung/bayes_spam_sniper

Repository files navigation

基于贝叶斯算法的 Telegram广告拦截机器人

BSS(@BayesSpamSniperBot) 是一个具备自学习能力的,基于贝叶斯定理实现的开源 Telegram 广告拦截机器人

特点

常见的 Telegram 广告机器人是大多是基于关键字的,通过匹配关键字进行文本拦截,非常容易被发垃圾广告的人绕过。

这不禁让我想起了保罗.格雷厄姆在《黑客与画家》一书在2002年介绍的情况:

当时电子邮件兴起,也有非常多的垃圾邮件,常见的垃圾广告拦截方式是关键字匹配+邮件地址黑名单,但是既低效也容易被绕过。

保罗.格雷厄姆就创造性地使用贝叶斯算法(Bayes Theorem)实现了一个广告拦截器, 效果竟然出奇地好。

对于 Telegram 的垃圾广告而言,这不是类似的问题嘛?那我可以用类似的解决方案来解决 Telegram 广告的问题嘛

如何使用

  • 将机器人添加到您的群组
  • 给予机器人管理员权限(删除消息(delete message ),封禁用户权限(ban user ))
  • 机器人将自动开始工作

机器人会自动识别群内广告,然后删除文本消息,如果发送垃圾文本超过3次,将会被封禁。

./doc/img/detect_spam_and_ban_user.jpg

本机器人的设计理念就是最小化打扰管理员与用户,提供简单的操作命令,并最大可能地自动化, 所以本机器人只提供以下三个命令(支持”/”开头自动补全):

./doc/img/command_auto_completion.jpg

/markspam

删除垃圾消息并封禁用户, 需要管理员权限。

在某条你想封禁的信息下回复 /markspam, 机器人就会自动把该条消息删除被封禁用户.

./doc/img/markspam_2.jpg

(消息也被删除) ./doc/img/markspam.jpg

与常见的群管理机器人不同,这条命令不仅会删除垃圾消息并封禁用户, 因为这条消息还被管理员标记成垃圾文本,有非常高的置信度,所以系统就会以这条垃圾文本为训练数据,对模型进行实时更新。

下次类似的发言不仅会被识别,所有使用本机器人的群组都会受益,也会把类似的文本标记成垃圾广告

/listspam

查看封禁账户列表, 需要管理员权限。

./doc/img/listspam.jpg

查看已封禁的用户列表,并主动解封。

/feedspam

投喂垃圾信息来训练,无任何权限要求,可私聊投喂或在群组内投喂.

私聊投喂:

./doc/img/feedspam.jpg

群组内投喂:

./doc/img/feedspam2.jpg

架构设计

Telegram Bot 支持两种与 Telegram 服务器交互的模式,分别是:

  1. Webhook: Telegram 服务器会在 Bot 收到新消息时主动回调此前 Bot 注册的地址,Bot Server 只需要处理回调的消息
  2. Long Polling: Bot Server 一直轮询 Telegram 服务器,看是否有新消息,有就处理,本项目使用的是此模式

./doc/img/webhook_vs_long_polling.jpg

消息分析

./doc/img/spam_analyze.jpg

Bot Server 收到消息之后,会派发到单独的 telegram_bot_worker 处理,然后根据预训练的模型判断是否是垃圾文本,如果是,调用 bot API 删除消息

封禁并训练

./doc/img/mark_spam_and_ban_user.jpg

Bot Server 收到消息之后,会派发到单独的 telegram_bot_worker 处理, telegram_bot_worker 会调用 bot API 删除消息并封禁用户,并插入一条训练数据,标记为垃圾文本(spam)

保存训练数据会触发 hook, 创建一个训练消息,投递到消息队列 training, 会有另外的 worker classifier_trainer 订阅 training 消息,并使用新消息重新训练和更新模型

如何贡献

本项目纯粹用爱发电,如果想支持本项目,有以下的方式进行贡献:

  1. 通过 /feedspam 命令投喂训练数据
  2. 加入 BSS 支持群,或作者私人频道,在群里发广告
  3. Sponsor 作者

常见问题

说得这么厉害,为什么别人在我群里发的广告还是没有被识别?

贝叶斯算法本质是个概率算法,如果它没有见过类似的广告,那么它就没法判断是否垃圾广告 :(

稍安勿躁,你需要做只是使用 /markspam 删除消息并封禁用户,就可以帮助训练这个bot, 所有使用这个 bot 的用户都会因此受益

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages