groupauto · 个人微信群消息自动跟回机器人

0 阅读8分钟
	一个面向「微信群问答 / 报名活动」场景的自动跟回机器人。当群内管理员发布报名任务(例如「参与请回复 1」「@所有人 综述任务,参与请回复 报名」等),机器人会自动识别并跟着回复,帮助你在群活动中快速完成报名。

⚠️ 使用须知:本项目依赖第三方微信 Hook 框架 WeChatBot 驱动微信收发消息。请确保你的使用方式符合微信用户协议与当地法律法规,仅在获得授权的群组与场景中使用,风险自负。


目录


功能特性

  • 群消息监听:通过 WeChatBot 回调,接收指定微信群的实时消息事件。
  • 按群过滤:只处理 GROUP_NICK_NAME 配置的目标群,忽略其它群。
  • 按人跟回:只在指定管理员(GROUP_ADMIN_NAME)发言后触发跟回。
  • 限量跟回:基于计数器,管理员发言后最多跟回 5 条消息,避免刷屏。
  • AI 答题能力(已内置,待接入):内置 OpenAI(GPT-4o) 与 Kimi(Moonshot) 接口及提示词,可从报名口令中识别应回复的内容(算术题、古诗填空、反义词、日期/星期等)。

整体架构

┌──────────────────────────┐
│   微信客户端 + WeChatBot   │   第三方 Hook 框架
│   WeChatBot.exe          │   本地 HTTP 接口 :10001 收发消息
└───────────┬──────────────┘
            │ 消息事件回调 (HTTP POST)
            ▼
┌──────────────────────────┐
│   Flask 服务 (main.py)     │   监听 :5000  /api/data
└───────────┬──────────────┘
            │ 转发原始消息
            ▼
┌──────────────────────────┐
│   schedule.py             │   事件过滤 + 业务调度(核心)
└───┬──────────┬───────┬───┘
    │          │       │
    ▼          ▼       ▼
event_maps  action/   api/
(事件字典) (收发消息)(AI 识别)
            └─ HTTP POST → WeChatBot :10001

运行流程

  1. WeChatBot.exe 驱动微信,监听到群消息后,向本机 Flask 服务推送 JSON 事件。
  2. main.pyPOST /api/data 接收事件,调用 schedule(message, 0)
  3. schedule.py 进行过滤与调度:
    • 过滤掉登录、群成员变动、转账、撤回、公众号等无关事件。
    • 仅保留群聊文本 / 图片消息事件。
    • 仅处理 GROUP_NICK_NAME 指定群内的消息。
    • 跳过机器人自己发送的消息。
    • 维护计数器 dt_count:当 GROUP_ADMIN_NAME 指定的管理员发言时 dt_count += 1;随后的第 1~5 条消息会被跟回;超过 5 条后计数器重置。
  4. 触发跟回时,调用 action/solo/sendmessage.py,通过 WeChatBot 的 :10001 接口把消息发出去。

目录结构

groupauto/
├── main.py                     # Flask 入口,接收 WeChatBot 推送事件
├── schedule.py                 # 核心调度:事件过滤 + 跟回逻辑
├── event_maps.py               # 事件码 → 事件名称 的映射字典
├── env_loader.py               # 读取 .env 环境变量
├── .env                        # 配置文件(密钥/群名/管理员名,需自行填写)
├── requirements.txt            # Python 依赖
├── test.py                     # 调试脚本(打印管理员名列表)
├── 一键运行.bat                 # Windows 一键启动脚本
│
├── action/                     # 动作层:调用 WeChatBot 接口收发/查询
│   ├── solo/
│   │   └── sendmessage.py      # 给指定 wxId 发送文本消息
│   └── group/
│       ├── query_all_group_info.py       # 查询机器人所有群信息
│       ├── query_target_group_info.py    # 查询指定群的成员详情
│       └── query_group_num(废弃).py       # 已废弃:查询群人数
│
├── api/                        # AI 接口层:识别报名口令应回复的内容
│   ├── openai.py               # 调用 GPT-4o(经代理)
│   └── kimiapi.py              # 调用 Kimi / Moonshot
│
└── prompt/                     # AI 提示词(few-shot 示例)
    ├── cvprompt.txt            # 答题规则提示词(12 条示例)
    └── dtprompt.txt            # 答题规则提示词(14 条示例,含日期/星期)

环境要求

  • 操作系统:Windows(WeChatBot 为 Windows 程序)
  • Python:3.8+(建议 3.10+)
  • WeChatBot:需自行获取并放置于 WeChatBot/WeChatBot.exe,其本地接口运行在 :10001
  • 依赖库:见 requirements.txt

安装

# 1. 克隆/下载项目后进入目录
cd groupauto

# 2. (可选)创建虚拟环境
python -m venv venv
venv\Scripts\activate

# 3. 安装依赖
pip install -r requirements.txt

requirements.txt 内容:

Flask==2.2.5
python-dotenv==1.1.0
Requests==2.32.3

注意:若要启用 api/kimiapi.py(使用 openai 官方 SDK),还需额外安装:

pip install openai

配置

在项目根目录创建 / 编辑 .env 文件:

# WeChatBot 接口鉴权 Token(必填)
AUTHORIZATION=你的_WeChatBot_授权token

# 要监听的群昵称,多个用英文逗号分隔(必填)
GROUP_NICK_NAME=群昵称A,群昵称B

# 要跟回的管理员微信昵称,多个用英文逗号分隔(必填)
GROUP_ADMIN_NAME=管理员昵称A,管理员昵称B

# ===== AI 接口相关(当前主流程未接入,按需填写)=====
KIMI_API_KEY=你的_Kimi_key
OPENAI_API_KEY=你的_OpenAI_key
OPENAI_BASE_URL=你的_OpenAI_代理地址
DEEPSEEK_API_KEY=你的_DeepSeek_key
变量说明是否必填
AUTHORIZATIONWeChatBot 接口鉴权,所有调用 :10001 的请求都要带它
GROUP_NICK_NAME监听的目标群昵称(逗号分隔)
GROUP_ADMIN_NAME触发跟回的管理员昵称(逗号分隔)
KIMI_API_KEYKimi/Moonshot 接口密钥⛔ 当前主流程未用到
OPENAI_API_KEY / OPENAI_BASE_URLOpenAI 接口密钥与地址⛔ 当前主流程未用到
DEEPSEEK_API_KEYDeepSeek 接口密钥⛔ 当前主流程未用到

🔐 安全提示.env 含密钥与隐私信息,切勿提交到公开仓库,建议加入 .gitignore


启动

方式一:一键启动(Windows)

双击运行 一键运行.bat。该脚本会:

  1. 设置控制台编码为 UTF-8。
  2. 启动 Flask 服务。
  3. 检测并启动 WeChatBot/WeChatBot.exe

⚠️ 已知不一致一键运行.bat 中写的是 python server.py,但项目实际入口为 main.py,仓库内并无 server.py。使用前请将脚本中的 server.py 改为 main.py,或手动以方式二启动 Flask。

方式二:手动启动

# 1. 启动 Flask 服务(监听 :5000)
python main.py

# 2. 另行启动 WeChatBot.exe,并在其中配置消息回调地址:
#    http://localhost:5000/api/data

启动后,Flask 默认以 debug=True 运行在 http://127.0.0.1:5000


核心模块说明

main.py — HTTP 入口

提供 POST /api/data 接口接收 WeChatBot 推送的 JSON 事件,解析后调用 schedule(message_data, 0),并返回标准 JSON 响应(明确使用 UTF-8 编码)。

schedule.py — 核心调度

def schedule(message, sing_nal):
    # 1. 过滤无关事件(登录、群变动、转账、撤回、公众号等直接 return)
    # 2. 仅处理群聊文本(10003/1) / 图片(10003/3) 消息
    # 3. 仅处理 GROUP_NICK_NAME 指定群
    # 4. 跳过机器人自己发的消息
    # 5. dt_count 计数器:管理员发言后跟回 1~5 条,超 5 重置

关键判断字段(来自 WeChatBot 回调):

  • message_data['description'] — 事件名称
  • message_data['data']['fromNickName'] — 群昵称
  • message_data['data']['finalFromNickName'] — 实际发言人昵称
  • message_data['data']['finalFromWxId'] / robotId — 用于判断是否机器人自己
  • message_data['data']['fromWxId'] — 回复目标(群)
  • message_data['data']['message'] — 消息内容

action/ — 动作层

文件函数作用
solo/sendmessage.pysend_who_message(who_wx_id, message_type, ROBOTID, message)向指定对象发送文本消息
group/query_all_group_info.pyget_group(ROBOTID)获取机器人所有群信息
group/query_target_group_info.pyquery_target_group_info(group_id, ROBOTID)获取指定群成员详情

所有动作均通过 http://localhost:10001/api/processor 调用 WeChatBot,并在请求头携带 AUTHORIZATION

api/prompt/ — AI 答题(已内置,待接入主流程)

  • openai.pyopenai_api(text, rule):调用 GPT-4o(经 proxy.hoidc.org 代理)。
  • kimiapi.pykimiapi(text, rule):调用 Kimi moonshot-v1-128k
  • prompt/cvprompt.txtprompt/dtprompt.txt:few-shot 提示词,教模型从报名口令中提取应回复的答案(如「1+()=3 → 2」「锄()日当午 → 禾」「今天是星期() → 五」等)。

这部分能力目前尚未接入 schedule.py 主流程——当前跟回逻辑只是把管理员原话原样转发。如需智能答题,需在 schedule.py 中把 mess_text 传给 openai_api / kimiapi 处理后再发送。


事件码对照表

来自 event_maps.py

分类事件码说明
机器人10000微信启动成功
登录10001 / 10016 / 10009登录成功 / 登录二维码 / 注销成功
群事件10012 / 10013 / 10014 / 10015成员新增 / 删除退出 / 创建成功 / 退群被踢
群消息10003 (1/3/34/43)文本 / 图片 / 语音 / 视频
私聊10002 (1/3/34/43)文本 / 图片 / 语音 / 视频
好友10010 / 10011 / 10007新增 / 删除 / 申请
支付10005 / 10008转账 / 二维码收款
其它10006 / 10004撤回消息 / 公众号消息

已知问题与改进建议

  1. 入口文件名不一致一键运行.bat 启动 server.py,实际应为 main.py。建议统一。
  2. AI 答题未接入api/prompt/ 已就绪,但 schedule.py 仅原样转发管理员消息,未调用 AI。需要时可补接。
  3. dt_count 为全局变量:在 Flask debug=True 多线程下存在并发问题,且所有群共用同一计数器。建议改为按群隔离、加锁或用更健壮的状态管理。
  4. .env 变量缺失env_loader.py 读取了 DEEPSEEK_API_KEY / OPENAI_BASE_URL / OPENAI_API_KEY,若 .env 未配置,相关 AI 路径不可用。
  5. 调试代码残留test.pyquery_group_num(废弃).py 含可直接执行、带真实群 ID 的调用代码,正式使用前应清理。
  6. 生产部署debug=True 不应用于生产环境,建议改用 gunicorn / waitress 等 WSGI 服务器。

常见问题 FAQ

Q:机器人不回复怎么办?

  • 确认 WeChatBot 已登录微信,且回调地址指向 http://localhost:5000/api/data
  • 确认 .envGROUP_NICK_NAMEGROUP_ADMIN_NAME 与实际群名/管理员昵称完全一致(注意空格、表情)。
  • 确认只有在管理员发言后,后续消息才会被跟回(受 dt_count 计数限制)。

Q:报错 'fromWxId' / KeyError

  • 通常是非群聊消息事件进入了处理逻辑。schedule.py 已对常见事件做过滤,若仍出现可补充对应事件码的过滤。

Q:如何启用 AI 智能答题?

  • .env 配好对应 API key,然后在 schedule.py 跟回前,读取 prompt/*.txt 作为 rule,把 mess_text 交给 openai_api / kimiapi 得到答案,再用 send_who_message 发送。

本 README 依据当前代码梳理而成,如代码有更新请同步维护本文档。