首页 / 博客 / 机器人·功能实战

微信群数据日报机器人(活跃新增统计)

分类:机器人·功能实战 · 标签:微信群数据统计、微信群管理机器人、个人微信API

前言

微信群是私域运营的核心阵地,但群内数据往往是一团黑箱:昨天新进了多少人、今天有多少人发言、哪些成员连续多日沉默——这些数据如果靠人工每天盯着截图、手动录表,既耗时又容易出错。有没有办法让机器人每天早上自动跑一遍、把关键指标整理成日报发到群里或推送给运营负责人?本文从原理到代码,完整拆解一套基于 WechatApi 的微信群数据日报机器人实现方案。


一、为什么群数据统计比想象中难

1.1 官方生态的限制

企业微信开放了客服消息、应用消息等接口,但普通个人微信没有官方开放平台。绝大多数私域运营场景用的是个人微信号建群,官方既不提供群成员变动回调,也不提供消息量统计 API,运营人员只能依赖"肉眼观察"。

1.2 传统方案的痛点

常见的替代方案有两类:

1.3 iPad 协议方案的优势

WechatApi 基于 微信 iPad 协议 实现,以独立设备协议与微信服务器通信,无须在 PC 上注入任何进程,稳定性与安全性均优于 Hook 方案。更重要的是,它以标准 HTTP API 形式暴露微信能力,任何后端语言都能直接调用,天然适合做自动化数据采集与统计。


二、日报机器人整体架构

在动手写代码之前,先把整个系统的数据流梳理清楚:

定时任务(每日 08:00)
    │
    ▼
① 拉取群成员列表(当前快照)
    │
    ▼
② 与昨日快照对比 → 计算新增/退出人数
    │
    ▼
③ 拉取昨日消息记录 → 统计发言人数/消息条数/发言TOP榜
    │
    ▼
④ 渲染日报文本
    │
    ▼
⑤ 调用发消息接口 → 推送到指定群 or 私聊管理员

每个环节都有对应的 WechatApi 接口支撑,下文逐一拆解。


三、核心接口与调用范式

3.1 鉴权方式

WechatApi 使用请求头 VideosApi-token 传递 API Token,所有接口统一走 HTTP POST + JSON Body,返回体格式固定:

json{
  "ret": 200,
  "msg": "操作成功",
  "data": { ... }
}

ret 为 200 表示成功,其他值表示异常,msg 字段说明具体原因,data 为业务数据对象。

业务参数中 appId 为设备 ID(即登录微信号对应的设备标识),每次请求必传。

3.2 关键接口速查表

功能接口路径(示意)主要参数说明
获取群成员列表/chatroom/memberListappId, chatroomId返回群内全部成员 wxid 及昵称
拉取历史消息/message/historyappId, chatroomId, startTime, endTime按时间段拉取消息列表
发送群文本消息/message/sendTextappId, toUserName, content向群或个人发送文本
获取群详情/chatroom/infoappId, chatroomId群名、群主、公告等元信息
获取联系人信息/contact/infoappId, wxid单个用户的昵称、头像等
完整接口文档与真实 endpoint 请以 开发文档 为准,以上路径仅作结构示意。

3.3 Python 调用示例

pythonimport requests
import json
from datetime import datetime, timedelta

API_BASE = "https://api.wechatapi.net"   # 示意域名,以文档为准
TOKEN = "YOUR_VIDEOS_API_TOKEN"
APP_ID = "YOUR_APP_ID"

HEADERS = {
    "VideosApi-token": TOKEN,
    "Content-Type": "application/json"
}

def get_chatroom_members(chatroom_id: str) -> list:
    """拉取群成员列表"""
    payload = {
        "appId": APP_ID,
        "chatroomId": chatroom_id
    }
    resp = requests.post(
        f"{API_BASE}/chatroom/memberList",
        headers=HEADERS,
        json=payload,
        timeout=15
    )
    result = resp.json()
    if result.get("ret") == 200:
        return result["data"].get("memberList", [])
    raise RuntimeError(f"获取群成员失败: {result.get('msg')}")


def get_message_history(chatroom_id: str, start_ts: int, end_ts: int) -> list:
    """拉取指定时间段内的群消息"""
    payload = {
        "appId": APP_ID,
        "chatroomId": chatroom_id,
        "startTime": start_ts,
        "endTime": end_ts
    }
    resp = requests.post(
        f"{API_BASE}/message/history",
        headers=HEADERS,
        json=payload,
        timeout=30
    )
    result = resp.json()
    if result.get("ret") == 200:
        return result["data"].get("messages", [])
    raise RuntimeError(f"拉取消息失败: {result.get('msg')}")


def send_text_to_group(chatroom_id: str, content: str) -> bool:
    """向群发送文本消息"""
    payload = {
        "appId": APP_ID,
        "toUserName": chatroom_id,
        "content": content
    }
    resp = requests.post(
        f"{API_BASE}/message/sendText",
        headers=HEADERS,
        json=payload,
        timeout=15
    )
    result = resp.json()
    return result.get("ret") == 200

四、数据统计逻辑实现

4.1 成员快照与新增/退出对比

每次运行日报任务时,先把当前群成员列表存为"今日快照",然后与"昨日快照"做集合运算:

pythonimport json
import os
from datetime import datetime, timedelta

SNAPSHOT_DIR = "/data/wechat_snapshots"

def load_yesterday_snapshot(chatroom_id: str) -> set:
    yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y%m%d")
    path = os.path.join(SNAPSHOT_DIR, f"{chatroom_id}_{yesterday}.json")
    if not os.path.exists(path):
        return set()
    with open(path) as f:
        data = json.load(f)
    return set(m["wxid"] for m in data)


def save_today_snapshot(chatroom_id: str, members: list):
    today = datetime.now().strftime("%Y%m%d")
    path = os.path.join(SNAPSHOT_DIR, f"{chatroom_id}_{today}.json")
    os.makedirs(SNAPSHOT_DIR, exist_ok=True)
    with open(path, "w") as f:
        json.dump(members, f, ensure_ascii=False)


def calc_member_diff(chatroom_id: str, current_members: list) -> dict:
    current_wxids = set(m["wxid"] for m in current_members)
    yesterday_wxids = load_yesterday_snapshot(chatroom_id)

    joined = current_wxids - yesterday_wxids    # 新增成员
    left   = yesterday_wxids - current_wxids    # 退出成员

    save_today_snapshot(chatroom_id, current_members)

    return {
        "total": len(current_wxids),
        "joined_count": len(joined),
        "left_count": len(left),
        "joined_wxids": list(joined),
        "left_wxids": list(left)
    }

4.2 消息活跃度统计

拉取昨日 00:00~23:59 的全部消息,按发送者 wxid 聚合,就能得到:

pythonfrom collections import Counter

def analyze_messages(messages: list) -> dict:
    sender_counter = Counter()
    for msg in messages:
        # 只统计文本、图片等有效消息,过滤系统通知
        if msg.get("msgType") in (1, 3, 34, 43, 49):
            sender_counter[msg["fromUserName"]] += 1

    total_msg = sum(sender_counter.values())
    active_members = len(sender_counter)
    top5 = sender_counter.most_common(5)

    return {
        "total_msg": total_msg,
        "active_members": active_members,
        "top5": top5   # [(wxid, count), ...]
    }

4.3 日报文本渲染

把统计结果拼成可读性强的文本:

pythondef render_daily_report(
    group_name: str,
    report_date: str,
    member_diff: dict,
    msg_stat: dict,
    wxid_to_nick: dict   # wxid -> 昵称映射
) -> str:
    lines = [
        f"📊 【{group_name}】数据日报",
        f"统计日期:{report_date}",
        "─" * 20,
        f"👥 群成员总数:{member_diff['total']} 人",
        f"  ↑ 昨日新增:{member_diff['joined_count']} 人",
        f"  ↓ 昨日退出:{member_diff['left_count']} 人",
        "─" * 20,
        f"💬 昨日消息总量:{msg_stat['total_msg']} 条",
        f"🙋 昨日发言人数:{msg_stat['active_members']} 人",
        "",
        "🏆 发言 TOP 5:",
    ]
    for rank, (wxid, count) in enumerate(msg_stat["top5"], 1):
        nick = wxid_to_nick.get(wxid, wxid)
        lines.append(f"  {rank}. {nick}  {count} 条")

    lines.append("─" * 20)
    lines.append("由 WechatApi 日报机器人自动生成")
    return "\n".join(lines)

五、定时任务部署

5.1 使用 cron 定时触发

把整个流程封装成一个入口脚本 daily_report.py,然后用系统 cron 定时执行:

bash# 每天早上 08:05 执行(给 08:00 整点群活动留 5 分钟缓冲)
crontab -e

# 添加以下行
5 8 * * * /usr/bin/python3 /opt/wechat_bot/daily_report.py >> /var/log/wechat_daily.log 2>&1

日志重定向便于排查异常。若需要多群并行统计,可在脚本内用线程池或直接循环遍历群 ID 列表。

5.2 多群配置管理

建议用一个 YAML 或 JSON 文件维护要监控的群列表,避免把群 ID 硬编码在脚本里:

json{
  "groups": [
    {
      "chatroomId": "xxxxxx@chatroom",
      "name": "私域运营交流群",
      "reportTo": "xxxxxx@chatroom",
      "enabled": true
    },
    {
      "chatroomId": "yyyyyy@chatroom",
      "name": "产品内测群",
      "reportTo": "admin_wxid",
      "enabled": true
    }
  ]
}

reportTo 可以是群 ID(发到群里)也可以是个人 wxid(私聊推送给运营负责人),灵活控制。

5.3 异常告警处理

日报机器人属于无人值守的定时任务,必须有完善的异常捕获:


六、进阶扩展:更丰富的统计维度

6.1 连续沉默成员识别

持续追踪每个成员的最近发言时间(存入 SQLite 或 Redis),即可计算"N 天未发言成员"列表,辅助运营做精准激活:

python# 伪代码示意
def find_silent_members(members: list, threshold_days: int = 7) -> list:
    silent = []
    for m in members:
        last_active = get_last_active_from_db(m["wxid"])
        if last_active is None or (datetime.now() - last_active).days >= threshold_days:
            silent.append(m)
    return silent

6.2 周报/月报聚合

把每日快照数据写入数据库后,周报和月报只需聚合查询即可,无需额外调用 API。这也是建议每日数据持久化而非仅在内存中处理的原因——历史数据是后续高阶分析的基础。

6.3 可视化图表推送

如果希望日报以图表形式呈现,可以用 matplotlib 或 pyecharts 生成折线图/柱状图,保存为图片后通过 WechatApi 的图片发送接口推送到群。折线图展示近 30 天群成员增长曲线,视觉冲击力远强于纯文本。

更多 微信二次开发 的能力(如定向@成员、撤回消息、自动踢人等)也可在此基础上逐步集成,打造一个完整的群智能管理系统。


七、注意事项与常见坑

7.1 消息拉取的时间窗口

微信的消息历史存储有时效限制,建议消息拉取任务在当天触发,不要跨越太长的历史区间,否则可能出现数据缺失。日报任务建议在每天 06:00~10:00 之间运行,拉取的是前一天 00:00~23:59 的数据,在时间窗口上是安全的。

7.2 群成员列表的最终一致性

大型群(成员数 > 500)的成员列表拉取可能需要分页,注意检查接口返回的分页参数,确保拉取到全量成员而非前 N 条。遗漏成员会导致"新增"统计偏高。

7.3 账号安全与频率控制

虽然 WechatApi 基于 iPad 协议尽量模拟正常设备行为,但主动调用频率过高仍有风险。日报场景下,建议:

7.4 隐私与合规

群成员数据属于个人信息范畴。在企业内部使用时,建议:


小结

本文从痛点出发,完整呈现了一套基于 WechatApi(微信群管理机器人方案) 的微信群数据日报机器人实现路径:利用 iPad 协议稳定拉取群成员快照与消息历史,通过集合运算计算新增/退出人数,通过消息聚合得出活跃度排行,最终自动渲染并推送日报文本。整套方案核心代码不超过 200 行,可在任意 Linux 服务器上用 cron 低成本运行,无须额外依赖。

对于有精细化运营需求的私域团队来说,数据日报只是起点——在此基础上叠加沉默用户识别、周期趋势分析、多维度漏斗统计,才能真正把群运营从"凭感觉"升级为"靠数据"。如需了解更多接口能力,欢迎查阅 WechatApi 开发文档 或前往 控制台 注册试用。

想动手试试?

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,注册后几分钟跑通。

立即免费注册查看开发文档

相关产品页

🔗 个人微信API(产品页)🔗 微信二次开发(产品页)🔗 微信机器人开发(产品页)

相关文章

30 分钟做一个微信自动回复机器人(完整实战)微信机器人接入 GPT,实现智能自动回复微信群管理机器人开发实战:自动迎新、答疑、踢人微信客服机器人怎么做?7×24自动应答+转人工方案
© 2025 WechatApi · 企业级微信智能机器人接入平台
官网价格帮助文档博客
苏ICP备2024128799号 · 苏ICP备2023038368号