IRC

当你希望把 OpenClaw 接入传统 IRC(#channel)与私信时,可以使用 IRC 渠道。 IRC 以扩展插件形式交付,但配置仍写在主配置的 channels.irc 下。

快速开始

  1. ~/.openclaw/openclaw.json 启用 IRC 配置。
  2. 至少设置这些字段:
{
  "channels": {
    "irc": {
      "enabled": true,
      "host": "irc.libera.chat",
      "port": 6697,
      "tls": true,
      "nick": "openclaw-bot",
      "channels": ["#openclaw"]
    }
  }
}
  1. 启动/重启 Gateway:
openclaw gateway run

默认安全策略

  • channels.irc.dmPolicy 默认是 "pairing"
  • channels.irc.groupPolicy 默认是 "allowlist"
  • groupPolicy="allowlist" 时,需要配置 channels.irc.groups 来声明允许的频道。
  • 除非你明确接受明文传输,否则建议启用 TLS(channels.irc.tls=true)。

访问控制

IRC 有两道独立的“门”:

  1. 频道访问groupPolicy + groups):机器人是否接受来自某个频道的消息。
  2. 发送者访问groupAllowFrom / 每频道 groups["#channel"].allowFrom):在允许的频道里,哪些人可以触发机器人。

配置键:

  • 私信允许列表(私信发送者访问):channels.irc.allowFrom
  • 群组发送者允许列表(频道发送者访问):channels.irc.groupAllowFrom
  • 每频道控制(频道 + 发送者 + 提及规则):channels.irc.groups["#channel"]
  • channels.irc.groupPolicy="open" 允许未显式配置的频道(默认仍会要求提及

允许列表条目支持 nick 或 nick!user@host 两种形式。

常见坑:allowFrom 只管私信,不管频道

如果日志里出现:

  • irc: drop group sender alice!ident@host (policy=allowlist)

表示该发送者在 群组/频道 场景不被允许。修复方式二选一:

  • 配置 channels.irc.groupAllowFrom(对所有频道生效),或
  • 在对应频道里配置 channels.irc.groups["#channel"].allowFrom

示例(允许 #tuirc-dev 里任何人触发机器人):

{
  channels: {
    irc: {
      groupPolicy: "allowlist",
      groups: {
        "#tuirc-dev": { allowFrom: ["*"] },
      },
    },
  },
}

回复触发(提及 gating)

即使某个频道被允许(groupPolicy + groups),且发送者也被允许,OpenClaw 在群组上下文默认仍会启用 提及触发

因此你可能会看到类似 drop channel … (missing-mention) 的日志:消息没有匹配到提及机器人的模式。

如果你希望机器人在某个 IRC 频道 不需要被 @ 提及也能回复,可以为该频道关闭提及 gating:

{
  channels: {
    irc: {
      groupPolicy: "allowlist",
      groups: {
        "#tuirc-dev": {
          requireMention: false,
          allowFrom: ["*"],
        },
      },
    },
  },
}

或者你希望允许 所有 IRC 频道(无需按频道 allowlist),并且仍然不需要提及:

{
  channels: {
    irc: {
      groupPolicy: "open",
      groups: {
        "*": { requireMention: false, allowFrom: ["*"] },
      },
    },
  },
}

更多关于群组访问、提及 gating 的关系,参见:群组

安全提示(公开频道建议)

如果你在公开频道配置了 allowFrom: ["*"],任何人都能 prompt 机器人。为了降低风险,建议为该频道限制工具权限。

频道内所有人使用同一套工具策略

{
  channels: {
    irc: {
      groups: {
        "#tuirc-dev": {
          allowFrom: ["*"],
          tools: {
            deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"],
          },
        },
      },
    },
  },
}

按发送者区分工具策略(owner 权限更大)

使用 toolsBySender:对 "*" 更严格,对你的 nick 更宽松:

{
  channels: {
    irc: {
      groups: {
        "#tuirc-dev": {
          allowFrom: ["*"],
          toolsBySender: {
            "*": {
              deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"],
            },
            eigen: {
              deny: ["gateway", "nodes", "cron"],
            },
          },
        },
      },
    },
  },
}

说明:

  • toolsBySender 的 key 可以是 nick(例如 "eigen"),也可以是完整 hostmask(例如 "[email protected]"),后者匹配更强。
  • 发送者策略按顺序匹配,命中第一条即生效;"*" 是通配兜底。

NickServ

连接后通过 NickServ 完成身份识别:

{
  "channels": {
    "irc": {
      "nickserv": {
        "enabled": true,
        "service": "NickServ",
        "password": "your-nickserv-password"
      }
    }
  }
}

可选:首次连接时进行一次性注册:

{
  "channels": {
    "irc": {
      "nickserv": {
        "register": true,
        "registerEmail": "[email protected]"
      }
    }
  }
}

注册完成后建议关闭 register,避免重复尝试 REGISTER。

环境变量

默认账号支持:

  • IRC_HOST
  • IRC_PORT
  • IRC_TLS
  • IRC_NICK
  • IRC_USERNAME
  • IRC_REALNAME
  • IRC_PASSWORD
  • IRC_CHANNELS(逗号分隔)
  • IRC_NICKSERV_PASSWORD
  • IRC_NICKSERV_REGISTER_EMAIL

故障排除

  • 机器人已连接但在频道里从不回复:检查 channels.irc.groups,以及是否被提及 gating 丢弃(missing-mention)。如果希望不需要被 @ 就回复,为该频道设置 requireMention:false
  • 登录失败:检查 nick 是否可用、以及服务器密码配置。
  • 自建网络 TLS 失败:检查 host/port 与证书配置是否正确。