博文

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

电报防广告机器人 新成员入群时ID小于2B免验证 在群内发言时ID小于8B免验证

图片
之前, 为了防广告机器人, 我面向GPT开发了两个电报telegram机器人. 一个是加群时的验证. https://github.com/crazypeace/tg-join-group-exam-bot 一个是发言时的验证. https://github.com/crazypeace/tg-send-msg-exam-bot 用了一段时间, 确实防广告的效果很好.  但是, 也有群友报怨说, 连着验证2次 机器人功能坏了. 没人想到这是两个不同的机器人. 我想了想 做了一点很小的优化. 一般来说自动发广告的机器人, 都是新注册的, ID数字大于8,000,000,000 所以, 发言验证机器人, 只针对这些大ID的用户, 要求验证1次. 而ID数字小于2,000,000,000 的用户呢, 都是比较早期注册电报 telegram 的, 相信不会乱发信息 所以, 加群验证机器人, 对于这些用户免予验证. 这两个修改很小, 也很特异化, 所以没有上传Github

电报防广告机器人 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://crazypeace.eu.org/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://crazypeace.eu.org/ 找到这个位置, 标题就是答案了. 那么, 计算机程序怎么获取这一条呢? 我们 按 F12 打开浏览器开发者工具. 使用选择工具, 选中我们需要的博文标题.  可以看到在html中, 博文标题对应元素是 class="post-title entry-title" 那么, 我们使用GPT编程. python实现如下功能, 访问 https://crazypeace.eu.org/ 在 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://crazypeace.eu.org/"   # 请求网页   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://crazypeace.eu.org/p/icdyct.html

The Hot3 in Last 7 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

Woiden IPv6 VPS 搭 V2ray 梯子 VLESS+Websocket+TLS 模式 免费 白嫖 全程手机操作 2022-4-19

极简一键脚本 搭Xray梯子 VLESS + Reality + xTLS 偷 x25519 证书