【保姆级教程】无需一行后端代码!用 n8n 零成本打造一个 7x24 小时的企业微信 AI 助理
前言
兄弟们好。在日常工作中,是不是经常被各种重复性问题轰炸?比如新人入职问制度、同事咨询 IT 问题、甚至午饭吃什么... 如果有一个 7x24 小时在线、不知疲倦、还能调用公司知识库的 AI 助理,是不是很酷?
今天,我就手把手带大家,利用 n8n + 企业微信 + AI 这个黄金组合,零成本(服务器除外)搭建一个属于你自己公司的 AI Bot。最终效果是,你可以向机器人提问,它会自动私聊给你精准的答复。
别担心,哪怕你是纯前端或者完全的小白,只要跟着我的步骤走,保证你能成功复刻!
技术栈概览:
- n8n: 一个开源的、可视化的自动化工作流工具,你可以把它想象成程序员版的“快捷指令”或 IFTTT。
- Cloudflare Tunnel: 神器!能把你的本地服务(比如跑在虚拟机里的 n8n)免费暴露到公网上,并自带 HTTPS。
- DeepSeek API: 国内顶尖的大模型 API,兼容 OpenAI 格式,响应快,而且新用户有免费额度,极其便宜。
- Docker: 最流行的容器化工具,保证我们的 n8n 环境纯净、可移植、一键启动。
一、 环境准备:打下坚实的地基
在开始之前,我们需要一个稳定运行的 n8n 服务和一个公网通道。这一步做好了,后面 90% 的问题都不会发生。
1. 启动一个“永久在线”的 n8n
我们使用 Docker 来运行 n8n,并一次性把所有“坑”都填上。请在你的服务器终端执行以下命令:
codeBash
# 1. 停止并清理可能存在的旧容器 (防干扰)
docker stop n8n && docker rm n8n
# 2. 创建一个专属的数据目录,并修复权限 (防止因权限问题导致数据丢失)
mkdir -p /home/ubuntu/.n8n
sudo chown -R 1000:1000 /home/ubuntu/.n8n
# 3. 运行最终版的“永久后台启动”命令
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-e NODE_FUNCTION_ALLOW_BUILTIN=crypto \
-e NODE_FUNCTION_ALLOW_EXTERNAL=* \
-e N8N_SECURE_COOKIE=false \
-v /home/ubuntu/.n8n:/home/node/.n8n \
n8nio/n8n
命令解读:
- -d: 后台运行,关掉终端 n8n 也在。
- --restart unless-stopped: 服务器重启,n8n 自动复活。
- -v ...: 数据持久化,这行是你的“后悔药”,保证你的工作流永远不会丢。
- -e ...: 解锁权限,这是我们趟过的坑,crypto (加解密), xml2js (XML解析), Cookie安全 的权限一次性全开了。
启动后,等待 20 秒,访问 http://你的服务器IP:5678 应该就能看到 n8n 的界面了。
2. 架设一条“永不掉线”的公网隧道
Cloudflare Tunnel 是我们的“光纤”,让远在天边的企业微信能找到你家里的 n8n。
codeBash
# 使用 nohup 让隧道也在后台永久运行
nohup cloudflared tunnel --url http://localhost:5678 > tunnel.log 2>&1 &
然后,用 tail -f tunnel.log 查看日志,复制那条 xxxx.trycloudflare.com 的地址,这就是你的公网大门。
二、 攻克难关:与企业微信的“双重握手”
这是全文最核心的难点,理解了它,你就超越了 90% 的新手。
企业微信要求你的服务器有两种身份:
- “门卫” (验证模式) : 在你后台点保存时,它会发 GET 请求,需要你解密 echostr 并原样返回。
- “接待员” (聊天模式) : 员工发消息时,它会发 POST 请求,需要你解密 XML 消息体。
所以,我们的 n8n 工作流也要先当“门卫”,再当“接待员”。
阶段 A: 扮演“门卫”,通过验证
-
新建 Workflow,并搭建如下三节点流程:
-
Webhook 节点:
- Method: GET
- Path: wechat-ai
- Respond: Using 'Respond to Webhook' Node
-
Code 节点 (门卫代码) :
codeJavaScript
// 填入你在企业微信后台获取的 Token 和 AESKey const token = '你的Token'; const encodingAESKey = '你的EncodingAESKey'; const crypto = require('crypto'); const query = items[0].json.query; const echostr = query.echostr; if (!echostr) return [{json: {result: "error"}}]; try { const aesKey = Buffer.from(encodingAESKey + '=', 'base64'); const iv = aesKey.slice(0, 16); const decipher = crypto.createDecipheriv('aes-256-cbc', aesKey, iv); decipher.setAutoPadding(false); let decrypted = decipher.update(echostr, 'base64'); decrypted = Buffer.concat([decrypted, decipher.final()]); const msgLen = decrypted.readUInt32BE(16); const resultText = decrypted.slice(20, 20 + msgLen).toString(); return [{json: { response_data: resultText }}]; } catch (error) { return [{json: { error: error.message }}]; } -
Respond to Webhook 节点:
- Respond With: Text
- Response Body (表达式): {{ $json.response_data }}
-
-
点击 n8n 右上角的 Publish (发布) 开关,让它变绿。一定要发布!!
- 去企业微信后台 -> 你的应用 -> API接收消息,填入你的 Cloudflare 地址 (.../webhook/wechat-ai),点击保存。
保存后的配置如图:
> **🎉 如果弹出“保存成功”,恭喜你,最难的一步已经完成!**
三、 变身!打造 AI 聊天机器人
验证通过后,我们立刻把“门卫”换成“接待员”。
1. 改造工作流
-
修改 Webhook 节点:
- Method: POST
- Respond: Immediately (立即响应,防止超时)
-
删除 那个多余的 Respond to Webhook 节点。
-
修改 Code 节点 (接待员代码) :
// ------------------------------------ const token = '你的Token'; const encodingAESKey = '你的EncodingAESKey'; // ------------------------------------ const crypto = require('crypto'); const xml2js = require('xml2js'); function getCaseInsensitive(obj, key) { if (!obj) return undefined; const foundKey = Object.keys(obj).find(k => k.toLowerCase() === key.toLowerCase()); return foundKey ? obj[foundKey] : undefined; } function parseXml(xml) { let result = null; xml2js.parseString(xml, { explicitArray: false }, (err, res) => { result = res; }); return result; } try { const body = items[0].json.body; const xmlNode = body.xml || body; let encryptData = getCaseInsensitive(xmlNode, 'Encrypt'); if (!encryptData) return [{json: {error: "No data"}}]; const aesKey = Buffer.from(encodingAESKey + '=', 'base64'); const iv = aesKey.slice(0, 16); const decipher = crypto.createDecipheriv('aes-256-cbc', aesKey, iv); decipher.setAutoPadding(false); let decrypted = decipher.update(encryptData, 'base64'); decrypted = Buffer.concat([decrypted, decipher.final()]); const pad = decrypted[decrypted.length - 1]; if (pad >= 1 && pad <= 32) decrypted = decrypted.slice(0, decrypted.length - pad); const contentLen = decrypted.readUInt32BE(16); const xmlContent = decrypted.slice(20, 20 + contentLen).toString(); const msgData = parseXml(xmlContent).xml || parseXml(xmlContent); let rawContent = getCaseInsensitive(msgData, 'Content'); // 去除 @机器人 的名字 const userQuestion = rawContent ? rawContent.replace(/^@.*?[\u2005\s]/, '') : ""; const userId = getCaseInsensitive(msgData, 'FromUserName'); return [{ json: { user_question: userQuestion, user_id: userId } }]; } catch (error) { return [{json: { error: error.message }}]; }-
它能:
- 解密 POST 请求的 XML Body。
- 兼容大小写问题。
- 自动清洗掉群聊里的 @机器人名字。
-
记得填入 Token 和 AESKey!
-
2. 连接 AI 大脑和微信 API
在 Code 节点后,依次添加三个 HTTP Request 节点:
-
节点一:调用 DeepSeek
-
Method: POST
-
Headers: Authorization = Bearer sk-你的DeepSeekKey
-
Body (JSON) :
codeJSON
{ "model": "deepseek-chat", "messages": [ {"role": "user", "content": "{{ $('Code').first().json.user_question }}"} ] }
-
-
节点二:获取企业微信 Token
- Method: GET
- URL: qyapi.weixin.qq.com/cgi-bin/get…
- Query Parameters: corpid (你的企业ID), corpsecret (你的应用Secret)
-
节点三:回复消息给用户
-
Method: POST
-
URL (表达式) : qyapi.weixin.qq.com/cgi-bin/mes… $('Get Token').first().json.access_token }}
-
Body (JSON) :
codeJSON
{ "touser": "{{ $('Code').first().json.user_id }}", "msgtype": "text", "agentid": 你的AgentID, "text": { "content": "{{ $('调用 DeepSeek').first().json.choices[0].message.content }}" } }
提示: 上面代码里的 $('节点名') 是 n8n 的表达式语法,用于引用前面节点的数据。请确保节点名和你画布上的一致。
-
四、 最终上线与使用
- 保存工作流 (Ctrl+S)。
- 检查 IP 白名单:确保你服务器的公网 IP 已经加到了企业微信应用后台的“企业可信IP”里。
- 拉它进群:在手机上,从应用资料页通过“推荐”功能,把你的 AI 助手拉进一个群(如果你可以的话,在下是没成功)。
总结与展望
到这里,一个功能完善、稳定可靠的企业微信 AI 机器人就诞生了。我们一路上趟过了**“双重身份验证”、“n8n安全锁”、“IP白名单”、“数据持久化”和“后台守护进程”**这五个大坑,这些经验远比最终的成果更宝贵。
这只是一个开始,基于 n8n 强大的连接能力,你还可以:
- 连接数据库/飞书文档: 让 AI 能回答公司内部的知识。
- 创建审批流: 聊天 发起请假,自动流转给领导。
- 定时任务: 每天早上自动在群里播报天气或重要通知。
自动化的世界才刚刚向你展开,期待你在评论区分享你的酷炫玩法!如果觉得这篇文章对你有帮助,别忘了点赞、收藏、加关注三连哦!