电报防广告机器人 telegram antispam bot 新成员入群时需要人机验证 增加一个命令手动触发

背景

今天在查看机器人日志的时候, 发现有4个异常.

异常的原因不完全清楚, 猜测是网络原因, 机器人程序向Telegram服务器要求设置用户权限时 超时了.

这样就带来一个漏洞, 这4个新用户没有被设置禁言, 没有通过人机验证流程.

需求

需要能对特定用户 主动发起 就像是新成员入群时一样的流程 (禁言, 要求在与机器人的私聊中完成人机验证, 再解除禁言)

实践

通过阅读代码, 发现 新成员的验证流程 track_chat_member 函数中, 需要的外部数据就是chat和user. 很适合进行重构.

那么我们再一次地, 面向GPT编程
对 track_chat_member 函数进行重构, 
目的是为机器人新增一个命令 /new_member_verify <telegram user>
这样可以主动将某个成员当作好像新成员一样进行验证流程. (禁言, 与机器人私聊, 回答问题, 等等)
结果让我非常满意. 不仅是按我的想法重构了函数, 再生成新的 new_member_verify 函数. 而且, 新函数中也考虑了调用命令的用户的身份(需要是管理员或群主).
只是 GPT 改动了原程序中本不需要改动的部分(比如把注释的文字描述换了一种写法, 把提示性的消息的文字内容换了一种写法, ...). 我并不是全选-复制-粘贴, 而且走读代码, 再手工合并. 因为原程序的代码量就小, 涉及到的修改代码量也很小, 所以合并工作比较轻松.

调试过程中发现了GPT写代码的错误.
GPT生成的代码以为 get_chat_member 函数不仅可以传入userid, 还可以传入 username, 甚至还假模假样地写了相关代码. 
结果传入username时报错, 再查官方文档. 发现只支持传入 userid

我自己再做了一点小小的优化. 
机器人在群组中发出的提示消息都在一段时间后自动删除. 
在群组中, 忽略 /start 命令

提交 Github



========

后记

这样的 new_member_verify 命令除了解决一开始的原始问题, 还有一个好处就是
当你的机器人设置了某个成员禁言, 而机器人的后续处理出错卡死了, 你不得不中止程序. 或者你就是刚好在某个成员被禁言后还没来得及回答问题时, 中止了程序. 
你再启动机器人, 机器人是没有记录这个成员的验证问题与答案的. 也就是说, 这个成员在群组中被禁言了, 而向机器人发送 /start 是不会提问的.
此时, 你作为群管理员, 就可以使用 new_member_verify 命令, 重新启动对这个成员的验证流程.

评论

The Hot3 in Last 7 Days

极简一键脚本 搭NaiveProxy梯子 自定义端口 与Caddy V2前置的VLESS/Vmess V2Ray共存 可开CDN

搭 Docker版 Sub-Store 带 http-meta 实现 集合订阅 测延迟 排序 筛选 生成新订阅 定时任务上传Gist