ata
发布于 2022-03-09 / 3 阅读 / 0 评论 / 0 点赞

反频道马甲 Bot

反频道马甲 Bot

简易的 Telegram 群组管理机器人。练手作,Written in JavaScript.

Demo | GitHub

功能列表

  • 删除群成员以频道马甲身份发送的消息;
    • 白名单制,在白名单内的马甲不受影响;
    • 可封禁 / 解封马甲。被封禁的马甲,其创建者在该群组内无法再使用马甲功能。
  • 删除群管理匿名发送的消息;
  • 删除群内来自关联频道的消息;
  • 自动解除来自关联频道的消息。

开发过程小记

Telegram v8.3.0 版本更新了一个评价褒贬不一的功能:拥有频道的用户,可以在群内以频道身份发言。这个 feature 即是推广频道的好途径,同时也为广告 spammers 提供了手段。遂有了写一个机器人阻止滥用的想法。

当晚写到凌晨 1 点钟部署上线(途中还遇到了 Telegram 更新 Bot API v5.5,Update 数据突然多了几个属性),匆匆发到频道、转发到了大学联盟群里,就去睡觉了。一觉醒来,我超,我关注的几个重大频道都推了我的机器人,使用群组直接破百,算是意外之喜了。代码开源到 GitHub,也收获了一点 Star。

现在(2022/03/09)有 200 多个群组在用,比较稳定。反正托管成本不高,先一直挂着吧,为中文圈气氛作点小贡献。

思路

PS:此处数据以 Bot API 为例。MTProto API 的数据更为复杂,此处应该用不到。

反频道马甲

核心功能的思路很简单:根据 Update 中的发送者 UID(Unique Identifier)判断是否为频道身份。我已知的有两种办法:

  1. 官方为了保证健壮性,用了一个机器人 @Channel_Bot 作为占位,可以检测这个用户名或其 UID。
  2. Update.message 新增了一个 sender_chat 属性,如果此属性存在且 typechannel,则意味着发送者为频道身份。

发现了直接删消息就行。 当然在白名单里的不能删,作个判断就行。

删除匿名消息

具备匿名权限的群管理能以整个群组的身份发言。虽说一般这个权限不会乱给,不过本着写都写了的原则, 还是做了这个功能。判断方法和上面一样,机器人换成 @GroupAnonymousBot ,sender_chat.type 换成 groupsupergroup,视群人数而定。

删除 & 取消置顶来自关联频道的消息

如果频道关联了一个群组,频道的新消息会自动转发到群内,收到的回复作为评论区。Bot API 5.5 还新增了 is_automatic_forward 属性,来自关联频道的消息带有此属性。

统计数据

做完上线之后发现很多群用,遂产生了统计数据的想法。

使用 Object.keys() 获取群组 UID 数组,然后挨个 getChatMembersCount 就行了。不过显然会遇到 flood wait 错误,可以使用 try-catch 捕获,如果包含 429 Too Many Request 就将 UID push 回数组,这样可以一直顶着 rate limit 请求。 因为获取时间比较长,顺便用 setInterval 做了一个获取进度条,每隔几秒更新查询进度,完成后 clearInterval


评论