send-wechat-group-message
发送消息到微信群(非公众号)。适用场景:(1) 推送早报到微信群,(2) 发送热点内容到群聊,(3) 群发消息到多个微信群,(4) 发送图片到微信群,(5) 推送文章摘要到群,(6) 群聊通知,(7) 发送群聊总结,(8) 转发内容到微信群。触发短语:'发到微信群', '推送到群', 'send to wechat group', '微信群消息', '群发消息', 'post to group', '推送群聊', '发群消息', '通知微信群', '转发到群', '推到群里', '发到群里', '群里发一下', 'send group message', '微信群通知'
Author
Category
Team CollaborationInstall
Download and extract to your skills directory
Copy command and send to OpenClaw for auto-install:
微信群消息推送 (WeChat Group Messenger)
通过代理接口向微信群发送文本和图片消息。支持一份消息发送到多个群。
> 注意: 本 skill 用于发送消息到微信群聊,不是微信公众号。公众号发布请使用 post-to-wechat skill。
认证
所有请求需要 X-API-Key 请求头。从环境变量读取配置:
WECHAT_BOT_HOST(必须包含 http:// 协议前缀,如 http://x.x.x.x)WECHAT_BOT_API_KEY-H "X-API-Key: $WECHAT_BOT_API_KEY"启动检查:
WECHAT_BOT_HOST 不以 http:// 或 https:// 开头,自动补全 http:// 前缀再使用禁止在任何输出中暴露接口地址或 API 密钥的实际值。
接口
| 方法 | 路径 | 类型 | 用途 |
|---|---|---|---|
| POST | /noc/message/info | 写入 | 发送群消息(文本/图片) |
请求格式
curl -s -X POST "$WECHAT_BOT_HOST/noc/message/info" \
-H "Content-Type: application/json" \
-H "X-API-Key: $WECHAT_BOT_API_KEY" \
-d '{
"content": "消息文本内容",
"groupName": "群名称",
"picBase64": ""
}'字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
content | string | 否 | 消息文本,换行使用 \n(JSON 转义换行符);不发文本时传空字符串 "" |
groupName | string | 是 | 目标微信群名称(精确匹配) |
picBase64 | string | 否 | 图片的 base64 编码字符串,必须包含 data:image/<type>;base64, 前缀(如 data:image/jpeg;base64,/9j/...);不发图片时传空字符串 "" |
content 和 picBase64 至少填一个。
> 文本 vs 图片编码规则
> - 文本 (content): 保留换行符 \n,json.dump 会自动将其序列化为 JSON 的 \n 转义,服务端正确还原为换行
> - 图片 (picBase64): 直接使用 base64.b64encode(data).decode(),不做任何额外处理(不去换行、不替换字符);必须加 data:image/<type>;base64, 前缀
构造 JSON 请求体(重要 — 中文编码)
必须使用 Python 构造包含中文的 JSON 请求体。 禁止使用 jq --arg + shell 变量拼接中文内容,否则中文会被 Unicode 双重转义变成乱码(\\uXXXX)。
发送文本消息:
# 从文件读取内容
python3 -c "
import json
with open('/path/to/content.txt', 'r') as f:
content = f.read()
payload = {'content': content, 'groupName': '群名称', 'picBase64': ''}
with open('/tmp/wechat_msg.json', 'w', encoding='utf-8') as f:
json.dump(payload, f, ensure_ascii=False)
"
curl -s -X POST "$WECHAT_BOT_HOST/noc/message/info" \
-H "Content-Type: application/json" \
-H "X-API-Key: $WECHAT_BOT_API_KEY" \
-d @/tmp/wechat_msg.json
rm -f /tmp/wechat_msg.json关键: json.dump 必须指定 ensure_ascii=False,否则中文会被转为 \uXXXX 转义序列,经 curl 发送后显示为乱码。
发送图片
接口支持最大约 10MB 的原始图片,无需压缩。直接读取图片文件,加上 MIME 前缀后编码:
# 用 Python 构造含 base64 图片的 JSON
python3 -c "
import base64, json
with open('/path/to/image.png', 'rb') as f:
raw = f.read()
# 直接编码,不做任何额外处理;加 data URI 前缀
# JPEG 文件用 data:image/jpeg;base64,,PNG 文件用 data:image/png;base64,
pic_b64 = 'data:image/jpeg;base64,' + base64.b64encode(raw).decode()
payload = {'content': '配图说明(可为空字符串)', 'groupName': '群名称', 'picBase64': pic_b64}
with open('/tmp/wechat_msg.json', 'w', encoding='utf-8') as f:
json.dump(payload, f, ensure_ascii=False)
"
curl -s -X POST "$WECHAT_BOT_HOST/noc/message/info" \
-H "Content-Type: application/json" \
-H "X-API-Key: $WECHAT_BOT_API_KEY" \
-d @/tmp/wechat_msg.json
rm -f /tmp/wechat_msg.json图片编码规则(重要):
base64.b64encode(raw).decode(),不做任何额外处理(不去换行、不替换任何字符)data:image/<type>;base64, 前缀,根据实际文件格式选择 MIME 类型:- JPEG 文件(含
.jpg、.jpeg,以及扩展名为 .png 但实际为 JPEG 的文件)→ data:image/jpeg;base64,- 真正的 PNG 文件 →
data:image/png;base64,- 用
file /path/to/image 命令确认实际格式sips -Z 1200 -s format jpeg -s formatOptions 60 input --out output.jpgdata:image/ 前缀,直接使用,不重复添加可以同时发送文本 + 图片,也可以只发图片(content 传空字符串)。
核心工作流
写操作安全规则
发送消息是写操作 — 必须在用户明确确认后才能调用。
执行前先向用户展示:
场景一:发送文本消息到单个群
WECHAT_BOT_HOST 和 WECHAT_BOT_API_KEY 是否已设置(HOST 需含 http:// 前缀)ensure_ascii=False)curl -d @/tmp/wechat_msg.json 发送场景二:发送消息到多个群
对每个群逐个调用 Bash 工具发送(不要用 shell for 循环,避免 JSON 转义问题)。每次调用间隔 1 秒,避免触发频率限制。
发送流程:
场景三:发送图片消息
file 命令确认图片实际格式(扩展名可能与格式不符)base64.b64encode(raw).decode() 编码,加 data:image/<type>;base64, 前缀,不做任何额外处理curl -d @/tmp/wechat_msg.json 发送详见上方「发送图片」的完整代码示例。
场景四:向多个群依次发送图片 + 文字
适用于早报/周报推送等需要对每个群先发图后发文的场景。
发送流程:
sleep 1,换群时 sleep 1# 预生成所有 JSON(Python,只编码一次图片)
python3 -c "
import base64, json
with open('/path/to/poster.png', 'rb') as f:
raw = f.read()
# 用 file 命令确认格式;JPEG 文件即使扩展名是 .png 也用 jpeg MIME
pic_b64 = 'data:image/jpeg;base64,' + base64.b64encode(raw).decode()
with open('/path/to/digest.txt', 'r') as f:
text = f.read()
groups = ['群名1', '群名2', '群名3']
for i, g in enumerate(groups):
with open(f'/tmp/wechat_poster_{i}.json', 'w', encoding='utf-8') as f:
json.dump({'content': '', 'groupName': g, 'picBase64': pic_b64}, f, ensure_ascii=False)
with open(f'/tmp/wechat_text_{i}.json', 'w', encoding='utf-8') as f:
json.dump({'content': text, 'groupName': g, 'picBase64': ''}, f, ensure_ascii=False)
"
# 对每个群逐个调用(不用 shell for 循环)
# 群名1
curl -s -X POST "$WECHAT_BOT_HOST/noc/message/info" \
-H "Content-Type: application/json" -H "X-API-Key: $WECHAT_BOT_API_KEY" \
-d @/tmp/wechat_poster_0.json
sleep 1
curl -s -X POST "$WECHAT_BOT_HOST/noc/message/info" \
-H "Content-Type: application/json" -H "X-API-Key: $WECHAT_BOT_API_KEY" \
-d @/tmp/wechat_text_0.json
# ... 以此类推(每群之间 sleep 1)
# 全部完成后清理
rm -f /tmp/wechat_poster_*.json /tmp/wechat_text_*.json输出格式
发送完成后,向用户报告结果:
单群:
✅ 消息已发送到「群名」多群:
✅ 消息已发送到 3 个群:
✅ 群名1
✅ 群名2
❌ 群名3 — 发送失败(HTTP 状态码: 500)错误处理
WECHAT_BOT_HOST 和 WECHAT_BOT_API_KEY安全规则
WECHAT_BOT_HOST 或 WECHAT_BOT_API_KEY 的实际值/tmp/wechat_msg.json)使用后立即删除