微信本地通知助手 下载客户端
LOCAL CLI DEVELOPER INTERFACE

让已有系统,
直接调用个人微信。

不依赖 WorkBuddy、Codex 或其他桌面 Agent。ERP、CRM、监控告警、报表程序和内部工具,只需生成 UTF-8 Payload JSON,再调用用户电脑上已安装的微信本地通知助手。

01 / CONNECTION MODEL

把微信发送接到业务流程最后一步。

第三方系统负责产生消息和附件,微信本地通知助手只负责在用户当前 Windows 桌面会话中执行预览或发送。

01 / SOURCE

已有业务系统

ERP、CRM、订单系统、监控告警、日报程序或内部审批工具。

02 / PAYLOAD

生成 UTF-8 JSON

写入联系人、正文、附件路径、send 和 operation_id。

03 / LOCAL CLI

启动本地 EXE

使用子进程校验或执行 Payload,并读取退出码和 Result JSON。

04 / WECHAT

个人微信客户端

用户确认后,由当前已登录的 Windows 微信完成触达。

02 / MINIMUM CALL

四步完成校验与预览。

先生成 Payload,再校验、预览并读取 Result V1。以下命令全部保持 send=false,不会操作微信。

标准安装路径:
%LOCALAPPDATA%\WechatSender\wechat-sender.exe
# 1. 业务系统生成 request-001.json
{
  "schema_version": "1.0",
  "contacts": ["文件传输"],
  "message": "订单系统:订单 A1024 已完成。",
  "files_dir": null,
  "recursive": false,
  "max_files": 10,
  "send": false,
  "delay_seconds": 5,
  "batch_delay_seconds": 5,
  "operation_id": "order-A1024-preview"
}

# 2. 校验 Payload;不操作微信或授权额度
$exe = "$env:LOCALAPPDATA\WechatSender\wechat-sender.exe"
$payload = "D:\YourApp\requests\request-001.json"
$validateResult = "D:\YourApp\results\request-001.validate.json"
$previewResult = "D:\YourApp\results\request-001.preview.json"
New-Item -ItemType Directory -Force -Path "D:\YourApp\results" | Out-Null
& $exe --validate-payload $payload --output-json $validateResult
if ($LASTEXITCODE -ne 0) { throw "Payload validation failed" }

# 3. 执行 send=false 预览
& $exe --payload-json $payload --output-json $previewResult
$exitCode = $LASTEXITCODE

# 4. 读取 Result V1,不匹配整段中文输出
$result = Get-Content -LiteralPath $previewResult -Raw -Encoding UTF8 |
  ConvertFrom-Json
$result.execution_stage
$result.deliveries
$exitCode
03 / BUSINESS EXAMPLES

消息由你的系统产生,微信只是触达渠道。

无需改变现有业务逻辑。只在流程末端把已经生成的收件人、正文和附件整理成 Payload。

ERP / ORDER

订单状态通知

订单完成后,ERP 生成“订单 A1024 已出库”,发送给负责销售或客户服务群。

MONITOR / ALERT

监控告警触达

服务器指标超过阈值后,告警系统生成摘要,先由值班人员确认,再发到运维微信群。

REPORT / FILE

日报与附件分发

报表程序生成 Excel 或 PDF,Payload 的 files_dir 直接填写完整文件路径。

04 / REQUIRED SAFETY FLOW

真实发送必须经过用户确认。

来自数据库、网页、邮件或模型的内容不能直接进入 send=true。调用方必须保留一个可见的确认环节。

01 / BUILD生成 V1 send=false Payload
02 / VALIDATE无副作用校验 Payload
03 / PREVIEW读取 Result 并展示内容
04 / CONFIRM用户明确确认真实发送
05 / SEND同一业务数据改为 send=true
05 / PAYLOAD V1 CONTRACT

一个版本化 JSON 文件描述一次业务请求。

新集成必须显式使用 schema_version="1.0";文件使用 UTF-8 编码,message 与 files_dir 至少提供一个。

{
  "schema_version": "1.0",
  "contacts": ["文件传输"],
  "message": "日报已生成,请查收。",
  "files_dir": "D:\\Reports\\daily.pdf",
  "recursive": false,
  "max_files": 10,
  "send": false,
  "delay_seconds": 5,
  "batch_delay_seconds": 5,
  "operation_id": "report-20260815-001"
}
files_dir 既可以是单个文件,也可以是目录;无附件时填写 null。附件超过 max_files 时直接失败,不会静默截断。
字段要求用途
schema_version新集成必填,固定 1.0启用 Payload V1 严格校验;无此字段的合法 RC4 Payload 进入兼容模式。
contacts必填,string[]联系人或群名称;客户端每批最多处理 9 个。
message条件必填消息正文;与 files_dir 至少存在一个。
files_dirstring 或 null单个文件完整路径,或目录路径。
max_files可选,默认 10;范围 1–10单次附件安全上限;超出范围或实际附件超限时在发送动作前失败。
send默认 falsefalse 仅预览;true 才会操作微信。
operation_id真实发送强烈要求用于授权额度预留幂等,不代表微信消息只投递一次。
delay_seconds默认 5同一批相邻收件人的等待秒数。
batch_delay_seconds默认 5相邻批次之间的等待秒数。
兼容模式会过滤 contacts 中的 null 并产生 warning;过滤后为空则返回 PAYLOAD_INVALID。V1 严格模式遇到 null 直接返回 PAYLOAD_INVALID,两种模式都不会产生联系人“None”。
06 / CHOOSE AN ENTRY

不是所有调用都必须手工处理 JSON。

普通用户可以用联系人名单文件完成简单批量调用;业务系统开发者仍应优先使用 Payload JSON。

MANUAL BATCH

联系人文件 + CLI

适合人工维护名单、固定正文、临时批量预览或发送,不需要编写 JSON。

SINGLE CONTACT

直接 CLI 参数

适合一次简单调用。注意:不带 --send 时会写入微信草稿,不是纯预览。

D:\tmp\contacts.txt
ablink
888
UTF-8,一行一个联系人;空行和 # 开头的行会忽略。
POWERSHELL / NO JSON
# 预览:不操作微信
& "$env:LOCALAPPDATA\WechatSender\wechat-sender.exe" `
  --contacts-file "D:\tmp\contacts.txt" `
  "明天上午8点开会。"

# 仅在用户明确确认后真实发送
& "$env:LOCALAPPDATA\WechatSender\wechat-sender.exe" `
  --contacts-file "D:\tmp\contacts.txt" `
  "明天上午8点开会。" `
  --send
带 --send 会真实操作桌面微信;不得放入安装流程、后台健康检查或无人确认的自动任务。
普通用户手工调用使用 --contacts-file 更简单。
Python / C# / Node.js使用 --payload-json,让程序管理文件和执行结果。
附件、重试或任务记录使用 JSON,显式保存 operation_id、附件路径和业务日志。
单次简单发送可以直接使用 CLI 位置参数;不带 --send 时只写入草稿。
对开发者最合适的做法:界面只让用户填写联系人、消息和附件;程序自动补齐 send、operation_id 等字段并生成 JSON。不要让普通用户手工创建或复制 UUID。
07 / CODE EXAMPLES

用标准子进程接口调用,不需要产品源码。

调用方只依赖安装路径、Payload/Result V1、退出码和稳定错误码。不要导入内部 Python 模块,也不要直接访问授权中心。

PYTHON / PREVIEW
import json, os, subprocess, uuid
from pathlib import Path

exe = Path(os.environ["LOCALAPPDATA"]) / "WechatSender" / "wechat-sender.exe"
request_dir = Path(os.environ["LOCALAPPDATA"]) / "YourApp" / "sender-requests"
result_dir = Path(os.environ["LOCALAPPDATA"]) / "YourApp" / "sender-results"
request_dir.mkdir(parents=True, exist_ok=True)
result_dir.mkdir(parents=True, exist_ok=True)

operation_id = str(uuid.uuid4())
payload = {
    "schema_version": "1.0",
    "contacts": ["文件传输"],
    "message": "CRM:客户跟进记录已更新。",
    "files_dir": None,
    "recursive": False,
    "max_files": 10,
    "send": False,
    "delay_seconds": 5,
    "batch_delay_seconds": 5,
    "operation_id": operation_id,
}
payload_path = request_dir / f"{operation_id}.json"
result_path = result_dir / f"{operation_id}.preview.json"
payload_path.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8")

process = subprocess.run(
    [str(exe), "--payload-json", str(payload_path),
     "--output-json", str(result_path)],
    shell=False, timeout=300, check=False
)
result = json.loads(result_path.read_text(encoding="utf-8"))
print(process.returncode, result["execution_stage"])
print(result["deliveries"])
NODE.JS / PREVIEW
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { spawnSync } from "node:child_process";
import { randomUUID } from "node:crypto";
import { join } from "node:path";

const exe = join(process.env.LOCALAPPDATA, "WechatSender", "wechat-sender.exe");
const requestDir = join(process.env.LOCALAPPDATA, "YourApp", "sender-requests");
const resultDir = join(process.env.LOCALAPPDATA, "YourApp", "sender-results");
mkdirSync(requestDir, { recursive: true });
mkdirSync(resultDir, { recursive: true });

const operationId = randomUUID();
const payloadPath = join(requestDir, `${operationId}.json`);
const resultPath = join(resultDir, `${operationId}.preview.json`);
const payload = {
  schema_version: "1.0",
  contacts: ["文件传输"],
  message: "监控系统:API 延迟超过阈值。",
  files_dir: null,
  recursive: false,
  max_files: 10,
  send: false,
  delay_seconds: 5,
  batch_delay_seconds: 5,
  operation_id: operationId
};
writeFileSync(payloadPath, JSON.stringify(payload, null, 2), "utf8");

const process = spawnSync(exe, [
  "--payload-json", payloadPath, "--output-json", resultPath
], {
  shell: false, windowsHide: true, timeout: 300000
});
const result = JSON.parse(readFileSync(resultPath, "utf8"));
console.log(process.status, result.execution_stage);
console.log(result.deliveries);
08 / RESULT V1

读取版本化 Result,不要匹配整段中文输出。

V2.1.0 RC2 通过 --output-json 原子写入顶层结果和逐联系人状态;人类可读标准输出只用于诊断。

{
  "schema_version": "1.0",
  "app_version": "2.1.0-rc2",
  "operation_id": "order-A1024-preview",
  "mode": "preview",
  "status": "succeeded",
  "execution_stage": "preview_completed",
  "started_at": "2026-08-16T11:15:50.352+08:00",
  "completed_at": "2026-08-16T11:15:50.359+08:00",
  "summary": {
    "total": 1,
    "pending": 0,
    "succeeded": 1,
    "failed": 0,
    "uncertain": 0
  },
  "deliveries": [{
    "index": 1,
    "contact": "文件传输",
    "status": "previewed",
    "execution_stage": "preview_completed",
    "error_code": null,
    "message": "预览完成,未操作微信。",
    "started_at": null,
    "completed_at": null
  }],
  "validation_errors": [],
  "warnings": [],
  "error": null
}
Delivery 的 started_at 和 completed_at 是 V1 保留字段,当前可以返回 null;调用方必须容忍 null。
Delivery 状态含义自动重试
previewed预览完成,没有操作微信发送。不适用
send_action_completed本地桌面发送动作完成;不是微信服务器或收件人回执。不得仅凭此状态重复发送
failed当前联系人失败;结合 error_code 和 execution_stage 判断。重新确认后决定
uncertain发送动作已开始或可能已经发生。禁止
0
命令成功继续读取 Result 的 status、execution_stage 和 deliveries。
1
操作、校验或部分失败不能据此自动重试;必须读取 Result 分类。
2
授权门禁拒绝读取 error.code,提示用户联网、激活或续费。
STABLE ERROR FIELDS

error.code / error.retryable

常见稳定错误码包括 PAYLOAD_INVALID、ATTACHMENT_LIMIT_EXCEEDED、WECHAT_WINDOW_NOT_FOUND、SEND_PARTIAL_FAILED、SEND_RESULT_UNCERTAIN 和 TRIAL_QUOTA_EXHAUSTED。

  • retryable=true 只表示错误发生在不可逆发送动作前,不会跳过用户确认。
  • operation_id 只保证授权额度预留幂等,不保证微信消息只投递一次。
  • 出现 uncertain、超时或部分失败时,不得直接重跑完整 Payload。
09 / RUNTIME LIMITS

它是桌面接口,不是服务器 API。

微信自动化依赖当前用户桌面、前台窗口和已经登录的个人微信客户端。

必须运行在交互式桌面

不适合 Windows Service、Session 0、无人登录服务器或纯后台容器。

所有任务必须串行

同一时间只启动一个 wechat-sender.exe,避免多个程序争夺微信窗口和剪贴板。

授权由客户端负责

第三方系统不保存授权码,也不直接调用授权中心数据库或 Supabase 接口。

安装后开发资源:%LOCALAPPDATA%\WechatSender\DeveloperKit 包含 PowerShell、Python、Node.js 和 C# 的 send=false 示例;%LOCALAPPDATA%\WechatSender\schemas 包含 Payload V1 与 Result V1 Schema。

先校验、预览并读取 Result,再接入真实业务。

首次真实发送仍需用户明确确认;任何 uncertain 结果都不得自动重试。

下载安装器并开始接入