前言
微信群接龙是社群运营中极为常见的场景:家长群收餐费、拼团群汇总参与人数、打卡群统计签到、社区团购整理订单……每次接龙结束后,群主或管理员都得逐条翻聊天记录、手动复制粘贴、再整理进表格,耗时费力且容易遗漏。借助微信群管理机器人方案,可以让机器人自动监听接龙消息、实时解析回复内容、生成汇总报告,彻底解放双手。
接龙统计机器人的核心工作原理
微信群接龙本质上是一种固定格式的文本消息。发起人发出"1. 张三"之后,后续参与者依次回复"2. 李四""3. 王五",每条消息都遵循"序号 + 点号 + 内容"的结构。机器人要完成统计,需要做到以下几件事:
- 实时收取群消息:通过 API 监听指定群聊的消息推送,捕获所有文本消息。
- 识别接龙格式:正则匹配序号行,区分"发起消息"和"接龙回复"。
- 去重与排序:同一用户可能多次回复,需要按发送时间取最新一条;序号也可能不连续,需要按序整理。
- 生成汇总:将解析结果以结构化文本回复到群内,支持按需触发(关键词"查看接龙")或定时推送。
整个流程的基础是能够稳定接收个人微信消息推送。WechatApi 基于 iPad 协议实现,不依赖 PC 端 Hook 或安卓模拟器,登录稳定性高,消息实时性好,是搭建此类群机器人的可靠底层。
环境准备与接口接入
在动手写代码之前,需要完成以下准备工作:
| 准备项 | 说明 |
|---|---|
| WechatApi 账号 | 前往 控制台 注册,获取 VideosApi-token 鉴权凭证 |
| 设备绑定 | 用一台微信账号扫码登录,获取对应的 appId(设备 ID) |
| 服务器/本地环境 | Python 3.9+,能够接收 HTTP 回调或主动轮询消息 |
| 消息推送配置 | 在控制台配置 Webhook 地址,消息到达后平台主动 POST 到你的服务 |
完成上述配置后,所有微信消息都会实时推送到你指定的 Webhook 端点,格式统一为 JSON,字段包含发送者、群 ID、消息类型、消息内容等,处理起来非常方便。
消息监听与接龙识别
Webhook 接收消息
平台推送过来的消息体示例如下(示意结构,字段名以实际文档为准):
json{
"ret": 200,
"msg": "ok",
"data": {
"msgType": 1,
"fromUser": "wxid_abc123",
"fromNickname": "李四",
"roomId": "12345678@chatroom",
"content": "2. 李四 报名",
"createTime": 1718000000
}
}
接收到消息后,先判断 roomId 是否以 @chatroom 结尾(群消息),再对 content 做正则匹配。
接龙格式正则解析
pythonimport re
from collections import defaultdict
# 接龙行匹配:序号 + 点/顿号 + 内容
JIELONG_PATTERN = re.compile(r'^(\d+)[.。、]\s*(.+)$', re.MULTILINE)
def parse_jielong(content: str) -> list[dict]:
"""
解析接龙文本,返回 [{"index": 1, "text": "张三 已付款"}, ...]
"""
results = []
for match in JIELONG_PATTERN.finditer(content):
idx = int(match.group(1))
text = match.group(2).strip()
results.append({"index": idx, "text": text})
return results
# 示例
sample = """
1. 张三 已付款
2. 李四 报名
3. 王五
"""
print(parse_jielong(sample))
# [{'index': 1, 'text': '张三 已付款'}, {'index': 2, 'text': '李四 报名'}, {'index': 3, 'text': '王五'}]
正则中 [.。、] 兼容中英文标点,\s* 容忍序号后有空格,re.MULTILINE 支持整段接龙(发起人一次发多行的场景)。
对于逐条回复的接龙,每条消息通常只有一行,解析后把结果存入以 roomId 为键的内存字典(或 Redis、SQLite),在收到"查看接龙"关键词时统一输出。
数据聚合与去重逻辑
实际使用中存在几个常见问题,需要在聚合层处理:
问题一:同一序号被多人抢占 部分群友习惯不看当前进度,直接发"1. 自己名字"。需要按序号分组,保留 createTime 最早的一条,或者直接提醒重复。
问题二:同一人多次修改 群友发现写错了会重新发一条,需要按发送者 fromUser 去重,保留最新一条。
问题三:接龙发起消息本身 发起人的第一条消息往往包含说明文字加"1. 发起人",需要识别为"发起"而非普通接龙回复,可通过检测消息是否包含多行来判断。
python# 聚合示例:按序号保留最早一条,同一人按 wxid 保留最新一条
from typing import Optional
class JielongCollector:
def __init__(self, room_id: str):
self.room_id = room_id
# key: wxid, value: {"index": int, "text": str, "ts": int}
self.by_user: dict[str, dict] = {}
self.started = False
self.start_ts: Optional[int] = None
def feed(self, wxid: str, content: str, ts: int):
rows = parse_jielong(content)
if not rows:
return
if not self.started:
self.started = True
self.start_ts = ts
for row in rows:
existing = self.by_user.get(wxid)
if existing is None or ts > existing["ts"]:
self.by_user[wxid] = {**row, "ts": ts, "wxid": wxid}
def summary(self) -> str:
items = sorted(self.by_user.values(), key=lambda x: x["index"])
lines = [f"{i['index']}. {i['text']}" for i in items]
total = len(lines)
return f"📋 接龙汇总(共 {total} 人):\n" + "\n".join(lines)
主动发送汇总消息
统计完成后,需要将结果发回群内。调用 WechatApi 的发送消息接口(HTTP POST + JSON),鉴权通过请求头 VideosApi-token 传递:
pythonimport requests
API_BASE = "https://api.wechatapi.net" # 示意域名,以实际文档为准
TOKEN = "your_videos_api_token_here"
APP_ID = "your_app_id_here" # 控制台获取的设备 ID
def send_group_text(room_id: str, text: str) -> dict:
url = f"{API_BASE}/message/sendText"
headers = {
"VideosApi-token": TOKEN,
"Content-Type": "application/json"
}
payload = {
"appId": APP_ID,
"toUser": room_id,
"content": text
}
resp = requests.post(url, json=payload, headers=headers, timeout=10)
result = resp.json()
# 正常返回:{"ret": 200, "msg": "ok", "data": {"msgId": "xxx"}}
if result.get("ret") != 200:
raise RuntimeError(f"发送失败:{result.get('msg')}")
return result
在 Webhook 处理函数中,检测到消息内容为"查看接龙"或"@机器人 统计"时,调用 send_group_text 将 collector.summary() 的结果发回群内即可。
进阶功能:定时推送与多群管理
基础版机器人仅响应关键词触发,进阶需求通常包括:
定时汇总:在接龙截止时间(如每天 18:00)自动推送统计结果。可用 APScheduler 实现:
bashpip install apscheduler requests flask
pythonfrom apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
def daily_summary_job(room_id: str, collector: JielongCollector):
text = collector.summary()
send_group_text(room_id, text)
collector.by_user.clear() # 清空,准备下一轮接龙
# 每天 18:00 触发
scheduler.add_job(
daily_summary_job,
"cron", hour=18, minute=0,
args=["12345678@chatroom", collectors["12345678@chatroom"]]
)
scheduler.start()
多群隔离:用字典 collectors: dict[str, JielongCollector] 以 roomId 为键,各群独立维护接龙状态,互不干扰。
导出 Excel:汇总后可用 openpyxl 将接龙数据写入 .xlsx 文件,通过 WechatApi 的文件发送接口推送到群内,方便群主留存记录。
防刷屏限制:同一用户 60 秒内重复发接龙格式消息只取最后一条,避免有人恶意刷接龙。
这些进阶场景在微信二次开发中属于常规需求,WechatApi 提供的消息收发、文件发送、群成员查询等接口能够满足全流程所需。
部署注意事项
稳定性要点
- 心跳保活:iPad 协议登录后需要定期保持会话活跃,WechatApi 平台侧已内置保活机制,无需自行实现。
- 断线重连:Webhook 推送异常时会有重试机制,业务层需要做好幂等处理,避免同一条接龙消息被重复计入。
- 消息顺序:网络抖动可能导致消息乱序到达,建议以消息体内的
createTime字段作为排序依据,而非到达顺序。
安全要点
VideosApi-token是高权限凭证,不要硬编码在代码中,应通过环境变量或配置文件注入。- Webhook 端点建议加签名验证,防止第三方伪造推送请求。
- 接龙内容中可能含有手机号、地址等敏感信息,落库时注意脱敏或加密存储。
合规要点
个人微信机器人用于内部社群运营、自用工具是常见做法,但需注意:不得用于批量骚扰、营销垃圾消息或违规导流。WechatApi 在官网的使用条款中对合规用途有明确说明,接入前请仔细阅读。
小结
微信群接龙统计机器人的核心链路清晰:Webhook 接收消息 → 正则解析接龙格式 → 按用户去重聚合 → 关键词或定时触发汇总 → 调用 API 回复群内。整套方案 Python 百来行即可跑通,维护成本低,扩展性强。
底层能力上,WechatApi 的 iPad 协议登录方式相比 PC Hook 更稳定、比安卓模拟器更轻量,特别适合需要长期在线的群机器人场景。如果你正在为社群管理的重复性工作头疼——接龙统计只是起点,签到打卡、关键词自动回复、成员画像分析都可以在同一套架构上叠加,一步步把群主从繁琐事务中解放出来。
