【保姆级教程】无需一行后端代码!用 n8n 零成本打造一个 7x24 小时的企业微信 AI 助理

104 阅读5分钟

【保姆级教程】无需一行后端代码!用 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% 的新手。

企业微信要求你的服务器有两种身份:

  1. “门卫” (验证模式) : 在你后台点保存时,它会发 GET 请求,需要你解密 echostr 并原样返回。
  2. “接待员” (聊天模式) : 员工发消息时,它会发 POST 请求,需要你解密 XML 消息体。

所以,我们的 n8n 工作流也要先当“门卫”,再当“接待员”。

阶段 A: 扮演“门卫”,通过验证

  1. 新建 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 }}
  2. 点击 n8n 右上角的 Publish (发布) 开关,让它变绿。一定要发布!!

image.png

  1. 去企业微信后台 -> 你的应用 -> API接收消息,填入你的 Cloudflare 地址 (.../webhook/wechat-ai),点击保存

保存后的配置如图

image.png

> **🎉 如果弹出“保存成功”,恭喜你,最难的一步已经完成!**

三、 变身!打造 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 }}]; }
    
    • 它能:

      1. 解密 POST 请求的 XML Body。
      2. 兼容大小写问题。
      3. 自动清洗掉群聊里的 @机器人名字。
    • 记得填入 Token 和 AESKey!

2. 连接 AI 大脑和微信 API

在 Code 节点后,依次添加三个 HTTP Request 节点:

  1. 节点一:调用 DeepSeek

    • Method: POST

    • URLapi.deepseek.com/chat/comple…

    • Headers: Authorization = Bearer sk-你的DeepSeekKey

    • Body (JSON) :

      codeJSON

      {
        "model": "deepseek-chat",
        "messages": [
          {"role": "user", "content": "{{ $('Code').first().json.user_question }}"}
        ]
      }
      
  2. 节点二:获取企业微信 Token

  3. 节点三:回复消息给用户

    • 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 的表达式语法,用于引用前面节点的数据。请确保节点名和你画布上的一致。


四、 最终上线与使用

  1. 保存工作流 (Ctrl+S)。
  2. 检查 IP 白名单:确保你服务器的公网 IP 已经加到了企业微信应用后台的“企业可信IP”里。
  3. 拉它进群:在手机上,从应用资料页通过“推荐”功能,把你的 AI 助手拉进一个群(如果你可以的话,在下是没成功)。

总结与展望

到这里,一个功能完善、稳定可靠的企业微信 AI 机器人就诞生了。我们一路上趟过了**“双重身份验证”、“n8n安全锁”、“IP白名单”、“数据持久化”和“后台守护进程”**这五个大坑,这些经验远比最终的成果更宝贵。

这只是一个开始,基于 n8n 强大的连接能力,你还可以:

  • 连接数据库/飞书文档: 让 AI 能回答公司内部的知识。
  • 创建审批流: 聊天 发起请假,自动流转给领导。
  • 定时任务: 每天早上自动在群里播报天气或重要通知。

自动化的世界才刚刚向你展开,期待你在评论区分享你的酷炫玩法!如果觉得这篇文章对你有帮助,别忘了点赞、收藏、加关注三连哦!