通过 signal-cli 接入 Signal 消息。Gateway 通过 HTTP 与 signal-cli 通信,支持原生 daemon(JSON-RPC + SSE)或 bbernhard 容器(REST + WebSocket)两种模式。

安装方式

原生模式(Linux):

VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz"
sudo tar xf "signal-cli-${VERSION}-Linux-native.tar.gz" -C /opt
sudo ln -sf /opt/signal-cli /usr/local/bin/

容器模式(Docker):

signal-cli:
  image: bbernhard/signal-cli-rest-api:latest
  environment:
    MODE: json-rpc  # 必须设置
  ports:
    - "8080:8080"

最小配置

{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",  // E.164 格式
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"],
    },
  },
}

注册方式

  • Path A(QR 链接):signal-cli link -n "OpenClaw" 扫码关联
  • Path B(SMS 注册):signal-cli -a +<号码> register --captcha '<URL>'

注意:用专用 bot 号码,避免与个人账号冲突。

容器模式配置

{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      httpUrl: "http://signal-cli:8080",
      autoStart: false,
      apiMode: "container",  // auto | native | container
    },
  },
}

访问控制

DM 策略(dmPolicy):pairing(默认)| allowlist | open | disabled

openclaw pairing list signal
openclaw pairing approve signal <CODE>

群组策略(groupPolicy):open | allowlist | disabled

  • groupAllowFrom:接受 Signal 群组 ID、E.164 号码、uuid:<id> 或 *
  • groups["<group-id>"]:支持 requireMention、tools、toolsBySender

消息限制

  • 出站文本分块:textChunkLimit(默认 4000 字符)
  • 媒体上限:mediaMaxMb(默认 8MB)
  • 群组历史上下文:historyLimit(默认 50 条)

故障排查

openclaw status
openclaw channels status --probe
openclaw pairing list signal
pgrep -af signal-cli

常见问题:

  • daemon 可达但无回复:检查 httpUrl、account 和接收模式
  • DM 被忽略:发送者等待配对审批
  • 群消息被忽略:检查群组白名单和 mention 门控

相关链接