/images/2024/anti-spam/spam-wave.png

一大波SPAM即将到来

最近,SPAM 狂潮来袭,一波又一波的 SPAM 的到来,让实例管理人员疲于奔命。

/images/2024/anti-spam/report-email.png

有关 Report 的提醒邮件 (未完,下方还有好几屏)

面对 SPAM 报告,我们需要封禁 SPAM 帐户,Limite 被 SPAM 入侵的实例以防进一步的骚扰。

但这几个步骤通过 Mastodon Web 自带的管理界面进行非常麻烦,需要打开好几个网页,点击好多次才能完成。 如果你还要发布管理操作报告,那就更麻烦了。

Mastodon Web 自带的管理工具,在这种大规模 SPAM 入侵时,显得有一些力不从心。

人肉管理 vs 脚本SPAM,人肉管理能不能胜利尚不好说,但累死是一定的。现代问题现代方法解决,管理也需要脚本辅助。

本文将介绍,如何使用脚本半自动化处理的黑猫SPAM。

本文提到的所有文件可至 anti-blackcat-spam 目录查看。

0. 所需条件

  • Mastodon PostgreSQL 数据库访问权限

  • Mastodon 实例 Admin 权限

  • python 运行环境

1. 注册应用

Mastodon Web 界面,打开 首选项(Preferences) -> 开发(Development) 。

/images/2024/anti-spam/settings-applications.png

首选项(Preferences) -> 开发(Development)

创建如下 Scopes 的应用:

read:accounts read:statuses write:reports admin:read:accounts admin:read:domain_allows admin:read:domain_blocks admin:read:reports admin:write:accounts admin:write:domain_allows admin:write:domain_blocks admin:write:reports

2. 查找疑似 SPAM 帐户

连接上 Mastodon PostgreSQL ,运行如下 SQL 找出疑似 SPAM 帐户,并将结果保存为 CSV 文件。

-- 查找所有位于未进行管理操作实例的疑似 SPAM 帐户
select
    id,
    username,
    domain,
    display_name,
    avatar_file_name
from
    accounts
where
    username ~ '^[0-9a-z]{10}$'
    and (username = display_name or display_name = '')
    and created_at > '2024-02-15 00:00:00'
    and suspended_at is null
    and avatar_file_name is null
    and "domain" is not null
    and "domain" not in (
    select
        db."domain"
    from
        domain_blocks db
);

3. 运行管理脚本

管理脚本下载至本地,如需在线查看可点击此链接

3.1 安装依赖

pip install Mastodon.py beautifulsoup4

3.2 修改管理脚本

3.2.1 修改 DOMAIN

根据实际情况,将 DOMAIN 设置为你需要管理的实例域名。

3.2.2 修改 ACCESS_TOKEN

1. 注册应用 中所获取的 access token 填入 ACCESS_TOKEN

3.2.3 修改 ACCOUTS_CSV_FILE

2. 查找疑似 SPAM 帐户 中所得到的 CSV 文件放到管理脚本同目录,并将 ACCOUTS_CSV_FILE 修改为相应 CSV 文件的文件名。

3.3 运行脚本

python main.py

管理脚本将输出疑似 SPAM 帐户帐户名以及最新的一条嘟文以供确认, 如确认为 SPAM 帐户,管理脚本将为该 SPAM 帐户创建 Report 并转发至原站, 然后封禁所有 SPAM 帐户, Limite 所有 SPAM 帐户所在实例。

/images/2024/anti-spam/python-console-1.png/images/2024/anti-spam/python-console-2.png

22时更新

之前的博文发出之后,在实际使用中发现了一些问题,于是这个脚本便有了 v2v3 版本。

v2 版本变化

CSV 文件名硬编码在脚本中,每次运行都要修改脚本,实在是太麻烦了。

因此便有了 v2 版,通过命令行参数读取 CSV 文件名。

v3 版本变化

虽然有了管理脚本辅助,但获取CSV文件,更新管理通告都还是要打开其它程序,还是有一些不方便。

于是加上了 psycopg2 让脚本直接从数据库中获取数据,同时增加了更新管理通告的功能。

真正实现了一条龙服务,方便到家,脚本包干。