博文

目前显示的是标签为“antispam”的博文

电报防广告机器人 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 https://github.com/crazypeace/tg-join-group-exam-bot ======== 后记 这样的 new_member_verify 命令除了解决一开始的原始问题, 还有一个好处就是 当...

电报防广告机器人 telegram antispam bot 相关功能 清除群组Removed Users列表

图片
有很多广告账号在防广告机器人处理下, 被踢出了群组. 也就是在群组的 Permissions - Removed Users 列表中. 而广告账号因为被举报得很多, 所以实际上比较快就会被telegram封禁, 成为 Deleted Account 本项目的目的就是清理这个列表, 把已经被封禁的账号移除. 再一次地, 用GPT开发. 基于我们的前一个项目, 全代码复制粘贴到chatgpt中, 再附上以下要求 基于上面的代码, 实现以下功能: 在群组的 permissions - removed users 里面, 找出被封禁的账户 Deleted Account, 清除掉. Github https://github.com/crazypeace/tg-clear-removed-users 使用效果 📢 群组: FuckGFW-Newbie 翻墙新手村 ✅ 保留: 7887288719 (Trinity Griselda) - 被踢出状态 ⏭️ 跳过: 8125834274 🗑️ 检测到 Deleted Account: 7623369260,正在清理... ✅ 保留: 6331849477 (bk ) - 被踢出状态 ✅ 保留: 6709325050 (易捷支付 机场特惠 ) - 被踢出状态 🗑️ 检测到 Deleted Account: 8173951376,正在清理... 🗑️ 检测到 Deleted Account: 7499278394,正在清理... 🗑️ 检测到 Deleted Account: 7548224690,正在清理... ...略 ✅ 完成检查,共检查 55 人,清理掉 19 个 Deleted Account。 其中 8125834274 是我设置在脚本中测试保留列表用的. 总结 不管是 Exceptions 还是 Removed users, 都是用 iter_participants 函数查询出来的群成员, 只是用的 filter 不同. 不管是清除 Exceptions 还是 Removed users, 都是设置一个空的 ChatBannedRights await client(EditBannedRequest(entity, p.id, ChatBannedRights(until_d...

电报防广告机器人 telegram antispam bot 相关功能 踢除群组Exceptions列表中没有发言权限的用户

图片
有一些 防广告机器人为了防止误踢用户, 只对未通过验证的用户设置了禁言, 并没有将用户踢出群组. 那么, 这些用户会在 群组Exceptions列表中留下一条没有发言权限的记录. 当这样的记录非常多时, 逐条手工操作太费时. 那么, 我们让程序来帮忙吧. 再一次地, 用GPT开发. 基于我们的上个项目  https://github.com/crazypeace/tg-clean-exceptions 参考上面的代码, 实现以下功能 在群组 的 permissions 的 exceptions 里检查所有的设置, 如果某个用户没有发言权限, 则将这个用户踢出群组. 可以看到, 这样简单的项目, 完全不需要IDE开发工具, 也不需要氛围编程助手, 也不需要最新的模型. 随便找个GPT就行, 哪怕GPT-5的限额到了, 用GPT-4也足够了. 不过呢, 和前面博文中所述情况一样, 程序的大框架逻辑是正确的, 但是具体到 怎样将用户踢出群组, 调用的函数和参数会搞迷糊. 还是自己查一下 官方文档 . 最终效果 群组: test ✅ 保留: 6611601789 (蛙 女) - 可发言 🚫 踢出: 6701294471 (新 希望) - 无发言权限 完成检查,共检查 2 人,踢出 1 人 上传 Github  https://github.com/crazypeace/tg-kick-no-permission-user ======== 后记 我后面发布的这4个电报防广告机器人相关功能小工具都是基于telethon的. 相应的, 需要登录某个Telegram账户, 也就是说要输入一个手机号, 并完成验证过程. 对于这种偶尔使用的工具, 可以共用同一个Telegram账号. 我在代码中使用了同样的指定 session 的方法. client = TelegramClient('session_' + phone_number, api_id, api_hash) 所以指定的session文件名是一样的. 也就是说这些工具可以共用一个session. 只要把这些工具放在同一个目录下. root@rn-TEST:~/tg-antispam-bot-tool# tree . . |-- session_+8613812345678.session |-- tg...

电报防广告机器人 telegram antispam bot 在群内发言时需要人机验证 效率优化 验证用户列表缓存在内存

图片
我们前面实现的 首次发言 验证机器人. https://github.com/crazypeace/tg-send-msg-exam-bot 在阅读代码时发现, 机器人经常需要读取 yaml 文件. 这会显著增加I/O开销, 降低处理速度. 每次发现群内的新消息, 都要调用 is_valid_user()函数 -> load_valid_users()函数 -> 打开yaml文件 一个常见的优化策略是,  在内存里保留一份缓存.  当程序启动时, 从文件中加载到内存缓存. 当查询时, 在内存缓存中查询. 当修改时, 修改内存缓存 并且 修改文件. 这种缓存方案很常见, 所以再一次的, 我们使用GPT开发. 把原代码全量复制 粘贴, 再加上一句话. 上面的程序中, 每次验证都要读取VALID_USERS_FILE 会不会有效率问题 得益于原始代码的良好结构, 添加这个缓存的改动并不大. 提交到 Github https://github.com/crazypeace/tg-send-msg-exam-bot

电报防广告机器人 telegram antispam bot 相关功能 查询群组内的全部成员 对比ChannelParticipantsBanned与ChannelParticipantBanned

图片
上一篇 中, 我们通过查询群组中最近的1000条发言, 得到活跃群成员的id列表. 如果我想对这个群里的成员特别厚道, 只要是目前在群里的, 我都不希望有可能被机器人打扰. 那么我需要得到群组内的全部成员. 用GPT开发. 不要忘了, 我们刚刚做过的 查询群最近消息的项目 . 为了方便自己阅读和学习, 把上个项目的全部代码复制粘贴, 再加上下面的要求. 发给GPT. 查询一个telegram群组中的全部成员 输出格式为 yaml telegram账号的userid:  uesrname: telegram账号的username  full_name: telegram账号的full name 如 6611601789:   username: skypatch   full_name: 蛙 女 这个群组可能是公开群组, 也可能是不公开群组 经过一些简单的调试. 代码正常运行了. 但是获得的用户包括了 exceptions 里的用户. 这不是我们想要的, 我们想要的用户列表应该还把这部分用户排除. 这一步折腾了比较久, GPT返回的结果有问题.  我同时使用 claude, gemini, chatgpt. 再结合 Telethon 的官方文档 . 终于搞定了. 上传到 Github https://github.com/crazypeace/tg-get-group-member 运行效果 正在获取群组成员列表: FuckGFW-Newbie 翻墙新手村 跳过Exceptions列表中的用户 ID: 816194782 跳过Exceptions列表中的用户 ID: 6521155977 ...略 --- 群组成员列表 --- 6617181826:   username: atefatman   full_name: 子 肥 7919966027:   username: crazypeace_anti_bot_bot   full_name: CZ_antibot_bot ...略 ✅ 共获取 1216 名成员 📄 已保存到文件: members_1517821953.yaml ======== 后记 在 Telethon 中, ChannelParticipantBanne...

电报防广告机器人 telegram antispam bot 相关功能 查询群组最近的消息 统计发言账号的ID

图片
上一期我们实现了 第一次发言 人机验证 的机器人 . 那么就带来了这样一个需求: 我这个群已经有了很多群友. 天天发言, 也能看出来都不是机器人. 但是我把这个第一次发言人机验证的机器人一拉进群里. 那每个人在这个时间点之后的第一次发言之前都要验证一遍了. 这样会给这些群友带来不必要的麻烦. 当然, 这个项目本身也提供了一个验证列表文件 valid.yaml 你是可以手动添加群友的 userid 的. 其中, 只有userid是有效的, 其它信息是辅助人类管理这个文件用的, 不参与程序的逻辑判断. 所以, 你可以手动添加群友的userid进去. 就像这样: 所以, 本文要解决的需求就变成: 查询群组最近的消息 统计发言账号的ID

电报防广告机器人 telegram antispam bot 相关功能 清除群组Exceptions列表中实际上权限与群组默认权限一致的记录

图片
前面我们实现了两个防广告机器人 https://github.com/crazypeace/tg-join-group-exam-bot https://github.com/crazypeace/tg-send-msg-exam-bot 这两个机器人在设置群成员禁言和解除禁言时, 都是在 Exceptions 列表中添加了记录.  我们发现, 通过了验证的用户, 也在 Exceptions 中留有记录, 哪怕是与群组默认权限一致. 为了方便群组管理, 希望将这类记录清除掉. 这样, 剩下的记录肯定是屏蔽发言权限的, 也就是没有通过验证的. 我们可以直接踢出群组. 经过前面那么多天的使用, 我们已经是个GPT开发的"老手"了. 使用 Telethon 库, 可以做到下面的要求吗? 在群组 的 permissions 的 exceptions 里检查所有的设置, 如果某个群成员的权限 是与群组的默认权限相同的, 那么就从 exceptions 删除这一条设置. 不幸的, GPT给的代码 框架逻辑看起来没问题, 但是运行起来老报错. 看来又要读文档了. T_T 不断地在 官方文档 里学习哪个函数有什么参数, 参数有什么取值, 函数的返回值是个什么结构, 这个结构有哪些属性, ... 期间, 还遇到了一个关于用户权限的坑 https://zelikk.blogspot.com/2025/10/telethon-python-telegram-bot-music-voice-messages-audio-voice-notes-bug.html 最后总算是完成了. Github https://github.com/crazypeace/tg-clean-exceptions

电报防广告机器人 telegram antispam bot 在群内发言时需要人机验证

图片
现在有很多广告机器人, 在第一次加群时通过了验证, 然后一直不发言. 直到某天晚上开始发广告信息. 所以我想, 如果在群成员第一次发言时加上一个人机验证, 是不是可以大幅改善这个问题?

电报防广告机器人 telegram antispam bot 我的博客最新一期博文的标题是什么 html解析 rss xml解析

图片
上一期中, 我们实现了自定义 问题-答案 . 但是过于死板. 那么, 除了算术题, 还有什么可以生成灵活 问题-答案 的方式呢? 比如, 我的博客最新一期博文的标题是什么? html解析 如果是人, 怎么找到我的博客的最新一期博文呢?  打开  https://zelikk.blogspot.com/ 找到这个位置, 标题就是答案了. 那么, 计算机程序怎么获取这一条呢? 我们 按 F12 打开浏览器开发者工具. 使用选择工具, 选中我们需要的博文标题.  可以看到在html中, 博文标题对应元素是 class="post-title entry-title" 那么, 我们使用GPT编程. python实现如下功能, 访问 https://zelikk.blogspot.com/ 在 html 中找到 第1个 class="post-title entry-title" 元素,  输出该元素的文本内容 把GPT编程的结果和原来的 youtube.py 里面的4行代码融合一下, 就得到这样的 blog.py  放到 pset 目录下就生效了.  import requests from bs4 import BeautifulSoup def buildQA():   question = '我的博客的最新一期博文标题是什么?'   correct_answer = ''   url = "https://zelikk.blogspot.com/"   # 请求网页   response = requests.get(url)   # 解析 HTML   soup = BeautifulSoup(response.text, "html.parser")   # 找到第一个 class="post-title entry-title" 的元素   element = soup.find(class_="post-title entry-title")   if element:     correct_answer = element.get_text(strip=True)   e...

电报防广告机器人 telegram antispam bot 重构产生问题和回答的方式

图片
上一期我们实现了防广告机器人的基本框架 如果我们想实现丰富的 问题-答案 生成方式, 怎么做呢? 看一下目前的代码. 是生成了 问题-答案 后, 保存起来, 然后新成员再回答问题, 并检查答案. 那么, 我们来做这样一件事. 在一个python文件 main.py 的目录下, 有一个 pset 目录.  pset 目录下有多份 .py 文件.  这些 .py 文件中, 都至少包含1个函数. buildQA buildQA 返回2个字符串, 一个是 question, 一个是 correct_answer 我要在 main.py 中随机调用 pset 目录下的一个 .py 文件中的 buildQA 函数 把这段文字丢给 M$ copilot (或者你手边的任意一个GPT), 很容易就得到答案. 把修改方案应用到项目中. 主 py 文件中. 增加这样一个函数 def get_random_module():     # 找出 pset 目录下的所有 .py 文件(排除 __init__.py)     files = [         f[:-3] for f in os.listdir("pset")         if f.endswith(".py") and f != "__init__.py"     ]     # 随机选择一个     chosen = random.choice(files)     # 动态导入     module = importlib.import_module(f"pset.{chosen}")     return module 再把原来生成 问题-答案的地方改成这样 # 生成验证问题和答案 mod = get_random_module() question, correct_answer = mod.buildQA() 然后在 pset 目录下, 新建一个 add.py 文件. 内容如下: import random def buildQA():...

电报防广告机器人 telegram antispam bot 新成员入群时需要人机验证 用回复文本的方式增加发广告的成本

图片
用了这么久的telegram, 看到的防广告机器人, 都是用选按钮的方式回答问题, 理论上有被穷举题库的可能性. 如果你的群足够有吸引力, 想加群的广告机器人足够多, 总是可以找到入群问题的答案的. 而入群问题如果太变态 ( https://github.com/XTLS/Xray-core/discussions/3487 ) 反而拒绝了一些能力不强的正常人类 (TA们本身并不是想发广告, 只是想入群提问或交流) 所以我有了一个思路, 如果这个人机检查的问题需要回答文本呢? 用干就干, 利用claude进行初步构建. 我要开发这样的一个telegram机器人 机器人在群组中工作 当机器人检测到有新成员加入时, 机器人将新成员设置禁言. 机器人要求新成员在与机器人的私聊过程中完成人机检测. 如果通过人机检测, 那么机器人解除新成员的禁言状态. 人机检测的具体过程是这样的 当新成员向机器人发送/start时, 机器人提问, 新成员输入文本回答. 得到的结果放到 VS Code, 和 M$ Copilot 合作, 进行调试. 效果 Github https://github.com/crazypeace/tg-join-group-exam-bot/ 总代表量(算上空行和注释)不到300行, 是不是很轻量! * 考虑到后续还会有几期更新. 所以本期的代码也复制了一份  tg-join-group-exam-bot1.py 在项目里. 部署方法见项目 readme 目前这只是一个最基础的架子, 后续我们再慢慢优化. 欢迎关注我的博客 https://zelikk.blogspot.com/p/icdyct.html

The Hot3 in Last 7 Days

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

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