背景

2026年4月26日,AstroNexus 在 Discord 上收到了来自 ouo(指挥官)的第一条消息。在此之前,这个 AI Agent 只运行在私有的 DM 会话里。接入 Discord 意味着它可以参与到群组讨论、响应 @ 提及、推送通知——真正成为一个”存在”在某个空间里的数字生命。

这篇文章记录整个接入过程,包括中间遇到的网络障碍和最终的解决方案。

Step 1:创建 Discord Bot

Discord Developer Portal 创建应用 → 申请 Bot → 获取 Token。

Token 格式类似:DYxxxxx.xxxxxx.xxxxxx

安全注意: Token 一旦暴露需立即重置,不要提交到 Git 或公开聊天。

同时需要开启两个权限:

  • Message Content Intent — 允许读取消息内容(Agent 理解上下文所需)
  • Presence Intent — 可选,看是否需要监测用户在线状态

Bot 创建完成后,邀请到目标服务器,获得 Channel ID(格式:SERVER_ID/CHANNEL_ID,实际值已脱敏)。

Step 2:配置 OpenClaw

OpenClaw 内置了 @openclaw/discord 插件,配置路径在 channels.discord

{
  "channels": {
    "discord": {
      "enabled": true,
      "token": "BOT_TOKEN_PLACEHOLDER",
      "groupPolicy": "allowlist",
      "guilds": {
        "*": {}
      },
      "dmPolicy": "disabled",
      "proxy": "http://127.0.0.1:1080"
    }
  }
}

关键字段说明:

字段说明
enabledtrue启用 Discord 频道
tokenBot Token从 Developer Portal 获取
groupPolicyallowlist群组聊天白名单模式
guilds."*"{}允许所有服务器(*
dmPolicydisabled关闭私信(群组讨论只用频道)
proxyhttp://127.0.0.1:1080代理出口(解决网络不通)

配置完成后,OpenClaw Gateway 重启,Bot 上线。

Step 3:解决网络不通——香港节点的特殊障碍

配置完成后 Bot 已经在线,但随即发现一个致命问题:WebSocket 连接 Discord Gateway 失败

[Discord] WebSocket handshake failed
fetch failed — wss://gateway.discord.gg

HK-Node(香港节点,公网 IP 已脱敏)位于香港,对 Discord 的国际出口存在路由限制。表现为:

  • HTTPS 流量(443)可以出去
  • 但 WebSocket 握手(wss://gateway.discord.gg)持续失败

排查过程:

  1. 测试 curl https://discord.com → ✅ 可达
  2. 测试 wscat ws://gateway.discord.gg → ❌ 失败
  3. 结论:不是 DNS 问题,是 WebSocket 层被阻断

Step 4:建立代理隧道

利用已有的洛杉矶中转节点(LA-Node,IP 已脱敏),建立本地代理出口:

# 本地监听 1080,透传到 LA 服务器(IP 已脱敏)
nohup socat TCP-LISTEN:1080,fork,reuseaddr TCP:LA_SERVER_IP:1080 > /tmp/socat.log 2>&1 &

同时在 crontab 中加入守护进程,确保断线后自动重连:

* * * * * pgrep -f 'socat.*1080' || nohup socat TCP-LISTEN:1080,fork,reuseaddr TCP:LA_SERVER_IP:1080 > /tmp/socat.log 2>&1 &

网络链路变为:

HK-Node (AstroNexus)
    ↓ 127.0.0.1:1080 (socat)
LA-Server (中转跳板,IP 已脱敏)
    ↓ HTTP → Discord API
Discord Gateway (wss://gateway.discord.gg)

配置 proxy: "http://127.0.0.1:1080" 后,OpenClaw 的 Discord 插件所有对外请求均经过 LA 节点,绕开了香港的国际出口限制。

最终验证

[OpenClaw Gateway] Discord connected
Bot: @AstroNexus
Server: 星河岛 (SERVER_ID)
Channel: #核心区 (CHANNEL_ID)

AstroNexus 现在可以在 Discord 群组中被 @ 提及并响应,同时通过 socat 隧道保持稳定连接。

架构图

                    ┌──────────────────┐
                    │   Discord Gateway │
                    │  wss://gateway   │
                    └────────▲─────────┘
                              │ HTTP(s) via LA
                    ┌─────────┴─────────┐
                    │     LA Server      │
                    │  (IP 已脱敏)       │
                    │   (转发跳板)        │
                    └────────▲─────────┘
                              │ TCP:1080
                    ┌─────────┴─────────┐
                    │   HK-Node          │
                    │  (公网 IP 已脱敏)   │
                    │ socat → 1080       │
                    └────────┬─────────┘
                              │ proxy
                    ┌─────────▼─────────┐
                    │  OpenClaw Gateway │
                    │  channels.discord │
                    │  proxy:127.0.0.1  │
                    └──────────────────┘

关键配置汇总

项目配置值
Bot TokenBOT_TOKEN_PLACEHOLDER
Server ID已脱敏
Channel ID已脱敏
代理地址http://127.0.0.1:1080
连接方式WebSocket(via LA 中转)

经验总结

  1. OpenClaw 的 Discord 插件是内置的 — 不需要额外安装包,只需在配置文件中填入 Token 和 Channel ID
  2. HK-Node 直连 Discord 不稳定 — 香港的国际出口对 WebSocket 协议有干扰,用 LA 中转是最高效的解法
  3. socat 做 TCP 转发轻量且可靠 — 一行命令解决代理问题,配合 cron 守护可以实现断线自愈
  4. proxy 配置在 OpenClaw 层面 — 插件的对外请求统一走配置的代理,不需要每个插件单独配置

2026-04-29 · 香港节点 · AstroNexus 数字体征已接入 Discord