Mainstream messaging
Signal
Signal เป็น Plugin ช่องทางที่ดาวน์โหลดได้ (@openclaw/signal) Gateway สื่อสารกับ signal-cli ผ่าน HTTP โดยใช้ได้ทั้งดีมอนแบบเนทีฟ (JSON-RPC + SSE) หรือคอนเทนเนอร์ bbernhard/signal-cli-rest-api (REST + WebSocket) OpenClaw ไม่ได้ฝัง libsignal มาในตัว
รูปแบบการใช้หมายเลข (โปรดอ่านส่วนนี้ก่อน)
- Gateway เชื่อมต่อกับ อุปกรณ์ Signal ซึ่งเป็นบัญชี
signal-cli - การเรียกใช้บอตบน บัญชี Signal ส่วนตัวของคุณ จะทำให้บอตเพิกเฉยต่อข้อความของคุณเอง (การป้องกันลูป)
- หากต้องการให้ "ฉันส่งข้อความหาบอตแล้วบอตตอบกลับ" ให้ใช้ หมายเลขบอตแยกต่างหาก
การติดตั้ง
openclaw plugins install @openclaw/signalข้อกำหนด Plugin ที่ระบุเพียงชื่อจะลองค้นหาใน ClawHub ก่อน แล้วจึงใช้ npm เป็นทางเลือกสำรอง บังคับแหล่งที่มาด้วย openclaw plugins install clawhub:@openclaw/signal หรือ npm:@openclaw/signal คำสั่ง plugins install จะลงทะเบียนและเปิดใช้งาน Plugin จึงไม่ต้องมีขั้นตอน enable แยกต่างหาก ดูกฎการติดตั้งทั่วไปได้ที่ Plugin
การตั้งค่าอย่างรวดเร็ว
เลือกหมายเลข
ใช้ หมายเลข Signal แยกต่างหาก สำหรับบอต (แนะนำ)
ติดตั้ง Plugin
openclaw plugins install @openclaw/signalเรียกใช้การตั้งค่าแบบมีคำแนะนำ
openclaw channels addวิซาร์ดจะตรวจสอบว่า signal-cli อยู่ใน PATH หรือไม่ และหากไม่พบ จะเสนอให้ติดตั้ง โดยดาวน์โหลดบิลด์ GraalVM แบบเนทีฟอย่างเป็นทางการบน Linux x86-64 หรือติดตั้งผ่าน Homebrew บน macOS และสถาปัตยกรรมอื่น จากนั้นระบบจะขอหมายเลขบอตและพาธ signal-cli
สำหรับการตั้งค่าแบบไม่โต้ตอบ openclaw channels add --channel signal ยังรับ --signal-number <e164> สำหรับหมายเลขโทรศัพท์ของบอต รวมถึง --http-host <host> และ --http-port <port> สำหรับปลายทางดีมอน Signal (ค่าเริ่มต้น 127.0.0.1:8080)
เชื่อมโยงหรือลงทะเบียนบัญชี
ตรวจสอบและจับคู่
openclaw gateway call channels.status --params '{"probe":true}'ส่ง DM ครั้งแรกและอนุมัติการจับคู่: openclaw pairing approve signal <CODE>
การกำหนดค่าขั้นต่ำ:
{ channels: { signal: { enabled: true, account: "+15551234567", cliPath: "signal-cli", dmPolicy: "pairing", allowFrom: ["+15557654321"], }, },}| ฟิลด์ | คำอธิบาย |
|---|---|
account |
หมายเลขโทรศัพท์ของบอตในรูปแบบ E.164 (+15551234567) |
cliPath |
พาธไปยัง signal-cli (signal-cli หากอยู่ใน PATH) |
configPath |
ไดเรกทอรีการกำหนดค่า signal-cli ที่ส่งผ่านเป็น --config |
dmPolicy |
นโยบายการเข้าถึง DM (แนะนำ pairing) |
allowFrom |
หมายเลขโทรศัพท์หรือค่า uuid:<id> ที่อนุญาตให้ส่ง DM |
การรองรับหลายบัญชี: ใช้ channels.signal.accounts พร้อมการกำหนดค่ารายบัญชีและ name ซึ่งระบุหรือไม่ก็ได้ ดูรูปแบบที่ใช้ร่วมกันได้ที่ ช่องทางแบบหลายบัญชี
การทำงาน
- การกำหนดเส้นทางแบบตายตัว: การตอบกลับจะส่งกลับไปยัง Signal เสมอ
- DM ใช้เซสชันหลักของเอเจนต์ร่วมกัน ส่วนกลุ่มจะแยกจากกัน (
agent:<agentId>:signal:group:<groupId>) - โดยค่าเริ่มต้น Signal อาจเขียนการอัปเดตการกำหนดค่าที่ทริกเกอร์โดย
/config set|unset(ต้องใช้commands.config: true) ปิดใช้งานได้ด้วยchannels.signal.configWrites: false
เส้นทางการตั้งค่า A: เชื่อมโยงบัญชี Signal ที่มีอยู่ (QR)
- ติดตั้ง
signal-cli(บิลด์ JVM หรือแบบเนทีฟ) หรือให้openclaw channels addติดตั้งให้ - เชื่อมโยงบัญชีบอตด้วย
signal-cli link -n "OpenClaw"จากนั้นสแกน QR ใน Signal - กำหนดค่า Signal และเริ่ม Gateway
เส้นทางการตั้งค่า B: ลงทะเบียนหมายเลขบอตเฉพาะ (SMS, Linux)
ใช้วิธีนี้สำหรับหมายเลขบอตเฉพาะแทนการเชื่อมโยงบัญชีแอป Signal ที่มีอยู่ ขั้นตอนด้านล่างผ่านการทดสอบบน Ubuntu 24
- จัดหาหมายเลขที่รับ SMS ได้ (หรือรับการยืนยันด้วยเสียงสำหรับโทรศัพท์พื้นฐาน) หมายเลขบอตเฉพาะช่วยหลีกเลี่ยงความขัดแย้งของบัญชี/เซสชัน
- ติดตั้ง
signal-cliบนโฮสต์ Gateway:
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 /optsudo ln -sf /opt/signal-cli /usr/local/bin/signal-cli --versionหากใช้บิลด์ JVM (signal-cli-${VERSION}.tar.gz) ให้ติดตั้ง JRE ก่อน อัปเดต signal-cli ให้เป็นปัจจุบันอยู่เสมอ เนื่องจากต้นทางระบุว่ารีลีสเก่าอาจหยุดทำงานเมื่อ API ของเซิร์ฟเวอร์ Signal เปลี่ยนแปลง
- ลงทะเบียนและยืนยันหมายเลข:
signal-cli -a +<BOT_PHONE_NUMBER> registerหากต้องใช้ captcha (จำเป็นต้องเข้าถึงเบราว์เซอร์เพื่อทำขั้นตอนนี้ให้เสร็จ):
- เปิด
https://signalcaptchas.org/registration/generate.html - ทำ captcha ให้เสร็จ แล้วคัดลอกปลายทางลิงก์
signalcaptcha://...จาก "Open Signal" - หากเป็นไปได้ ให้เรียกใช้จาก IP ภายนอกเดียวกับเซสชันเบราว์เซอร์ (โทเค็น captcha หมดอายุอย่างรวดเร็ว)
- ลงทะเบียนและยืนยันทันที:
signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>'signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE>- กำหนดค่า OpenClaw รีสตาร์ต Gateway และตรวจสอบช่องทาง:
# หากเรียกใช้ Gateway เป็นบริการ systemd ระดับผู้ใช้:systemctl --user restart openclaw-gateway.service # จากนั้นตรวจสอบ:openclaw doctoropenclaw channels status --probe- จับคู่ผู้ส่ง DM:
- ส่งข้อความใดก็ได้ไปยังหมายเลขบอต
- อนุมัติบนเซิร์ฟเวอร์:
openclaw pairing approve signal <PAIRING_CODE> - บันทึกหมายเลขบอตเป็นรายชื่อติดต่อในโทรศัพท์เพื่อหลีกเลี่ยงข้อความ "Unknown contact"
ข้อมูลอ้างอิงจากต้นทาง:
- README ของ
signal-cli:https://github.com/AsamK/signal-cli - ขั้นตอน captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - ขั้นตอนการเชื่อมโยง:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
โหมดดีมอนภายนอก (httpUrl)
หากต้องการจัดการ signal-cli ด้วยตนเอง (การเริ่มต้น JVM แบบเย็นที่ช้า การเริ่มต้นคอนเทนเนอร์ หรือ CPU ที่ใช้ร่วมกัน) ให้เรียกใช้ดีมอนแยกต่างหากและกำหนดให้ OpenClaw เชื่อมต่อไปยังดีมอนนั้น:
{ channels: { signal: { httpUrl: "http://127.0.0.1:8080", autoStart: false, }, },}วิธีนี้จะข้ามการสร้างโปรเซสอัตโนมัติและการรอเริ่มต้นของ OpenClaw สำหรับการเริ่มต้นแบบสร้างโปรเซสอัตโนมัติที่ช้า ให้ตั้งค่า channels.signal.startupTimeoutMs
โหมดคอนเทนเนอร์ (bbernhard/signal-cli-rest-api)
แทนที่จะเรียกใช้ signal-cli แบบเนทีฟ ให้ใช้คอนเทนเนอร์ Docker bbernhard/signal-cli-rest-api ซึ่งครอบ signal-cli ไว้หลังอินเทอร์เฟซ REST + WebSocket
ข้อกำหนด:
- คอนเทนเนอร์ ต้อง ทำงานด้วย
MODE=json-rpcเพื่อรับข้อความแบบเรียลไทม์ - ลงทะเบียนหรือเชื่อมโยงบัญชี Signal ภายในคอนเทนเนอร์ก่อนเชื่อมต่อ OpenClaw
ตัวอย่างบริการ docker-compose.yml:
signal-cli: image: bbernhard/signal-cli-rest-api:latest environment: MODE: json-rpc ports: - "8080:8080" volumes: - signal-cli-data:/home/.local/share/signal-cliการกำหนดค่า OpenClaw:
{ channels: { signal: { enabled: true, account: "+15551234567", httpUrl: "http://signal-cli:8080", autoStart: false, apiMode: "container", // หรือ "auto" เพื่อตรวจหาโดยอัตโนมัติ }, },}apiMode ควบคุมโปรโตคอลที่ OpenClaw ใช้:
| ค่า | ลักษณะการทำงาน |
|---|---|
"auto" |
(ค่าเริ่มต้น) ตรวจสอบทรานสปอร์ตทั้งสองแบบ โดยการสตรีมจะตรวจสอบการรับผ่าน WebSocket ของคอนเทนเนอร์ |
"native" |
บังคับใช้ signal-cli แบบเนทีฟ (JSON-RPC ที่ /api/v1/rpc, SSE ที่ /api/v1/events) |
"container" |
บังคับใช้คอนเทนเนอร์ bbernhard (REST ที่ /v2/send, WebSocket ที่ /v1/receive/{account}) |
เมื่อ apiMode เป็น "auto" OpenClaw จะแคชโหมดที่ตรวจพบเป็นเวลา 30 วินาทีต่อ URL ของดีมอน เพื่อหลีกเลี่ยงการตรวจสอบซ้ำ (แบบเนทีฟมีลำดับความสำคัญเมื่อทรานสปอร์ตทั้งสองทำงานปกติ) ระบบจะเลือกการรับผ่านคอนเทนเนอร์สำหรับการสตรีมก็ต่อเมื่อ /v1/receive/{account} อัปเกรดเป็น WebSocket สำเร็จ ซึ่งต้องใช้ MODE=json-rpc
โหมดคอนเทนเนอร์รองรับการดำเนินการ Signal แบบเดียวกับโหมดเนทีฟ ในกรณีที่คอนเทนเนอร์เปิดเผย API ที่ตรงกัน ได้แก่ การส่ง การรับ ไฟล์แนบ ตัวบ่งชี้การพิมพ์ ใบตอบรับการอ่าน/การดู ปฏิกิริยา กลุ่ม และข้อความที่มีรูปแบบ OpenClaw จะแปลงการเรียก RPC แบบเนทีฟของ Signal เป็นเพย์โหลด REST ของคอนเทนเนอร์ รวมถึง ID กลุ่ม group.{base64(internal_id)} และ text_mode: "styled" สำหรับข้อความที่จัดรูปแบบ
หมายเหตุด้านการปฏิบัติงาน:
- ใช้
autoStart: falseกับโหมดคอนเทนเนอร์ OpenClaw ไม่ควรสร้างดีมอนแบบเนทีฟเมื่อเลือกapiMode: "container" - ใช้
MODE=json-rpcสำหรับการรับMODE=normalอาจทำให้/v1/aboutดูเหมือนทำงานปกติ แต่/v1/receive/{account}จะไม่อัปเกรดเป็น WebSocket ดังนั้น OpenClaw จะไม่เลือกการสตรีมการรับผ่านคอนเทนเนอร์ในโหมดauto - ตั้งค่า
apiMode: "container"เมื่อhttpUrlชี้ไปยัง REST API ของ bbernhard ตั้งค่า"native"เมื่อชี้ไปยัง JSON-RPC/SSE ของsignal-cliแบบเนทีฟ และตั้งค่า"auto"เมื่อการปรับใช้อาจแตกต่างกัน - การดาวน์โหลดไฟล์แนบในโหมดคอนเทนเนอร์ใช้ขีดจำกัดจำนวนไบต์ของสื่อเช่นเดียวกับโหมดเนทีฟ ระบบจะปฏิเสธการตอบกลับที่มีขนาดใหญ่เกินไปก่อนบัฟเฟอร์ครบทั้งหมดเมื่อเซิร์ฟเวอร์ส่ง
Content-Lengthและจะปฏิเสธระหว่างการสตรีมในกรณีอื่น
การควบคุมการเข้าถึง (DM + กลุ่ม)
DM:
- ค่าเริ่มต้น:
channels.signal.dmPolicy = "pairing" - ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่ โดยข้อความจะถูกเพิกเฉยจนกว่าจะได้รับการอนุมัติ (รหัสหมดอายุหลังจาก 1 ชั่วโมง)
- อนุมัติผ่าน
openclaw pairing list signalและopenclaw pairing approve signal <CODE> - การจับคู่เป็นการแลกเปลี่ยนโทเค็นเริ่มต้นสำหรับ DM ของ Signal ดูรายละเอียดที่ การจับคู่
- ผู้ส่งที่มีเฉพาะ UUID (จาก
sourceUuid) จะถูกจัดเก็บเป็นuuid:<id>ในchannels.signal.allowFrom
กลุ่ม:
channels.signal.groupPolicy = open | allowlist | disabledchannels.signal.groupAllowFromควบคุมว่ากลุ่มหรือผู้ส่งใดสามารถทริกเกอร์การตอบกลับในกลุ่มเมื่อตั้งค่าallowlistโดยรายการอาจเป็น ID กลุ่ม Signal (แบบดิบ,group:<id>หรือsignal:group:<id>) หมายเลขโทรศัพท์ของผู้ส่ง ค่าuuid:<id>หรือ*channels.signal.groups["<group-id>" | "*"]สามารถแทนที่ลักษณะการทำงานของกลุ่มด้วยrequireMention,toolsและtoolsBySender- ใช้
channels.signal.accounts.<id>.groupsสำหรับการแทนที่รายบัญชีในการตั้งค่าแบบหลายบัญชี - การเพิ่มกลุ่ม Signal ลงในรายการอนุญาตผ่าน
groupAllowFromไม่ได้ปิดการจำกัดด้วยการกล่าวถึงโดยอัตโนมัติ รายการchannels.signal.groups["<group-id>"]ที่กำหนดค่าไว้โดยเฉพาะจะประมวลผลทุกข้อความในกลุ่ม เว้นแต่จะตั้งค่าrequireMention=true - เมื่อใช้
requireMention=trueระบบจะจับคู่ @mentions แบบเนทีฟของ Signal จากเมทาดาทาการกล่าวถึงที่มีโครงสร้างกับหมายเลขโทรศัพท์หรือaccountUuidของบัญชีบอต ส่วนmentionPatternsที่กำหนดค่าไว้จะยังคงเป็นทางเลือกสำรองแบบข้อความล้วน - หมายเหตุขณะรันไทม์: หากไม่มี
channels.signalเลย รันไทม์จะใช้groupPolicy="allowlist"เป็นทางเลือกสำรองสำหรับการตรวจสอบกลุ่ม (แม้ว่าจะตั้งค่าchannels.defaults.groupPolicyไว้ก็ตาม)
กลุ่มที่จำกัดด้วยการกล่าวถึงและมีบริบทแบบจำกัด:
{ channels: { signal: { account: "+15551234567", accountUuid: "bot-signal-uuid", groupPolicy: "allowlist", groupAllowFrom: ["group:<signal-group-id>"], historyLimit: 8, groups: { "<signal-group-id>": { requireMention: true }, }, }, }, messages: { groupChat: { mentionPatterns: ["\\bopenclaw\\b"], }, },}ข้อความกลุ่มที่ได้รับอนุญาตแต่ไม่ได้กล่าวถึงบอตจะไม่มีการตอบสนอง และจะถูกเก็บไว้เฉพาะในหน้าต่างประวัติที่รอดำเนินการซึ่งมีขนาดจำกัด เมื่อมีการ @mention แบบเนทีฟหรือการกล่าวถึงด้วยข้อความสำรองในภายหลังกระตุ้นบอต OpenClaw จะรวมบริบทล่าสุดนั้นและตอบกลับไปยังกลุ่มเดิม เนื้อหาไฟล์แนบที่ข้ามจะไม่ถูกดาวน์โหลด แต่อาจปรากฏเป็นเพียงตัวยึดตำแหน่งสื่อแบบย่อในบริบทที่รอดำเนินการ
วิธีการทำงาน (ลักษณะการทำงาน)
- โหมดเนทีฟ:
signal-cliทำงานเป็นดีมอน โดย Gateway อ่านเหตุการณ์ผ่าน SSE - โหมดคอนเทนเนอร์: Gateway ส่งผ่าน REST API และรับผ่าน WebSocket
- ข้อความขาเข้าจะถูกปรับให้อยู่ในรูปแบบซองข้อมูลช่องทางที่ใช้ร่วมกัน
- การตอบกลับจะถูกส่งกลับไปยังหมายเลขหรือกลุ่มเดิมเสมอ
- การตอบกลับข้อความขาเข้าจะมีข้อมูลเมตาคำพูดอ้างอิงแบบเนทีฟของ Signal เมื่อแบ็กเอนด์ยอมรับการประทับเวลาขาเข้าและผู้เขียน หากข้อมูลเมตาคำพูดอ้างอิงหายไปหรือถูกปฏิเสธ OpenClaw จะส่งการตอบกลับเป็นข้อความปกติ
- กำหนดค่าการใช้คำพูดอ้างอิงแบบเนทีฟด้วย
channels.signal.replyToMode = off | first | all | batchedหรือchannels.signal.replyToModeByChatType.direct/groupสำหรับการแทนที่ตามประเภทแชท ค่าในระดับบัญชีภายใต้channels.signal.accounts.<id>มีลำดับความสำคัญสูงกว่า
สื่อและขีดจำกัด
- ข้อความขาออกจะถูกแบ่งเป็นส่วนตาม
channels.signal.textChunkLimit(ค่าเริ่มต้น 4000) - การแบ่งส่วนตามบรรทัดใหม่แบบเลือกได้: ตั้งค่า
channels.signal.streaming.chunkMode="newline"เพื่อแบ่งที่บรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนแบ่งตามความยาว - รองรับไฟล์แนบ (ดึงข้อมูล base64 จาก
signal-cli) - ไฟล์แนบบันทึกเสียงใช้ชื่อไฟล์
signal-cliเป็น MIME สำรองเมื่อไม่มีcontentTypeเพื่อให้การถอดเสียงยังสามารถจำแนกบันทึกเสียง AAC ได้ - ขีดจำกัดสื่อเริ่มต้น:
channels.signal.mediaMaxMb(ค่าเริ่มต้น 8) - ใช้
channels.signal.ignoreAttachmentsเพื่อข้ามการดาวน์โหลดสื่อ - บริบทประวัติกลุ่มใช้
channels.signal.historyLimit(หรือchannels.signal.accounts.*.historyLimit) และใช้messages.groupChat.historyLimitเป็นค่าสำรอง ตั้งค่า0เพื่อปิดใช้งาน (ค่าเริ่มต้น 50)
สถานะกำลังพิมพ์และใบตอบรับการอ่าน
- ตัวบ่งชี้สถานะกำลังพิมพ์: OpenClaw ส่งสัญญาณการพิมพ์ผ่าน
signal-cli sendTypingและรีเฟรชสัญญาณระหว่างที่กำลังสร้างคำตอบ - ใบตอบรับการอ่าน: เมื่อ
channels.signal.sendReadReceiptsเป็น true OpenClaw จะส่งต่อใบตอบรับการอ่านสำหรับ DM ที่ได้รับอนุญาต signal-cliไม่เปิดเผยใบตอบรับการอ่านสำหรับกลุ่ม
รีแอ็กชันสถานะวงจรชีวิต
ตั้งค่า messages.statusReactions.enabled: true เพื่อให้ Signal แสดงวงจรชีวิตรีแอ็กชัน queued/thinking/tool/compaction/done/error ที่ใช้ร่วมกันในรอบขาเข้า Signal ใช้การประทับเวลาของข้อความขาเข้าเป็นเป้าหมายรีแอ็กชัน ส่วนรีแอ็กชันกลุ่มจะส่งโดยใช้ ID กลุ่ม Signal พร้อมผู้ส่งเดิมเป็นผู้เขียนเป้าหมาย
รีแอ็กชันสถานะยังต้องมีรีแอ็กชันตอบรับและ messages.ackReactionScope ที่ตรงกัน (direct, group-all, group-mentions หรือ all) ตั้งค่า channels.signal.reactionLevel: "off" เพื่อปิดใช้งานรีแอ็กชันสถานะ Signal
messages.removeAckAfterReply: true จะล้างรีแอ็กชันสถานะสุดท้ายหลังจากระยะเวลาคงสถานะที่กำหนด มิฉะนั้น Signal จะคืนค่ารีแอ็กชันตอบรับเริ่มต้นหลังจากสถานะ done/error สุดท้าย
รีแอ็กชัน (เครื่องมือข้อความ)
ใช้ message action=react กับ channel=signal
- เป้าหมาย: E.164 หรือ UUID ของผู้ส่ง (ใช้
uuid:<id>จากผลลัพธ์การจับคู่ โดย UUID เดี่ยวก็ใช้ได้เช่นกัน) messageIdคือการประทับเวลา Signal ของข้อความที่ต้องการแสดงรีแอ็กชัน- รีแอ็กชันกลุ่มต้องใช้
targetAuthorหรือtargetAuthorUuid
message action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥message action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥 remove=truemessage action=react channel=signal target=signal:group:<groupId> targetAuthor=uuid:<sender-uuid> messageId=1737630212345 emoji=✅การกำหนดค่า:
channels.signal.actions.reactions: เปิด/ปิดการดำเนินการรีแอ็กชัน (ค่าเริ่มต้น true)channels.signal.reactionLevel:off | ack | minimal | extensive(ค่าเริ่มต้นminimal)off/ackปิดใช้งานรีแอ็กชันของเอเจนต์ (เครื่องมือข้อความreactจะแสดงข้อผิดพลาด)minimal/extensiveเปิดใช้งานรีแอ็กชันของเอเจนต์และกำหนดระดับคำแนะนำ
- การแทนที่รายบัญชี:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel
รีแอ็กชันการอนุมัติ
พรอมต์การอนุมัติ exec และ Plugin ของ Signal ใช้บล็อกการกำหนดเส้นทางระดับบนสุด approvals.exec และ approvals.plugin Signal ไม่มีบล็อก channels.signal.execApprovals
👍อนุมัติหนึ่งครั้ง👎ปฏิเสธ- ใช้
/approve <id> allow-alwaysเมื่อคำขอมีตัวเลือกการอนุมัติแบบถาวร
การตัดสินรีแอ็กชันการอนุมัติต้องมีผู้อนุมัติ Signal ที่ระบุอย่างชัดเจนจาก channels.signal.allowFrom, channels.signal.defaultTo หรือฟิลด์ระดับบัญชีที่ตรงกัน พรอมต์การอนุมัติ exec โดยตรงในแชทเดียวกันยังคงระงับ /approve สำรองในเครื่องที่ซ้ำกันได้โดยไม่ต้องมีผู้อนุมัติที่ระบุอย่างชัดเจน ส่วนการอนุมัติกลุ่มที่ไม่มีผู้อนุมัติจะยังแสดงตัวเลือกสำรองในเครื่อง
เป้าหมายการส่ง (CLI/cron)
- DM:
signal:+15551234567(หรือ E.164 ธรรมดา) - DM แบบ UUID:
uuid:<id>(หรือ UUID เดี่ยว) - กลุ่ม:
signal:group:<groupId> - ชื่อผู้ใช้:
username:<name>(หากบัญชี Signal รองรับ)
นามแฝง
กำหนดค่านามแฝงเพื่อใช้ชื่อคงที่กับเป้าหมาย Signal ที่ใช้ซ้ำ นามแฝงเป็นเพียงการกำหนดค่าฝั่ง OpenClaw เท่านั้น โดยจะไม่สร้างหรือแก้ไขรายชื่อติดต่อ Signal
{ channels: { signal: { aliases: { me: "+15557654321", jane: "uuid:123e4567-e89b-12d3-a456-426614174000", ops: "group:<groupId>", }, defaultTo: "signal:me", }, },}ใช้นามแฝงได้ทุกที่ที่ยอมรับเป้าหมายการส่ง Signal:
openclaw message send --channel signal --target signal:ops --message "การปรับใช้เสร็จสมบูรณ์แล้ว"นามแฝงรายบัญชีจะสืบทอดนามแฝงระดับบนสุด และสามารถเพิ่มหรือแทนที่ชื่อได้:
{ channels: { signal: { aliases: { me: "+15557654321", }, accounts: { work: { aliases: { ops: "group:<workGroupId>", }, }, }, }, },}openclaw directory peers list --channel signal และ openclaw directory groups list --channel signal แสดงนามแฝงที่กำหนดค่าไว้ ไดเรกทอรี Signal อ้างอิงจากการกำหนดค่า โดยจะไม่ค้นหารายชื่อติดต่อ Signal แบบสดหรือแก้ไขบัญชี Signal
การแก้ไขปัญหา
เรียกใช้ลำดับนี้ก่อน:
openclaw statusopenclaw gateway statusopenclaw logs --followopenclaw doctoropenclaw channels status --probeจากนั้นตรวจสอบสถานะการจับคู่ DM หากจำเป็น:
openclaw pairing list signalความล้มเหลวที่พบบ่อย:
- เข้าถึงดีมอนได้แต่ไม่มีการตอบกลับ: ตรวจสอบการตั้งค่าบัญชี/ดีมอน (
httpUrl,account) และโหมดรับ - DM ถูกละเว้น: ผู้ส่งกำลังรอการอนุมัติการจับคู่
- ข้อความกลุ่มถูกละเว้น: การคัดกรองผู้ส่ง/การกล่าวถึงของกลุ่มขัดขวางการส่ง
- เกิดข้อผิดพลาดในการตรวจสอบการกำหนดค่าหลังแก้ไข: เรียกใช้
openclaw doctor --fix - ไม่พบ Signal ในข้อมูลวินิจฉัย: ตรวจสอบ
channels.signal.enabled: true
การตรวจสอบเพิ่มเติม:
openclaw pairing list signalpgrep -af signal-cligrep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20สำหรับขั้นตอนการคัดแยกปัญหา โปรดดู การแก้ไขปัญหาช่องทาง
หมายเหตุด้านความปลอดภัย
signal-cliจัดเก็บคีย์บัญชีไว้ในเครื่อง (โดยทั่วไปคือ~/.local/share/signal-cli/data/)- สำรองสถานะบัญชี Signal ก่อนย้ายหรือสร้างเซิร์ฟเวอร์ใหม่
- คงค่า
channels.signal.dmPolicy: "pairing"ไว้ เว้นแต่ต้องการให้เข้าถึง DM ได้กว้างขึ้นโดยชัดแจ้ง - จำเป็นต้องยืนยันทาง SMS เฉพาะในขั้นตอนการลงทะเบียนหรือการกู้คืน แต่การสูญเสียการควบคุมหมายเลข/บัญชีอาจทำให้การลงทะเบียนใหม่ยุ่งยากขึ้น
ข้อมูลอ้างอิงการกำหนดค่า (Signal)
การกำหนดค่าทั้งหมด: การกำหนดค่า
ตัวเลือกผู้ให้บริการ:
channels.signal.enabled: เปิด/ปิดการเริ่มต้นช่องทางchannels.signal.apiMode:auto | native | container(ค่าเริ่มต้น: auto) ดู โหมดคอนเทนเนอร์channels.signal.account: E.164 สำหรับบัญชีบอตchannels.signal.accountUuid: UUID ของบัญชีบอตแบบเลือกได้ สำหรับการตรวจจับ @mention แบบเนทีฟและการป้องกันลูปchannels.signal.cliPath: พาธไปยังsignal-clichannels.signal.configPath: ไดเรกทอรีsignal-cli --configแบบเลือกได้channels.signal.httpUrl: URL ดีมอนแบบเต็ม (แทนที่โฮสต์/พอร์ต)channels.signal.httpHost,channels.signal.httpPort: ที่อยู่ผูกดีมอน (ค่าเริ่มต้น127.0.0.1:8080)channels.signal.autoStart: เริ่มดีมอนอัตโนมัติ (ค่าเริ่มต้น true หากไม่ได้ตั้งค่าhttpUrl)channels.signal.startupTimeoutMs: ระยะหมดเวลารอการเริ่มต้นเป็น ms (ต่ำสุด 1000, สูงสุด 120000; ค่าเริ่มต้น 30000)channels.signal.receiveMode:on-start | manualchannels.signal.ignoreAttachments: ข้ามการดาวน์โหลดไฟล์แนบchannels.signal.ignoreStories: ละเว้นสตอรีจากดีมอนchannels.signal.sendReadReceipts: ส่งต่อใบตอบรับการอ่านchannels.signal.dmPolicy:pairing | allowlist | open | disabled(ค่าเริ่มต้น: pairing)channels.signal.allowFrom: รายการอนุญาต DM (E.164 หรือuuid:<id>)openต้องใช้"*"Signal ไม่มีชื่อผู้ใช้ ให้ใช้ ID โทรศัพท์/UUIDchannels.signal.aliases: นามแฝงฝั่ง OpenClaw สำหรับเป้าหมายการส่ง DM หรือกลุ่มchannels.signal.groupPolicy:open | allowlist | disabled(ค่าเริ่มต้น: allowlist)channels.signal.groupAllowFrom: รายการอนุญาตกลุ่ม รองรับ ID กลุ่ม Signal (แบบดิบ,group:<id>หรือsignal:group:<id>), หมายเลข E.164 ของผู้ส่ง หรือค่าuuid:<id>channels.signal.groups: การแทนที่รายกลุ่มโดยใช้ ID กลุ่ม Signal (หรือ"*") เป็นคีย์ ฟิลด์ที่รองรับ:requireMention,tools,toolsBySenderchannels.signal.accounts.<id>.groups:channels.signal.groupsเวอร์ชันรายบัญชีสำหรับการตั้งค่าหลายบัญชีchannels.signal.accounts.<id>.aliases: นามแฝงรายบัญชี ซึ่งจะรวมกับนามแฝงระดับบนสุดchannels.signal.replyToMode: โหมดคำพูดอ้างอิงในการตอบกลับแบบเนทีฟoff | first | all | batched(ค่าเริ่มต้น:all)channels.signal.replyToModeByChatType.direct,channels.signal.replyToModeByChatType.group: การแทนที่คำพูดอ้างอิงในการตอบกลับแบบเนทีฟตามประเภทแชทchannels.signal.accounts.<id>.replyToMode,channels.signal.accounts.<id>.replyToModeByChatType.direct,channels.signal.accounts.<id>.replyToModeByChatType.group: การแทนที่คำพูดอ้างอิงในการตอบกลับรายบัญชีchannels.signal.historyLimit: จำนวนข้อความกลุ่มสูงสุดที่จะรวมเป็นบริบท (0 ปิดใช้งาน)channels.signal.dmHistoryLimit: ขีดจำกัดประวัติ DM ในหน่วยรอบข้อความของผู้ใช้ การแทนที่รายผู้ใช้:channels.signal.dms["<phone_or_uuid>"].historyLimitchannels.signal.textChunkLimit: ขนาดส่วนข้อความขาออกเป็นจำนวนอักขระ (ค่าเริ่มต้น 4000)channels.signal.streaming.chunkMode:length(ค่าเริ่มต้น) หรือnewlineเพื่อแบ่งที่บรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนแบ่งตามความยาวchannels.signal.mediaMaxMb: ขีดจำกัดสื่อขาเข้า/ขาออกเป็น MB (ค่าเริ่มต้น 8)channels.signal.reactionLevel:off | ack | minimal | extensive(ค่าเริ่มต้นminimal) ดู รีแอ็กชันchannels.signal.reactionNotifications:off | own | all | allowlist(ค่าเริ่มต้นown) - เวลาที่เอเจนต์ได้รับการแจ้งเตือนเกี่ยวกับรีแอ็กชันขาเข้าจากผู้อื่นchannels.signal.reactionAllowlist: ผู้ส่งที่รีแอ็กชันของพวกเขาจะแจ้งเตือนเอเจนต์เมื่อreactionNotifications: "allowlist"channels.signal.streaming.block.enabled,channels.signal.streaming.block.coalesce: ตัวควบคุมการสตรีมโหมดบล็อกที่ใช้ร่วมกันระหว่างช่องทาง ดู การสตรีม
ตัวเลือกส่วนกลางที่เกี่ยวข้อง:
agents.list[].groupChat.mentionPatterns(ข้อความสำรองแบบข้อความธรรมดา; ระบบจะตรวจจับการกล่าวถึงด้วย @ แบบเนทีฟของ Signal จากเมทาดาทาที่มีโครงสร้าง เมื่อกำหนดค่าอัตลักษณ์บัญชีบอตแล้ว)messages.groupChat.mentionPatterns(ข้อความสำรองส่วนกลาง)messages.responsePrefix.
ที่เกี่ยวข้อง
- ภาพรวมช่องทาง - ช่องทางทั้งหมดที่รองรับ
- การจับคู่ - การยืนยันตัวตนทาง DM และขั้นตอนการจับคู่
- กลุ่ม - ลักษณะการทำงานของแชตกลุ่มและการจำกัดด้วยการกล่าวถึง
- การกำหนดเส้นทางช่องทาง - การกำหนดเส้นทางเซสชันสำหรับข้อความ
- ความปลอดภัย - โมเดลการเข้าถึงและการเสริมความปลอดภัย