Trạng thái: tích hợp CLI bên ngoài. Gateway giao tiếp vớiDocumentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
signal-cli qua HTTP — hoặc daemon native (JSON-RPC + SSE) hoặc container bbernhard/signal-cli-rest-api (REST + WebSocket).
Điều kiện tiên quyết
- OpenClaw đã được cài đặt trên máy chủ của bạn (luồng Linux bên dưới đã được kiểm thử trên Ubuntu 24).
- Một trong các lựa chọn:
signal-clicó sẵn trên máy chủ (chế độ native), hoặc- container Docker
bbernhard/signal-cli-rest-api(chế độ container).
- Một số điện thoại có thể nhận một tin nhắn SMS xác minh (cho đường dẫn đăng ký bằng SMS).
- Quyền truy cập trình duyệt cho captcha Signal (
signalcaptchas.org) trong quá trình đăng ký.
Thiết lập nhanh (người mới bắt đầu)
- Dùng một số Signal riêng cho bot (khuyến nghị).
- Cài đặt
signal-cli(cần Java nếu bạn dùng bản dựng JVM). - Chọn một đường dẫn thiết lập:
- Đường dẫn A (liên kết QR):
signal-cli link -n "OpenClaw"và quét bằng Signal. - Đường dẫn B (đăng ký SMS): đăng ký một số riêng bằng captcha + xác minh SMS.
- Đường dẫn A (liên kết QR):
- Cấu hình OpenClaw và khởi động lại gateway.
- Gửi DM đầu tiên và phê duyệt ghép nối (
openclaw pairing approve signal <CODE>).
| Trường | Mô tả |
|---|---|
account | Số điện thoại bot ở định dạng E.164 (+15551234567) |
cliPath | Đường dẫn tới signal-cli (signal-cli nếu nằm trong PATH) |
dmPolicy | Chính sách truy cập DM (khuyến nghị pairing) |
allowFrom | Số điện thoại hoặc giá trị uuid:<id> được phép gửi DM |
Đây là gì
- Kênh Signal thông qua
signal-cli(không nhúng libsignal). - Định tuyến xác định: phản hồi luôn quay lại Signal.
- DM dùng chung phiên chính của agent; nhóm được cô lập (
agent:<agentId>:signal:group:<groupId>).
Ghi cấu hình
Theo mặc định, Signal được phép ghi các cập nhật cấu hình do/config set|unset kích hoạt (yêu cầu commands.config: true).
Tắt bằng:
Mô hình số điện thoại (quan trọng)
- Gateway kết nối tới một thiết bị Signal (tài khoản
signal-cli). - Nếu bạn chạy bot trên tài khoản Signal cá nhân của mình, nó sẽ bỏ qua tin nhắn của chính bạn (bảo vệ vòng lặp).
- Để “tôi nhắn tin cho bot và nó trả lời”, hãy dùng một số bot riêng.
Đường dẫn thiết lập A: liên kết tài khoản Signal hiện có (QR)
- Cài đặt
signal-cli(bản dựng JVM hoặc native). - Liên kết một tài khoản bot:
signal-cli link -n "OpenClaw"rồi quét QR trong Signal.
- Cấu hình Signal và khởi động gateway.
channels.signal.accounts với cấu hình theo từng tài khoản và name tùy chọn. Xem gateway/configuration để biết mẫu dùng chung.
Đường dẫn thiết lập B: đăng ký số bot riêng (SMS, Linux)
Dùng cách này khi bạn muốn có một số bot riêng thay vì liên kết một tài khoản ứng dụng Signal hiện có.- Lấy một số có thể nhận SMS (hoặc xác minh bằng cuộc gọi cho điện thoại cố định).
- Dùng một số bot riêng để tránh xung đột tài khoản/phiên.
- Cài đặt
signal-clitrên máy chủ Gateway:
signal-cli-${VERSION}.tar.gz), hãy cài JRE 25+ trước.
Luôn cập nhật signal-cli; upstream lưu ý rằng các bản phát hành cũ có thể hỏng khi API máy chủ Signal thay đổi.
- Đăng ký và xác minh số:
- Mở
https://signalcaptchas.org/registration/generate.html. - Hoàn tất captcha, sao chép đích liên kết
signalcaptcha://...từ “Open Signal”. - Chạy từ cùng IP bên ngoài với phiên trình duyệt khi có thể.
- Chạy lại đăng ký ngay lập tức (token captcha hết hạn nhanh):
- Cấu hình OpenClaw, khởi động lại Gateway, xác minh kênh:
- Ghép nối người gửi DM của bạn:
- Gửi bất kỳ tin nhắn nào tới số bot.
- Phê duyệt mã trên máy chủ:
openclaw pairing approve signal <PAIRING_CODE>. - Lưu số bot làm liên hệ trên điện thoại để tránh “Unknown contact”.
- README của
signal-cli:https://github.com/AsamK/signal-cli - Luồng captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Luồng liên kết:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Chế độ daemon bên ngoài (httpUrl)
Nếu bạn muốn tự quản lýsignal-cli (khởi động nguội JVM chậm, khởi tạo container, hoặc CPU dùng chung), hãy chạy daemon riêng và trỏ OpenClaw tới đó:
channels.signal.startupTimeoutMs.
Chế độ container (bbernhard/signal-cli-rest-api)
Thay vì chạysignal-cli trực tiếp theo native, bạn có thể dùng container Docker bbernhard/signal-cli-rest-api. Container này bọc signal-cli sau API REST và giao diện WebSocket.
Yêu cầu:
- Container phải chạy với
MODE=json-rpcđể nhận tin nhắn theo thời gian thực. - Đăng ký hoặc liên kết tài khoản Signal của bạn bên trong container trước khi kết nối OpenClaw.
docker-compose.yml:
apiMode kiểm soát giao thức OpenClaw sử dụng:
| Giá trị | Hành vi |
|---|---|
"auto" | (Mặc định) Thăm dò cả hai transport; streaming xác thực việc nhận qua WebSocket của container |
"native" | Ép dùng signal-cli native (JSON-RPC tại /api/v1/rpc, SSE tại /api/v1/events) |
"container" | Ép dùng container bbernhard (REST tại /v2/send, WebSocket tại /v1/receive/{account}) |
apiMode là "auto", OpenClaw lưu cache chế độ đã phát hiện trong 30 giây để tránh thăm dò lặp lại. Nhận qua container chỉ được chọn cho streaming sau khi /v1/receive/{account} nâng cấp lên WebSocket, điều này yêu cầu MODE=json-rpc.
Chế độ container hỗ trợ cùng các thao tác kênh Signal như chế độ native khi container cung cấp các API tương ứng: gửi, nhận, tệp đính kèm, chỉ báo đang nhập, biên nhận đã đọc/đã xem, phản ứng, nhóm và văn bản có định dạng. OpenClaw chuyển đổi các lệnh gọi RPC Signal native của nó thành payload REST của container, bao gồm ID nhóm group.{base64(internal_id)} và text_mode: "styled" cho văn bản đã định dạng.
Ghi chú vận hành:
- Dùng
autoStart: falsevới chế độ container. OpenClaw không nên spawn daemon native khi chọnapiMode: "container". - Dùng
MODE=json-rpcđể nhận.MODE=normalcó thể làm/v1/abouttrông khỏe mạnh, nhưng/v1/receive/{account}không nâng cấp lên WebSocket, nên OpenClaw sẽ không chọn streaming nhận qua container trong chế độauto. - Đặt
apiMode: "container"khi bạn biếthttpUrltrỏ tới API REST của bbernhard. ĐặtapiMode: "native"khi bạn biết nó trỏ tới JSON-RPC/SSE củasignal-clinative. Dùng"auto"khi cách triển khai có thể thay đổi. - Tải xuống tệp đính kèm trong chế độ container tuân thủ cùng giới hạn byte media như chế độ native. Phản hồi quá cỡ bị từ chối trước khi được buffer đầy đủ khi máy chủ gửi
Content-Length, và bị từ chối trong khi streaming trong các trường hợp khác.
Kiểm soát truy cập (DM + nhóm)
DM:- Mặc định:
channels.signal.dmPolicy = "pairing". - Người gửi không xác định nhận một mã ghép nối; tin nhắn bị bỏ qua cho đến khi được phê duyệt (mã hết hạn sau 1 giờ).
- Phê duyệt qua:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Ghép nối là trao đổi token mặc định cho DM Signal. Chi tiết: Ghép nối
- Người gửi chỉ có UUID (từ
sourceUuid) được lưu dưới dạnguuid:<id>trongchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromkiểm soát nhóm hoặc người gửi nào có thể kích hoạt phản hồi nhóm khi đặtallowlist; mục nhập có thể là ID nhóm Signal (thô,group:<id>, hoặcsignal:group:<id>), số điện thoại người gửi, giá trịuuid:<id>, hoặc*.channels.signal.groups["<group-id>" | "*"]có thể ghi đè hành vi nhóm bằngrequireMention,tools, vàtoolsBySender.- Dùng
channels.signal.accounts.<id>.groupscho ghi đè theo từng tài khoản trong thiết lập nhiều tài khoản. - Việc đưa một nhóm Signal vào danh sách cho phép thông qua
groupAllowFromtự nó không tắt cổng yêu cầu nhắc tên. Một mụcchannels.signal.groups["<group-id>"]được cấu hình cụ thể sẽ xử lý mọi tin nhắn nhóm trừ khi đặtrequireMention=true. - Ghi chú runtime: nếu
channels.signalhoàn toàn thiếu, runtime sẽ quay vềgroupPolicy="allowlist"cho kiểm tra nhóm (ngay cả khichannels.defaults.groupPolicyđược đặt).
Cách hoạt động (hành vi)
- Chế độ native:
signal-clichạy như một daemon; Gateway đọc sự kiện qua SSE. - Chế độ container: Gateway gửi qua API REST và nhận qua WebSocket.
- Tin nhắn đến được chuẩn hóa vào envelope kênh dùng chung.
- Phản hồi luôn định tuyến trở lại cùng số hoặc nhóm.
Media + giới hạn
- Văn bản gửi đi được chia đoạn theo
channels.signal.textChunkLimit(mặc định 4000). - Chia đoạn theo dòng mới tùy chọn: đặt
channels.signal.chunkMode="newline"để chia tại các dòng trống (ranh giới đoạn văn) trước khi chia theo độ dài. - Hỗ trợ tệp đính kèm (base64 được lấy từ
signal-cli). - Tệp đính kèm ghi chú thoại dùng tên tệp của
signal-clilàm MIME dự phòng khi thiếucontentType, để phiên âm âm thanh vẫn có thể phân loại bản ghi nhớ giọng nói AAC. - Giới hạn media mặc định:
channels.signal.mediaMaxMb(mặc định 8). - Dùng
channels.signal.ignoreAttachmentsđể bỏ qua việc tải xuống media. - Ngữ cảnh lịch sử nhóm dùng
channels.signal.historyLimit(hoặcchannels.signal.accounts.*.historyLimit), rồi quay vềmessages.groupChat.historyLimit. Đặt0để tắt (mặc định 50).
Đang nhập + biên nhận đã đọc
- Chỉ báo đang nhập: OpenClaw gửi tín hiệu đang nhập qua
signal-cli sendTypingvà làm mới chúng trong khi phản hồi đang chạy. - Biên nhận đã đọc: khi
channels.signal.sendReadReceiptslà true, OpenClaw chuyển tiếp biên nhận đã đọc cho các DM được phép. - Signal-cli không cung cấp biên nhận đã đọc cho nhóm.
Phản ứng (công cụ tin nhắn)
- Sử dụng
message action=reactvớichannel=signal. - Mục tiêu: E.164 của người gửi hoặc UUID (dùng
uuid:<id>từ đầu ra ghép cặp; UUID trần cũng dùng được). messageIdlà dấu thời gian Signal của tin nhắn mà bạn đang phản ứng.- Phản ứng trong nhóm yêu cầu
targetAuthorhoặctargetAuthorUuid.
channels.signal.actions.reactions: bật/tắt các hành động phản ứng (mặc định true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/acktắt phản ứng của tác nhân (công cụ tin nhắnreactsẽ báo lỗi).minimal/extensivebật phản ứng của tác nhân và đặt mức hướng dẫn.
- Ghi đè theo từng tài khoản:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Mục tiêu gửi (CLI/cron)
- Tin nhắn trực tiếp:
signal:+15551234567(hoặc E.164 thuần). - Tin nhắn trực tiếp UUID:
uuid:<id>(hoặc UUID trần). - Nhóm:
signal:group:<groupId>. - Tên người dùng:
username:<name>(nếu tài khoản Signal của bạn hỗ trợ).
Khắc phục sự cố
Chạy thang kiểm tra này trước:- Daemon truy cập được nhưng không có phản hồi: xác minh thiết lập tài khoản/daemon (
httpUrl,account) và chế độ nhận. - Tin nhắn trực tiếp bị bỏ qua: người gửi đang chờ phê duyệt ghép cặp.
- Tin nhắn nhóm bị bỏ qua: cổng kiểm soát theo người gửi/nhắc đến trong nhóm chặn việc gửi.
- Lỗi xác thực cấu hình sau khi chỉnh sửa: chạy
openclaw doctor --fix. - Signal thiếu trong chẩn đoán: xác nhận
channels.signal.enabled: true.
Ghi chú bảo mật
signal-clilưu khóa tài khoản cục bộ (thường là~/.local/share/signal-cli/data/).- Sao lưu trạng thái tài khoản Signal trước khi di chuyển máy chủ hoặc dựng lại.
- Giữ
channels.signal.dmPolicy: "pairing"trừ khi bạn thật sự muốn quyền truy cập tin nhắn trực tiếp rộng hơn. - Xác minh SMS chỉ cần cho luồng đăng ký hoặc khôi phục, nhưng mất quyền kiểm soát số/tài khoản có thể làm việc đăng ký lại phức tạp hơn.
Tham chiếu cấu hình (Signal)
Cấu hình đầy đủ: Cấu hình Tùy chọn nhà cung cấp:channels.signal.enabled: bật/tắt khởi động kênh.channels.signal.apiMode:auto | native | container(mặc định: auto). Xem Chế độ container.channels.signal.account: E.164 cho tài khoản bot.channels.signal.cliPath: đường dẫn đếnsignal-cli.channels.signal.httpUrl: URL daemon đầy đủ (ghi đè host/port).channels.signal.httpHost,channels.signal.httpPort: liên kết daemon (mặc định 127.0.0.1:8080).channels.signal.autoStart: tự động sinh daemon (mặc định true nếu chưa đặthttpUrl).channels.signal.startupTimeoutMs: thời gian chờ khởi động tính bằng ms (giới hạn 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: bỏ qua tải xuống tệp đính kèm.channels.signal.ignoreStories: bỏ qua tin từ daemon.channels.signal.sendReadReceipts: chuyển tiếp biên nhận đã đọc.channels.signal.dmPolicy:pairing | allowlist | open | disabled(mặc định: pairing).channels.signal.allowFrom: danh sách cho phép tin nhắn trực tiếp (E.164 hoặcuuid:<id>).openyêu cầu"*". Signal không có tên người dùng; dùng ID điện thoại/UUID.channels.signal.groupPolicy:open | allowlist | disabled(mặc định: allowlist).channels.signal.groupAllowFrom: danh sách cho phép nhóm; chấp nhận ID nhóm Signal (thô,group:<id>, hoặcsignal:group:<id>), số E.164 của người gửi, hoặc giá trịuuid:<id>.channels.signal.groups: ghi đè theo từng nhóm, khóa theo ID nhóm Signal (hoặc"*"). Trường được hỗ trợ:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: phiên bản theo từng tài khoản củachannels.signal.groupscho thiết lập nhiều tài khoản.channels.signal.historyLimit: số tin nhắn nhóm tối đa đưa vào làm ngữ cảnh (0 tắt).channels.signal.dmHistoryLimit: giới hạn lịch sử tin nhắn trực tiếp theo lượt người dùng. Ghi đè theo từng người dùng:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: kích thước đoạn gửi đi (ký tự).channels.signal.chunkMode:length(mặc định) hoặcnewlineđể tách theo dòng trống (ranh giới đoạn văn) trước khi chia đoạn theo độ dài.channels.signal.mediaMaxMb: giới hạn phương tiện gửi đến/gửi đi (MB).
agents.list[].groupChat.mentionPatterns(Signal không hỗ trợ nhắc đến gốc).messages.groupChat.mentionPatterns(dự phòng toàn cục).messages.responsePrefix.
Liên quan
- Tổng quan kênh — tất cả kênh được hỗ trợ
- Ghép cặp — xác thực tin nhắn trực tiếp và luồng ghép cặp
- Nhóm — hành vi trò chuyện nhóm và cổng kiểm soát nhắc đến
- Định tuyến kênh — định tuyến phiên cho tin nhắn
- Bảo mật — mô hình truy cập và gia cố