- 识别被系统撤回的图片,裁剪后重新发送
- 将图片上传到 OSS,并返回短链接
QQ频道对于图片有额外的审计机制,这是个异步操作,会在审计结果出来之后再撤回图片。这就让我们有机会拿到没有通过审计的图片的信息,重新加工后再次发送。
一张图片如果审计失败,第二次发送将不会真的发送出去,只会在本地显示,做出一种发送成功的假象。这时候你可能想到去利用原来绕过审计的方法,比如模糊,胡乱画几笔等,这些方法均无法影响审计结果。因此推测其使用了基于图片相似度的审计方式。那么应对的方法也很简单,将图片裁剪为两半发送。
因此该 Bot 会在检测到图片被系统撤回后,将图片裁剪为上下两部分,并放在同一条消息中发送,这样对观感影响最小。
本来撤回应该能收到一个事件,但是由于 go-cqhttp 尚未支持该事件,因此我们采取了比较麻烦的做法。
- 首先判断一条消息是否包含图片
- 是的话则将其加入队列中
- 10s 后将其从队列中取出,通过
/get_guild_msg
接口请求这条消息 - 如果失败则说明图片被撤回
首先你需要有:
- Node.js 16.x
- Redis
- OSS
- go-cqhttp
关于 go-cqhttp 的配置这里不再赘述,请查看相应的文档。这里需要注意的是,登陆的 QQ 号需要有频道内测权限,并已经加入需要管理的频道。
git clone https://github.com/ITJesse/bypass-qq-guild-img-audit.git
cd bypass-qq-guild-img-audit
cp .env.example .env
编辑 .env
文件,填入你的信息。
yarn
yarn build
yarn start
yarn dev
启动 bot,使用你需要设置为管理员的账号在任意频道内发送一条消息,查看 log,其中 sender 的 tiny_id 就是该账号的 ID,将其填入 ADMIN_ID 字段即可。
/func [enable|disable] [bypass|archive]
请在对应的子频道中执行上述命令。命令对于子频道分别生效,需要在每个希望启用/关闭的子频道中执行一遍命令。 所有功能默认都是关闭状态,需要执行该命令开启。
GPLv3