电报防广告机器人 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 命令, 重新启动对这个成员的验证流程.
评论
发表评论