ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

社群自动化实战:用 Python + 微信 API 搞定关键词自动踢人与违规撤回

社群自动化实战:用 Python + 微信 API 搞定关键词自动踢人与违规撤回

群规的自动化执行比发欢迎语难——要先撤回再踢人、要分级警告、要留违规证据、要防止误踢。这篇按执行顺序走一遍,每个环节说清为什么要这么做。

一、执行顺序:先撤回再踢人

收到违规关键词,正确的动作顺序是:撤回消息 → 发警告 → 踢人。直接踢不撤回,违规内容还留在群里,其他人都能看到。撤回和踢人之间要有一个时间差,让撤回生效再踢。

不是所有违规都要踢人。建议分级:第一次违规只警告、连续两次再踢、严重违规(广告链接、辱骂)直接踢。分级规则做成配置,改规则不用改代码。

二、关键词匹配:别只做精确匹配

精确匹配关键词容易漏——用户打个错别字、换个写法就逃过去了。做法是精确匹配加模糊匹配加正则:精确匹配管最直接的违规词,模糊匹配管变体,正则管格式类违规(比如手机号、二维码、广告 URL)。

关键词库建议按类型分组:广告类、辱骂类、链接类、政治类,每组可以配不同的处理级别。

三、违规证据:留痕备查

每一次处罚都要留证据:违规者的 wxid、群 ID、消息内容、命中的关键词、触发的规则、执行的动作、执行时间。记录要持久化,别只放内存,防止进程重启后丢失。

证据的价值有两个:一是群管理员可能会问为什么踢,拿得出记录;二是误踢了可以反向定位是哪条规则触发的。

四、白名单和灰度:别误踢自己人

群主和管理员应该在白名单里,永远不会被自动处罚。还有一些正常业务场景可能会包含"违规关键词"的变体——比如活动群里允许发活动的邀请链接,那就把这个群加入灰度组,链接类规则在这个群里跳过。

群规执行对照

步骤

做什么

关键点

常见坑

匹配

精确+模糊+正则

关键词库分组

漏匹配变体

分级

警告/踢人/禁言

可配置

一刀切全踢

执行

先撤回再踢人

时间差让撤回生效

踢了没撤回

证据

全字段记录

持久化

误踢无据可查

白名单

群主/管理员免处理

按群配置

误踢自己人

群规执行实现

import time, json from collections import defaultdict class GroupEnforcer: def __init__(self, api, store, rules): self.api = api self.store = store self.rules = rules # 关键词组 -> 级别 self.warn_count = defaultdict(int) # (group_id, wxid) -> 警告次数 self.admin_set = set() # 白名单 def check(self, group_id, wxid, content, mid): # 白名单跳过 if wxid in self.admin_set: return # 关键词匹配 hit_level = None hit_kw = None for level, patterns in self.rules.items(): for kw in patterns: if self._match(content, kw): hit_level = level hit_kw = kw break if hit_level: break if not hit_level: return # 执行分级处罚 key = (group_id, wxid) count = self.warn_count[key] if hit_level == "severe": self._execute(group_id, wxid, content, mid, hit_kw, "direct_kick") elif count < 1: self.warn_count[key] += 1 self._execute(group_id, wxid, content, mid, hit_kw, "warn") else: self._execute(group_id, wxid, content, mid, hit_kw, "kick") self.warn_count[key] = 0 # 重置 def _match(self, content, kw): if kw.startswith("regex:"): import re return re.search(kw[6:], content) return kw in content def _execute(self, gid, wxid, content, mid, kw, action): # 先撤回再处罚 try: self.api.post("/group/recall", {"group_id": gid, "msg_id": mid}) except Exception: pass # 撤回失败不阻断后续 time.sleep(1) # 等撤回生效 record = { "group_id": gid, "wxid": wxid, "content": content, "keyword": kw, "action": action, "ts": time.time(), } self.store.save("violation", record) if action == "warn": self.api.post("/send", { "group_id": gid, "content": f"@{wxid} 违规:{kw},再犯将被踢出", }) elif action in ("kick", "direct_kick"): self.api.post("/group/remove", { "group_id": gid, "wxid": wxid, }) time.sleep(3) def on_group_message(self, event): self.check( event["group_id"], event["from"], event["content"], event["msg_id"])

落地建议

执行顺序必须先撤回再踢人,中间留 1 秒让撤回生效。分级处罚——第一次警告、连续两次踢人、严重违规直接踢,分级做成配置不改代码。关键词匹配别只做精确,加模糊和正则。所有处罚都留全字段证据并持久化,防止误踢无据可查。群主和管理员加白名单永远跳过。微信侧的群消息、撤回、踢人接口由Eyun这类个人微信API平台 提供,规则和执行在自建服务实现,具体字段以平台开发文档为准。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进