IRC
IRC 适配器将 Hermes 连接到任意 IRC 服务器,并在 IRC 频道(或私信)与代理之间中继消息。它基于 Python 标准库 asyncio 实现 IRC 协议通信——无外部依赖、无 SDK、无守护进程。它适用于 Libera.Chat 等公共网络以及任何自托管的 ircd。
IRC 是纯文本协议:不支持语音、图片、文件、线程、反应表情、输入状态或流式传输——回复以 PRIVMSG 行发送,长消息会被拆分以符合 IRC 的行长度限制。
运行
hermes gateway setup并选择 IRC 以获取引导式配置流程。
前提条件
- 要连接的 IRC 服务器(例如
irc.libera.chat) - 要加入的频道(例如
#hermes)——若要加入多个频道,请使用逗号分隔 - 机器人的昵称(默认:
hermes-bot) - 可选:如果网络要求身份验证,则需要注册的昵称 + NickServ 密码
配置 Hermes
你可以通过两种方式配置 IRC——环境变量(用于快速的仅环境变量设置)或 ~/.hermes/gateway-config.yaml 中的 gateway 块。
选项 A — gateway-config.yaml
gateway:
platforms:
irc:
enabled: true
extra:
server: irc.libera.chat
port: 6697
nickname: hermes-bot
channel: "#hermes"
use_tls: true
server_password: "" # optional server password
nickserv_password: "" # optional NickServ identification
allowed_users: [] # empty = allow all, or list of nicks
max_message_length: 450 # IRC line limit (safe default)
选项 B — 环境变量
| 变量 | 必需 | 描述 |
|---|---|---|
IRC_SERVER | ✅ | IRC 服务器主机名(例如 irc.libera.chat) |
IRC_CHANNEL | ✅ | 要加入的频道——多个频道用逗号分隔 |
IRC_NICKNAME | ✅ | 机器人昵称(默认:hermes-bot) |
IRC_PORT | — | 服务器端口(默认:TLS 为 6697,非 TLS 为 6667) |
IRC_USE_TLS | — | 使用 TLS(true/false;端口 6697 时默认为 true) |
IRC_SERVER_PASSWORD | — | 用于 PASS 命令的服务器密码 |
IRC_NICKSERV_PASSWORD | — | 用于连接时自动 IDENTIFY 的 NickServ 密码 |
IRC_ALLOWED_USERS | — | 允许与机器人对话的昵称,逗号分隔 |
IRC_ALLOW_ALL_USERS | — | 允许频道中的任何人与机器人对话(仅限开发环境) |
IRC_HOME_CHANNEL | — | 用于定时任务/通知投递的频道(默认为 IRC_CHANNEL) |
访问控制
默认情况下,只有在 allowed_users(或 IRC_ALLOWED_USERS)中列出的昵称才能与机器人对话。将列表留空并设置 IRC_ALLOW_ALL_USERS=true 可让频道中的任何人与 Hermes 聊天——这适用于测试,但不建议在公共网络上使用,因为除非网络强制使用 NickServ,否则 IRC 昵称未经过身份验证。
如果你的网络支持昵称注册,请设置 IRC_NICKSERV_PASSWORD(或 nickserv_password),以便机器人在连接时向 NickServ 进行身份验证并保持其注册昵称。
频道与私信
- 已加入频道中的消息被视为群组对话。
- 发送给机器人的私信被视为直接消息。
定时任务和通知会投递到主频道——如果设置了 IRC_HOME_CHANNEL 则使用该频道,否则使用第一个 IRC_CHANNEL。
运行网关
hermes gateway start
使用 hermes gateway status 检查状态——此处会报告 IRC 连接状态,包括仅使用环境变量的设置。
注意事项
- 较长的代理回复会自动拆分为多个
PRIVMSG行,以保持在 IRC 行长度限制内(max_message_length,默认在协议开销后为 450 字节)。 - 适配器会为每个服务器+昵称获取一个 scoped credential lock(作用域凭证锁),因此两个 Hermes 配置文件不会争夺同一个 IRC 身份。