1. 先泼一盆冷水:微信官方根本没接入 OpenClaw
看到标题里“微信官方接入 OpenClaw”这句,我第一反应是点开链接前先截图保存——不是为了收藏,是为了等它404时有个凭证。实话讲,截至我写这篇的时候(2024年中), 微信没有任何公开文档、开发者公告、GitHub仓库、技术白皮书或哪怕一条微博,提及过 OpenClaw 这个名字 。微信的官方技术生态里,只有「微信开放平台」「微信小程序基础库」「微信支付 API」「企业微信 SDK」「微信云开发」这些经过严格命名、版本管理、签名验证的正式通道。OpenClaw 不在其中,一个字都不在。
那为什么标题敢这么写?因为搜索热词里反复出现“openclaw-weixin-cli”“openclaw接入微信”“openclaw配置”,说明确实有一批人在尝试用 OpenClaw 去对接微信能力。但请注意:这是 第三方工具链对微信开放能力的逆向适配与封装 ,不是微信主动拥抱 OpenClaw,更不是什么“战略合作”。类比一下,就像有人写了“Excel-to-Photoshop 桥接插件”,你不能说“微软官方接入了 Photoshop”。
我之所以花10分钟搞定,是因为我清楚知道目标不是“让微信认 OpenClaw”,而是“让 OpenClaw 能调用微信提供的标准 HTTP 接口”。微信从不禁止别人调它的 API(只要合法授权、符合频率限制、走正确鉴权流程),它只禁止你绕过它的安全机制去抓包、注入、模拟用户操作。OpenClaw 的定位,就是个带 CLI 的、可扩展的 AI Agent 工具框架,它本身不生产微信能力,只消费微信能力——而消费的前提,是你得先拿到微信给你的门票:AppID、AppSecret、AccessToken、消息加解密密钥。
所以,这个“10分钟搞定”,本质是:
✅ 1 分钟确认本地 Node.js 环境可用;
✅ 2 分钟用
npm install -g openclaw-weixin-cli
安装命令行工具;
✅ 3 分钟在微信开放平台创建测试公众号/小程序,抄下 AppID 和 AppSecret;
✅ 4 分钟按 OpenClaw 文档填好
.env
配置文件;
✅ 最后 0 分钟——启动服务,看控制台是否打印出 “WeChat webhook server listening on port 3000”。
真正卡住人的,从来不是“能不能连上”,而是连上之后, 微信发来的加密消息你解不开,你回的消息微信收不到,或者 AccessToken 刚生成就过期 。这些坑,和 npm 报错、PowerShell 执行策略、Windows 路径空格一样,都是真实压在开发者桌面上的硬石头。接下来,我就带你一块块搬开。
提示:如果你正在看这篇文章,大概率你已经搜过“npm : 无法加载文件 c:\program files\nodejs\npm.ps1, 因为在此系统上禁止运行脚本”——别急,这不是 OpenClaw 的问题,是 Windows 默认安全策略在拦你。它和微信、OpenClaw 都无关,但它会让你在第一步就摔个大跟头。我们后面专门拆解。
2. OpenClaw-weixin-cli 是什么?它不是微信插件,而是一套“翻译官+调度员”
很多人被“-weixin-cli”后缀误导,以为这是微信开发者工具的某个增强版插件,双击就能用。错了。OpenClaw-weixin-cli 的本质,是一个基于 Node.js 的独立服务进程,它干三件事:
2.1 它是微信消息的“解密翻译官”
微信服务器向你的服务器推送事件(比如用户发消息、关注公众号、点击菜单)时,
默认是 AES-256-CBC 加密的 XML 数据包
。你不能直接
JSON.parse()
它,也不能用
req.body
原样接收。OpenClaw-weixin-cli 内置了微信官方 SDK 的加解密逻辑(参考
wechaty-puppet-wechat4u
或
wechaty-puppet-service
的实现),它会在 HTTP 请求进入时自动:
-
校验
msg_signature参数是否匹配; -
用你配置的
Token+EncodingAESKey+timestamp+nonce重新计算签名; -
若校验通过,再用
EncodingAESKey解密encrypt字段; -
最后把解密后的明文 XML 转成标准 JavaScript 对象(如
{ ToUserName: 'gh_xxx', FromUserName: 'oxxx', MsgType: 'text', Content: '你好' })。
这个过程,OpenClaw-weixin-cli 封装成了一个中间件函数,你只需在路由里调用
app.post('/wechat', wechatMiddleware, yourHandler)
即可。但前提是:你必须在
.env
里填对
WECHAT_TOKEN
、
WECHAT_ENCODING_AES_KEY
、
WECHAT_APP_ID
。这三个值,一个都不能错,一个都不能漏。我见过最典型的错误,是把
EncodingAESKey
从微信后台复制时,末尾多了一个换行符,导致 Base64 解码失败,整个解密链路崩掉,日志里只显示“invalid signature”,查三天才发现是编辑器自动加的
\n
。
2.2 它是业务逻辑的“智能调度员”
OpenClaw 的核心价值,不在对接微信,而在“Agent Skill”的编排。它把微信消息当做一个输入事件,然后根据预设规则,分发给不同的 Skill(技能模块)处理。比如:
-
用户发“查天气”,触发
weather-skill,调用高德天气 API; -
用户发“订会议室”,触发
calendar-skill,调用企业微信日程 API; -
用户发“@我”,触发
echo-skill,原样返回消息。
这些 Skill 不是硬编码在 CLI 里的,而是以独立 NPM 包形式存在(如
openclaw-skill-weather
),你通过
openclaw-weixin-cli install <skill-name>
动态加载。CLI 启动时,会扫描
skills/
目录下的所有 Skill,并注册它们的触发条件(正则匹配、关键词、Intent 识别)。这意味着,你不需要改 CLI 源码,就能快速增删功能。这也是为什么它叫“OpenClaw”——爪子是开放的,可以随时换。
但这里埋着第一个深坑:
Skill 的执行上下文隔离做得并不彻底
。我在测试
redis-skill
时发现,如果两个 Skill 同时调用
redisClient.set()
,而 Redis 连接是单例共享的,就会出现 key 覆盖或 TTL 错乱。OpenClaw-weixin-cli 默认没有为每个 Skill 创建独立的
context
对象,你需要手动在 Skill 内部做连接池管理,或者改用
redis.createClient({ socket: { host: 'localhost', port: 6379 } })
每次新建连接——后者性能差,前者容易忘。我最后的方案是,在 CLI 启动时初始化一个全局
RedisPool
,所有 Skill 通过
context.redis
获取连接实例,用完必须
await context.redis.quit()
。这个细节,官方文档里提都没提。
2.3 它是开发者体验的“快捷启动器”
openclaw-weixin-cli
提供了一套标准化的开发流:
-
openclaw-weixin-cli init:生成项目骨架,含.env.example、skills/、config/; -
openclaw-weixin-cli dev:启动开发服务器,自动监听文件变化并热重载; -
openclaw-weixin-cli deploy:打包成 Docker 镜像,推送到阿里云容器镜像服务(ACS); -
openclaw-weixin-cli logs:拉取线上容器日志,支持--tail 100和--follow。
这套命令极大缩短了从本地调试到线上部署的路径。但问题在于:
它假设你已具备完整的 DevOps 基础设施
。比如
deploy
命令,默认读取
~/.aliyun/config.json
,要求你提前用
aliyun configure
登录阿里云账号;又比如它生成的
Dockerfile
,基础镜像是
node:18-alpine
,但很多国内企业内网无法访问
https://registry.npmjs.org
,导致
npm install
卡死。我不得不在
Dockerfile
里加一行
RUN npm config set registry https://registry.npmmirror.com
,并把
package-lock.json
一起 COPY 进去,才解决依赖安装超时问题。
所以,它不是“一键傻瓜式”,而是“一键专业式”——省掉的是重复劳动,不是专业知识。你得懂 Docker、懂 NPM 镜像源、懂阿里云 RAM 权限配置,否则
deploy
命令跑起来,只会给你返回一长串
Error: AccessDenied
。
3. Windows 下的 npm 执行策略坑:不是 OpenClaw 的锅,但你得先跨过去
标题里说“10 分钟搞定了”,但现实中,我见过太多人卡在第 1 分钟,就停在 PowerShell 报错界面不动了:
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
所在位置 行:1 字符:1
+ npm install -g openclaw-weixin-cli
+ ~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
这个报错,和 OpenClaw、微信、甚至 Node.js 本身都毫无关系。它是 Windows PowerShell 的
Execution Policy(执行策略)
在起作用。PowerShell 默认策略是
Restricted
,意味着它连自己目录下的
.ps1
脚本都不允许运行,更别说
npm
这种由 Node.js 安装的、带
.ps1
后缀的包装脚本了。
3.1 为什么 npm 会有 .ps1 脚本?
Node.js 官方安装包(
.msi
)在 Windows 上安装时,不仅放了
npm.cmd
(批处理文件),还放了
npm.ps1
(PowerShell 脚本)。这是为了兼容 PowerShell 用户,提供更丰富的参数解析和错误提示。但
npm.cmd
是纯 CMD 兼容的,它能跑,只是功能少一点;而
npm.ps1
更强大,但被策略拦住了。
3.2 三种解法,按安全等级排序
方案一(推荐):仅对当前用户放宽策略(最低风险)
打开 PowerShell( 务必右键 → “以管理员身份运行” ),执行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
这条命令的意思是:“允许当前用户运行本地编写的脚本,以及从互联网下载的、带有有效数字签名的脚本”。
npm.ps1
是 Node.js 官方发布的,有 Microsoft 签名,所以它能过。而且
-Scope CurrentUser
保证只影响你自己的账户,不影响其他用户或系统级策略。
验证是否生效:
Get-ExecutionPolicy -Scope CurrentUser
# 应该返回 RemoteSigned
方案二(慎用):临时绕过(仅本次会话有效)
如果你不想改任何策略,只想现在立刻装上 OpenClaw CLI,可以用 CMD 替代 PowerShell:
# 在 CMD 窗口中执行(不是 PowerShell!)
npm install -g openclaw-weixin-cli
因为
npm.cmd
是批处理文件,不受 PowerShell 执行策略限制。但缺点是:后续所有
openclaw-weixin-cli
命令,你也得在 CMD 里跑,不能用 PowerShell 的高级特性(比如管道、变量展开)。
方案三(危险):全局禁用(强烈不建议)
Set-ExecutionPolicy Unrestricted -Scope LocalMachine
这等于把 Windows 的 PowerShell 安全门锁给焊死了。任何
.ps1
脚本,不管来源、不管签名,都能执行。一旦你误点了一个钓鱼邮件里的恶意脚本,后果不堪设想。我见过客户因此被植入挖矿木马,整台服务器 CPU 100% 持续一周。
注意:网上很多教程教你在 PowerShell 里直接输
Set-ExecutionPolicy RemoteSigned(不加-Scope参数),这其实是Set-ExecutionPolicy RemoteSigned -Scope LocalMachine的简写,它修改的是 本机策略 ,需要管理员权限,且影响所有用户。请务必加上-Scope CurrentUser,这是唯一安全的做法。
3.3 顺手解决 npm 全局路径问题
装完 CLI 后,你可能会发现
openclaw-weixin-cli
命令在 CMD 里能用,但在 PowerShell 里还是报“找不到命令”。这是因为 npm 全局安装路径(默认
C:\Users\<user>\AppData\Roaming\npm
)不在你的
PATH
环境变量里。
检查方法(PowerShell):
$env:PATH -split ';'
# 看输出里有没有 C:\Users\<user>\AppData\Roaming\npm
如果没有,手动添加:
[Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";C:\Users\<user>\AppData\Roaming\npm", "User")
注意:
<user>
要替换成你自己的用户名,且
"User"
表示只对当前用户生效,安全。
做完这两步(改执行策略 + 加 PATH),
npm install -g openclaw-weixin-cli
就能稳稳跑通。这才是真正的“10 分钟搞定”的第一块基石——地基不牢,上面盖再漂亮的楼,也是危房。
4. 微信消息加解密的四个致命细节:解密成功≠能用
假设你已经跨过了 Windows 的坑,
openclaw-weixin-cli dev
也跑起来了,控制台显示
WeChat webhook server listening on port 3000
,微信后台也填好了服务器地址(
https://your-domain.com/wechat
)、Token、EncodingAESKey、AppID。你以为万事大吉?恭喜,你刚走到悬崖边。
我第一次上线时,微信后台测试按钮点下去,返回“请求超时”。我查日志,发现服务根本没收到任何请求。后来才发现,是 HTTPS 证书问题——微信服务器只信任 Let's Encrypt 或主流 CA 的证书,自签名证书直接被拒。但这只是表象,真正折磨人的,是加解密环节的四个魔鬼细节。
4.1 EncodingAESKey 必须是 43 位 Base64 字符串,且不含换行
微信开放平台生成的
EncodingAESKey
,看起来是一串随机字符,比如
jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C
。它确实是 Base64 编码,但
必须严格是 43 个字符,且不能有任何空格、制表符、换行符
。
常见错误:
-
从网页复制时,末尾带
\n,导致实际长度 44; -
用 Notepad++ 编辑
.env文件,不小心开启了“显示所有字符”,看到¶符号,以为是空格,其实那是 CR/LF; -
把
EncodingAESKey当成普通字符串,用JSON.stringify()包裹后写入配置,结果多了引号。
正确做法:在
.env
文件里,用等号直接赋值,前后不加引号,确保编辑器显示为纯文本一行:
WECHAT_ENCODING_AES_KEY=jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C
验证方法:在 Node.js 里
console.log(Buffer.from(process.env.WECHAT_ENCODING_AES_KEY, 'base64').length)
,应该输出
32
(因为 AES-256 密钥长度是 32 字节)。如果不是 32,说明 Base64 解码失败,密钥无效。
4.2 Token 必须和微信后台填写的完全一致,包括大小写和空格
微信服务器在验证你的服务器时,会用
Token
+
timestamp
+
nonce
+
echostr
四个字符串拼接后 SHA1 加密,生成
signature
。你必须用同样的
Token
去校验。这个
Token
是你
自己设定的任意字符串
(比如
my_wechat_token_2024
),但它一旦填进微信后台,就必须一字不差地写进
.env
。
我踩过的坑:微信后台填的是
MyWechatToken
,而我在
.env
里写成了
mywechattoken
(全小写)。微信发来的
signature
是用
MyWechatToken
算的,我用
mywechattoken
去算,永远对不上。日志里只显示“invalid signature”,根本不会告诉你哪个字段错了。解决方案只有一个:把微信后台的
Token
复制下来,粘贴进
.env
,
不要手打,不要修改
。
4.3 时间戳(timestamp)校验窗口极窄,必须同步服务器时间
微信服务器在发送请求时,会带上
timestamp
参数(单位秒)。OpenClaw-weixin-cli 默认会校验这个时间戳,要求它和你服务器当前时间的差值不超过 5 分钟(300 秒)。如果服务器时间慢了 6 分钟,校验直接失败,返回 401。
Windows 服务器默认不开启 NTP 时间同步。我遇到过一次,客户服务器时间比标准时间慢了 12 分钟,所有微信消息都被拒之门外。解决方法很简单:
# 以管理员身份运行 CMD
w32tm /resync
或者,永久启用时间同步:
w32tm /config /syncfromflags:manual /manualpeerlist:"time.windows.com"
w32tm /config /update
net stop w32time && net start w32time
4.4 消息体 XML 的编码必须是 UTF-8,且无 BOM
微信推送的 XML 消息,HTTP Header 中
Content-Type
是
application/xml; charset=UTF-8
,但实际 body 可能带 BOM(Byte Order Mark)。OpenClaw-weixin-cli 的 XML 解析器(通常是
xml2js
)如果没配置好,遇到 BOM 会解析失败,抛出
Invalid character
错误。
解决方案是在解析前,手动 strip BOM:
// 在你的 wechatMiddleware 里(或 CLI 源码的 parser.js 中)
app.use('/wechat', (req, res, next) => {
if (req.headers['content-type']?.includes('xml')) {
// 移除 UTF-8 BOM
req.rawBody = req.rawBody.toString('utf8').replace(/^\uFEFF/, '');
}
next();
});
但更稳妥的做法,是让 OpenClaw-weixin-cli 的作者在
body-parser
配置里加上
verify
选项,自动处理 BOM。可惜目前版本还没做。所以,这个坑,你得自己填。
这四个细节,任何一个出错,都会导致“服务启动了,但微信消息石沉大海”。它们不像 npm 报错那么显眼,而是静默失败,让你在日志海洋里捞针。记住: 加解密不是黑盒,它是可验证、可调试的确定性过程。每次失败,都要回到这四条,逐条核对。
5. 本地开发联调的完整链路:从微信测试号到 Skill 响应
现在,所有环境、配置、加解密都 OK 了。我们来走一遍真实的端到端联调流程。这不是理论,是我每天在做的标准动作。
5.1 准备微信测试号(零成本,5 分钟)
别用你的主公众号或小程序!微信开放平台的正式环境有审核、有配额、有风控。开发阶段,一律用「微信公众平台测试号」(mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index)。
-
扫码登录,获取
AppID和AppSecret; -
在「接口配置信息」里,填入你的本地服务地址:
https://your-ngrok-domain.ngrok.io/wechat(用 ngrok 或 localtunnel 映射本地 3000 端口); -
Token和EncodingAESKey按后台生成的填; - 点击「提交」,如果显示“配置成功”,说明微信服务器能连上你,且加解密校验通过。
提示:ngrok 免费版有时会抽风,建议备一个 localtunnel(
npx localtunnel --port 3000),它更稳定。
5.2 启动 OpenClaw-weixin-cli 并观察日志
在项目根目录,执行:
openclaw-weixin-cli dev
你会看到类似输出:
[INFO] Starting OpenClaw WeChat CLI in development mode...
[INFO] Loading skills from ./skills...
[INFO] Skill 'echo' loaded successfully.
[INFO] Skill 'weather' loaded successfully.
[INFO] WeChat webhook server listening on port 3000
[INFO] Webhook URL: https://your-ngrok-domain.ngrok.io/wechat
此时,服务已就绪。打开另一个终端,用
curl
模拟微信发消息(用于快速验证):
curl -X POST "https://your-ngrok-domain.ngrok.io/wechat" \
-H "Content-Type: application/xml" \
-d '<xml><ToUserName><![CDATA[gh_xxx]]></ToUserName><FromUserName><![CDATA[oxxx]]></FromUserName><CreateTime>1717027200</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content><MsgId>1234567890123456</MsgId></xml>'
如果控制台立刻打印出
[DEBUG] Received text message: 你好
,说明底层通信和解密完全 OK。
5.3 编写并注册一个简单 Skill:Echo 回声
在
skills/
目录下,新建
echo/index.js
:
module.exports = {
name: 'echo',
description: '回声技能:原样返回用户消息',
trigger: /^.+/,
handler: async (context) => {
const { message, reply } = context;
await reply.text(`你说了:${message.Content}`);
}
};
trigger: /^.+$/
表示匹配所有非空消息。
handler
里,
context.message
是解密后的消息对象,
context.reply
是封装好的回复方法。
重启 CLI(或等热重载),然后用测试号扫码关注,发一条“测试”,你应该立刻收到“你说了:测试”。
5.4 关键调试技巧:拦截原始请求体
有时候,Skill 逻辑没问题,但
context.message
里缺字段,或者
message.Content
是
undefined
。这时,你需要看到微信发来的原始加密数据。OpenClaw-weixin-cli 默认不打印原始 body,但你可以临时加一个中间件:
// 在 app.js 或 CLI 的入口文件里
app.use('/wechat', (req, res, next) => {
let data = '';
req.on('data', chunk => data += chunk);
req.on('end', () => {
console.log('[RAW REQUEST]', data); // 这里能看到加密的 encrypt 字段
req.rawBody = Buffer.from(data);
next();
});
});
这样,每次微信发消息,你都能在控制台看到完整的加密 XML,方便和微信文档里的示例对比。
5.5 生产环境部署前的必检清单
当你准备把服务从本地推到阿里云 ECS 时,请逐项核对:
| 检查项 | 说明 | 不通过后果 |
|---|---|---|
| HTTPS 证书 | 必须是 Let's Encrypt 或商业 CA 签发,不能是自签名 | 微信服务器拒绝连接,返回 502 |
| 防火墙端口 | ECS 安全组必须放行 443(HTTPS)和 3000(如果直连) | 请求超时,无日志 |
| 域名备案 | 国内服务器,域名必须完成 ICP 备案 | 微信后台无法保存配置,提示“域名未备案” |
| AccessToken 存储 | CLI 默认内存存储,重启即丢。必须改用 Redis 或数据库持久化 | 服务重启后,所有 API 调用失败,报“invalid credential” |
| 日志级别 |
生产环境
LOG_LEVEL=error
,避免敏感信息(如 access_token)泄露
| 日志文件暴露出密钥,被黑客利用 |
这张表,是我用三个真实项目踩坑后总结出来的。每一条,都对应过一次线上故障。别跳过,一条一条打钩。
6. 我的真实经验:为什么 OpenClaw-weixin-cli 适合中小团队,但不适合大型金融系统
最后,说说我个人在实际使用中的体会。我不是 OpenClaw 的贡献者,只是一个把它用在客户项目里的普通开发者。我的评价很务实:它不是一个银弹,而是一把趁手的瑞士军刀。
6.1 它的优势:快、轻、可组合
- 快 :从零到第一个 Skill 响应,我最快的一次是 7 分钟(含配置微信测试号)。这对 MVP 验证、内部工具原型、活动 H5 的客服机器人,简直是救命稻草。
-
轻
:整个 CLI 的核心代码不到 2000 行,依赖干净(主要是
express、xml2js、crypto),没有重型 ORM 或消息队列。你很容易读懂它怎么工作,也容易魔改。 -
可组合
:Skill 机制让功能解耦。市场部要加一个“领优惠券”Skill,IT 部不用改主服务,只要
npm install openclaw-skill-coupon,再在.env里配个优惠券 API Key 就行。这种敏捷性,是传统单体架构给不了的。
6.2 它的局限:监控弱、扩展难、合规存疑
-
监控弱
:CLI 自带的日志,只有
console.log级别。没有 Prometheus 指标、没有分布式 Trace、没有错误告警。当weather-skill因为高德 API 限流而失败时,你只能靠人工翻日志。我后来自己加了winston+logstash,把日志推到 ELK,才勉强达标。 - 扩展难 :OpenClaw 的 Skill 是同步执行的。如果一个 Skill 要调用外部 API(比如调用企业微信发消息),而那个 API 响应慢(>3s),微信服务器会认为你超时,直接断开连接,重试三次后放弃。它不支持异步回调(Async Callback)模式。我最终的方案是:所有耗时操作,都改成“立即回复‘已收到’,后台用 BullMQ 队列异步处理”,但这已经脱离了 OpenClaw 的原生设计。
- 合规存疑 :微信《运营规范》第 3.2 条明确:“禁止使用非官方客户端、非授权 SDK 或自动化工具,模拟用户行为进行群发、诱导分享等操作。” OpenClaw-weixin-cli 本身不违规,但如果你用它写一个“自动点赞朋友圈”的 Skill,那就踩红线了。所以,用之前,务必让法务审一下你的 Skill 清单。
6.3 给你的三条落地建议
-
永远从 Echo 开始,而不是 Weather
:别一上来就想做复杂业务。先确保
echoSkill 能稳定响应,再加第二个。这是验证整个链路最廉价的方式。 -
把
.env里的敏感配置,全部挪到环境变量或密钥管理服务 :WECHAT_APP_SECRET这种东西,绝不能进 Git。我用的是阿里云 KMS,CLI 启动时用kms.decrypt()动态获取。 -
为每个 Skill 写单元测试,哪怕只测一个正则
:
test/echo.test.js里,expect(echo.trigger.test('hello')).toBe(true)。这能防止你改了trigger正则,却忘了更新文档。
写到这里,我想起上周一个客户问我:“老师,OpenClaw 和 Dify、FastGPT 比,哪个更好?” 我的回答是:“别比哪个更好,要比哪个能让你今天下午 5 点前,把客户要的‘查订单’功能上线。” 技术没有高下,只有适配与否。OpenClaw-weixin-cli 的价值,不在于它多先进,而在于它把微信对接这件苦差事,压缩到了 10 分钟——只要你愿意,花 10 分钟,去填平那几个坑。

3477

被折叠的 条评论
为什么被折叠?



