ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenClaw 接入 Signal 通道实战指南:基于 signal-cli 的 JSON-RPC + SSE 集成、配置与运维

OpenClaw 接入 Signal 通道实战指南:基于 signal-cli 的 JSON-RPC + SSE 集成、配置与运维 人工智能AI Agent即时通讯后端本地部署语音【免费下载链接】openclaw-cn中文社区版OpenClaw同原版保持定期更新已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。项目地址https://gitcode.com/gh_mirrors/op/openclaw-cn点击查看免费下载本文是 OpenClaw 中文社区版仓库路径gh_mirrors/op/openclaw-cn接入 Signal 即时通讯通道的完整技术指南。全文围绕 docs/channels/signal.md 展开从零起步讲解signal-cli的安装、设备链接、最小配置、访问控制、媒体处理、表情回应与投递目标语法并结合仓库源码src/signal 与 src/config/types.signal.ts剖析网关与 daemon 之间 JSON-RPC SSE 的底层通信机制。读完本文你将能够独立完成 Signal 机器人通道的搭建、调试与多账户扩展并理解每个配置项在代码层面的真实作用。架构总览OpenClaw 如何与 Signal 通信Signal 通道在 OpenClaw 中属于外部 CLI 集成external CLI integration类型网关并不内嵌 libsignal 协议栈而是通过 HTTP 与signal-cli守护进程通信具体采用两条通道JSON-RPC请求/响应网关向signal-cli发送发消息、收附件、发回执、发表情等指令SSEServer-Sent Events事件流网关持续订阅来自signal-cli的入站消息事件。这两条通道的实现可以在 src/signal/client.ts 中看到RPC 请求封装为 JSON-RPC 2.0 格式 POST 到/api/v1/rpc健康检查 GET/api/v1/check事件流则通过Accept: text/event-stream长连接读取/api/v1/events可携带account查询参数区分多账户。src/signal/sse-reconnect.ts 负责事件流的断线重连保证长时间运行的稳定性。路由行为有两个明确约定确定性路由机器人的回复永远回到原对话同一个号码或同一个群组会话隔离私聊DM复用 Agent 的主会话群聊则使用独立会话键agent:agentId:signal:group:groupId不同群之间上下文互不串扰。快速上手新手路径官方推荐的起步流程只有四步强烈建议使用独立的 Signal 号码来运行机器人而不是个人号码原因见下文“号码模型”一节安装signal-cli需要 Java 运行环境链接机器人设备执行signal-cli link -n Clawdbot然后用手机 Signal 扫描终端输出的二维码配置 OpenClaw启动网关。最简配置如下JSON5 格式{ channels: { signal: { enabled: true, account: 15551234567, cliPath: signal-cli, dmPolicy: pairing, allowFrom: [15557654321] } } }配置引导器onboarding wizard也内置了 Signal 的设置流程可在 src/channels/plugins/onboarding/signal.ts 中看到它会提示输入allowFromE.164 或uuid:形式并给出signal-cli link -n OpenClaw的链接指引。配置写入权限默认情况下Signal 会话中的用户可以通过/config set|unset命令触发配置更新前提是commands.config: true已开启。如果希望禁止这种通道发起的配置变更可显式关闭{ channels: { signal: { configWrites: false } } }该字段在 src/config/types.signal.ts 中定义为configWrites?: boolean默认true。它同样支持在accounts.id级别逐账户覆盖。号码模型重要理解 Signal 通道的前提是弄清楚“网关连接的是谁的设备”网关连接的是一个 Signal 设备即signal-cli所代表的那个账户由channels.signal.account指定 E.164 号码如果你把机器人跑在个人 Signal 账户上网关会忽略你自己发出的消息——这是防回环保护loop protection避免机器人与自己的消息互相触发因此要实现“我发消息、机器人回复”的效果请使用独立的机器人号码。快速安装fast path进阶路径与新手路径类似但强调两点安装signal-cliJava 必需链接机器人账户signal-cli link -n Clawdbot在 Signal 中扫描二维码完成设备注册配置 Signal 通道并启动网关。以多账户为例可同时配置多个机器人号码{ channels: { signal: { accounts: { main: { enabled: true, name: Main Bot, account: 15551234567, cliPath: signal-cli }, backup: { enabled: true, name: Backup Bot, account: 15559876543 } } } } }多账户配置使用channels.signal.accounts.id键值结构每个账户拥有独立的配置项和可选的name用于 CLI/UI 列表显示这是与 Telegram/Discord/Slack/iMessage 等通道共用的模式详见 docs/gateway/configuration.md。从源码看账户解析逻辑位于 src/signal/accounts.tslistSignalAccountIds在未配置accounts时返回默认账户 IDresolveSignalAccount会把顶层基础配置如httpHost、httpPort、autoStart与账户级配置合并并用merged.httpUrl || http://httpHost:httpPort构造 daemon 的 base URL。也就是说多账户模式下未在账户内显式设置的字段会继承channels.signal顶层值。外部守护进程模式httpUrlsignal-cli是 JVM 应用存在冷启动慢的问题在容器初始化或共享 CPU 场景下你可能更希望自己管理 daemon 的生命周期让 OpenClaw 只做客户端。此时使用httpUrl指向外部 daemon{ channels: { signal: { httpUrl: http://127.0.0.1:8080, autoStart: false } } }配置httpUrl后网关会跳过自动 spawn 和启动等待直接连接该地址。如果仍由网关自动拉起 daemon 但机器启动缓慢可以调大channels.signal.startupTimeoutMs延长等待时间。网关自动拉起 daemon 时的真实命令行可以在 src/signal/daemon.ts 中看到signal-cli [-a account] daemon --http host:port --no-receive-stdout [--receive-mode mode] [--ignore-attachments] [--ignore-stories] [--send-read-receipts]实现要点spawnSignalDaemon用node:child_process的spawn启动子进程--http指定监听地址默认127.0.0.1:8080--no-receive-stdout确保入站消息走 SSE 事件流而非标准输出daemon 的 stdout/stderr 日志会被classifySignalCliLogLine分类包含ERROR/WARN/WARNING或FAILED/SEVERE/EXCEPTION的行进入错误日志其余按普通日志处理进程收到 abort 信号或网关退出时会向子进程发送SIGTERM优雅停止。启动阶段src/signal/monitor.ts 的waitForSignalDaemonReady会以 150ms 间隔轮询/api/v1/check直到 daemon 就绪或超过startupTimeoutMs源码中该值被钳制在 1000ms120000ms 之间默认 30000ms。访问控制私聊 群聊私聊DM默认策略channels.signal.dmPolicy pairing未知发送者会收到一个pairing code配对码其消息被忽略直到管理员批准配对码1 小时过期批准命令openclaw-cn pairing list signalopenclaw-cn pairing approve signal CODE配对是 Signal 私聊的默认令牌交换机制细节见 docs/start/pairing.md。关于发送者身份需要特别注意Signal 消息可能只携带sourceUuid而没有号码。此时发送者被标识为uuid:id并以该形式写入channels.signal.allowFrom。发送者解析与匹配实现在 src/signal/identity.tsresolveSignalSender优先取sourceNumber规范化为 E.164否则取sourceUuidformatSignalSenderId对 UUID 发送者输出uuid:raw对号码发送者输出 E.164isSignalSenderAllowed支持三类白名单条目*任意、uuid:id、裸 E.164UUID 匹配还兼容连字符格式与 32 位紧凑格式。群聊Groupchannels.signal.groupPolicy可选open | allowlist | disabled当策略为allowlist时channels.signal.groupAllowFrom决定谁可以在群内触发机器人。从源码看src/signal/identity.ts 的isSignalGroupAllowed判定逻辑为disabled一律拒绝open一律放行allowlist则回落到与私聊一致的发送者白名单匹配。另外src/signal/monitor.ts 中若未单独配置groupAllowFrom会回退复用allowFrom。工作方式行为细节signal-cli以 daemon 形式常驻网关通过SSE读取入站事件入站消息被归一化为共享的通道信封channel envelope即 OpenClaw 各通道统一的消息中间表示便于后续 Agent 会话处理回复始终路由回同一个号码或群组确定性路由。入站事件到会话的完整链路结合 src/signal/monitor.ts 与 src/signal/monitor/event-handler.ts入站处理链大致为monitorSignalProvider解析账户与全部运行参数历史上限、文本分块上限、访问策略、媒体上限、回执开关等若autoStart为真则拉起 daemon 并等待就绪否则直接使用外部baseUrlrunSignalSseLoop建立 SSE 长连接把每个事件交给createSignalEventHandler事件处理器按发送者、群组、会话键构建上下文进入 Agent 主循环回复经deliverReplies写回 daemonsendRPC。媒体与文本限制出站文本按channels.signal.textChunkLimit分块发送默认 4000 字符可选channels.signal.chunkModenewline优先在**空行段落边界**处断行再按长度分块附件支持从signal-cli以base64形式拉取后落盘默认媒体上限channels.signal.mediaMaxMb默认 8 MB用channels.signal.ignoreAttachments可跳过媒体下载群聊历史上下文由channels.signal.historyLimit或channels.signal.accounts.*.historyLimit控制未设置时回退到messages.groupChat.historyLimit设为0禁用默认 50条。这些行为在源码中的对应实现分块逻辑位于 src/auto-reply/chunk.tsresolveTextChunkLimit支持顶层、账户级、DM 级逐级覆盖chunkMode的newline模式只在段落边界空行处断开避免打断段落内部的单行换行附件拉取在 src/signal/monitor.ts 的fetchAttachment中完成先检查attachment.size是否超过maxBytes超限直接抛错并说明限额再调用getAttachmentRPC 获取 base64 数据经saveMediaBuffer落盘群历史上限解析在 src/signal/monitor.ts 中accountInfo.config.historyLimit ?? cfg.messages?.groupChat?.historyLimit ?? DEFAULT_GROUP_HISTORY_LIMIT。输入指示与已读回执输入指示typing indicators回复生成期间网关通过signal-cli sendTyping持续发送输入状态并周期性刷新已读回执read receipts当channels.signal.sendReadReceipts为true时网关会为允许的私聊转发已读回执群聊不支持已读回执signal-cli 不暴露该能力。对应 RPC 实现在 src/signal/send.tssendTypingSignal调用sendTyping方法stop参数为真时通知对方停止输入sendReadReceiptSignal调用sendReceipt支持type: read | viewed且要求合法的targetTimestamp。在事件处理器中src/signal/monitor/event-handler.ts已读回执只对非群聊!isGroup且sendReadReceipts开启时发出若 daemon 由网关托管readReceiptsViaDaemon则直接依赖 daemon 的--send-read-receipts参数避免重复发送。表情回应message 工具使用message actionreact并指定channelsignal目标发送者的 E.164 号码或 UUID可用uuid:id形式裸 UUID 也可messageId被回应消息的 Signal时间戳群内回应必须提供targetAuthor或targetAuthorUuid。示例message actionreact channelsignal targetuuid:123e4567-e89b-12d3-a456-426614174000 messageId1737630212345 emoji message actionreact channelsignal target15551234567 messageId1737630212345 emoji removetrue message actionreact channelsignal targetsignal:group:groupId targetAuthoruuid:sender-uuid messageId1737630212345 emoji✅配置项channels.signal.actions.reactions开关表情回应动作默认truechannels.signal.reactionLeveloff | ack | minimal | extensiveoff/ack会禁用 Agent 的表情回应此时 message 工具的react会报错minimal/extensive启用 Agent 表情回应并设置引导强度逐账户覆盖channels.signal.accounts.id.actions.reactions、channels.signal.accounts.id.reactionLevel。源码层面的实现要点src/signal/send-reactions.ts通过sendReactionRPC 发送/移除表情移除时设置remove: truetargetAuthor解析接受uuid:前缀、裸 UUID、E.164 三种输入最终统一为信号侧可用的目标群内回应传入groupId时若缺少targetAuthor会直接报错这与文档要求一致reactionLevel的完整定义见 src/config/types.signal.tsack仅允许自动确认回应处理中发送 minimal默认与extensive分别对应“克制”与“宽松”的 Agent 表情使用策略。投递目标语法CLI / cron向 Signal 投递消息时目标target支持以下形式目标类型语法说明私聊号码signal:15551234567或裸 E.164最常用UUID 私聊uuid:id或裸 UUID针对仅携带 UUID 的发送者群组signal:group:groupIdgroupId 为 Signal 群 ID用户名username:name取决于你的 Signal 账户是否支持目标字符串的归一化逻辑在 src/channels/plugins/normalize/signal.ts会剥离可选的signal:前缀识别group:、username:/u:、uuid:前缀并各自归一化looksLikeSignalTargetId则用于判断一个字符串是否像 Signal 目标 ID支持 UUID 连字符/紧凑格式与 E.164 号码。配置参考Signal 全量完整配置请见 docs/gateway/configuration.md。以下为 Signal 通道的全部 Provider 配置项字段定义与注释均可对照 src/config/types.signal.ts基础连接配置项默认值说明channels.signal.enabled—启用/禁用通道启动channels.signal.account—机器人账户的 E.164 号码channels.signal.cliPathsignal-clisignal-cli可执行文件路径channels.signal.httpUrl—daemon 完整 URL覆盖 host/portchannels.signal.httpHost127.0.0.1daemon 绑定地址channels.signal.httpPort8080daemon 绑定端口channels.signal.autoStarthttpUrl未设置时为true是否自动拉起 daemonchannels.signal.startupTimeoutMs30000上限120000等待 daemon 就绪的超时毫秒channels.signal.receiveMode—on-start/manual对应 daemon 的--receive-modechannels.signal.ignoreAttachmentsfalse跳过附件下载channels.signal.ignoreStoriesfalse忽略 daemon 推送的 storieschannels.signal.sendReadReceiptsfalse转发已读回执访问控制配置项默认值说明channels.signal.dmPolicypairingpairing | allowlist | open | disabledchannels.signal.allowFrom—DM 白名单E.164 或uuid:idopen策略要求写*。Signal 没有用户名请用号码/UUIDchannels.signal.groupPolicyallowlistopen | allowlist | disabledchannels.signal.groupAllowFrom回退到allowFrom群内发送者白名单历史与消息配置项默认值说明channels.signal.historyLimit回退messages.groupChat.historyLimit默认50群聊历史上下文条数0禁用channels.signal.dmHistoryLimit—DM 历史按用户轮数计可按用户覆盖channels.signal.dms[phone_or_uuid].historyLimitchannels.signal.textChunkLimit4000出站文本分块大小字符数channels.signal.chunkModelengthlength按长度分块或newline先按空行/段落边界断行再按长度分块channels.signal.mediaMaxMb8入站/出站媒体上限MBchannels.signal.blockStreaming—是否阻塞流式输出channels.signal.responsePrefix—该通道/账户的出站回复前缀覆盖表情与通知配置项默认值说明channels.signal.actions.reactionstrue启用/禁用 message 工具的表情回应channels.signal.reactionLevelminimaloff | ack | minimal | extensivechannels.signal.reactionNotificationsownoff | own | all | allowlist控制“别人回应了你的消息”时是否生成系统事件通知channels.signal.reactionAllowlist—reactionNotifications为allowlist时的白名单相关全局选项agents.list[].groupChat.mentionPatterns群内提及模式Signal 不原生支持提及messages.groupChat.mentionPatterns全局回退的提及模式messages.responsePrefix全局回复前缀。调试与排障要点结合源码遇到问题时可按以下顺序排查daemon 是否就绪网关启动时会轮询/api/v1/check超过startupTimeoutMs上限 120s即报错可先手动执行signal-cli daemon --http 127.0.0.1:8080 --no-receive-stdout验证端口可访问日志分类signal-cli的日志统一经过classifySignalCliLogLine分级包含ERROR/WARN/FAILED/SEVERE/EXCEPTION的行会进入网关错误日志排查时可关注这些关键词会话被忽略若“机器人不回复自己”先确认是否把机器人跑在了个人号码上见“号码模型”UUID 发送者仅携带sourceUuid的消息会以uuid:id身份出现白名单必须使用同一形式表情失败群内react必须先提供targetAuthor/targetAuthorUuidmessageId必须是目标消息的 Signal 时间戳媒体超限附件超限时日志会明确提示超出多少 MB可调大mediaMaxMb或改用ignoreAttachments跳过下载。小结Signal 通道是 OpenClaw 众多外部 CLI 集成中的典型代表网关不碰 libsignal 协议细节而是以signal-clidaemon 为中间层用一套轻量的 HTTP JSON-RPC SSE 协议完成收发、回执、输入状态与表情回应。理解 docs/channels/signal.md 与 src/signal 源码的对应关系后你不仅能完成标准部署还能从容应对多账户、外部 daemon、UUID 发送者与群聊权限等进阶场景。赞分享人工智能AI Agent即时通讯后端本地部署语音【免费下载链接】openclaw-cn中文社区版OpenClaw同原版保持定期更新已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。项目地址https://gitcode.com/gh_mirrors/op/openclaw-cn点击查看免费下载相关推荐NanoClaw Signal 频道接入完全指南基于 signal-cli 原生适配器的设备链接与接线实战NanoClaw Signal 频道接入完全指南基于 signal cli 原生适配器的设备链接与接线实战 导读 本文是 NanoClaw 仓库中 add s人工智能AI 应用AI AgentAgent 沙箱交互助手OpenClaw Signal 通道实战基于 signal-cli 的账号模型、三种传输模式与消息行为全解析OpenClaw Signal 通道实战基于 signal cli 的账号模型、三种传输模式与消息行为全解析 本文基于 OpenClaw 仓库中的 SignaAI 应用AI Agent交互助手后端即时通讯网关MoviePilot AnySearch 技能实战指南基于 JSON-RPC 的统一实时搜索 CLI 接入与运维MoviePilot AnySearch 技能实战指南基于 JSON RPC 的统一实时搜索 CLI 接入与运维 导读 本文以仓库 skills/anysea后端AI AgentMCP 服务AI 技能上一篇魔兽争霸III终极辅助工具免费开源的游戏体验增强完整指南下一篇Sunshine终极指南5分钟搭建免费游戏串流服务器的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表