Signal (signal-cli)¶
สถานะ: การผสานรวม CLI ภายนอก สถานะ: การผสานรวม CLI ภายนอก Gateway สื่อสารกับ signal-cli ผ่าน HTTP JSON-RPC + SSE
Quick setup (beginner)¶
- ใช้ หมายเลข Signal แยกต่างหาก สำหรับบอต (แนะนำ)
- ติดตั้ง
signal-cli(ต้องใช้ Java) - เชื่อมโยงอุปกรณ์บอตและเริ่มเดมอน:
-
signal-cli link -n "OpenClaw" - กำหนดค่า OpenClaw และเริ่ม Gateway
คอนฟิกขั้นต่ำ:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
What it is¶
- ช่องทาง Signal ผ่าน
signal-cli(ไม่ใช่ libsignal แบบฝัง) - การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะย้อนกลับไปที่ Signal เสมอ
- DMs ใช้เซสชันหลักของเอเจนต์ร่วมกัน; กลุ่มถูกแยก (
agent:<agentId>:signal:group:<groupId>)
Config writes¶
ตามค่าเริ่มต้น Signal อนุญาตให้เขียนการอัปเดตคอนฟิกที่ถูกกระตุ้นโดย /config set|unset (ต้องใช้ commands.config: true)
ปิดการทำงานด้วย:
{
channels: { signal: { configWrites: false } },
}
The number model (important)¶
- Gateway เชื่อมต่อกับ อุปกรณ์ Signal (บัญชี
signal-cli) - หากรันบอตบน บัญชี Signal ส่วนตัวของคุณ ระบบจะเพิกเฉยต่อข้อความของคุณเอง (การป้องกันลูป)
- สำหรับรูปแบบ “ฉันส่งข้อความหาบอตแล้วบอตตอบกลับ” ให้ใช้ หมายเลขบอตแยกต่างหาก
Setup (fast path)¶
- ติดตั้ง
signal-cli(ต้องใช้ Java) - เชื่อมโยงบัญชีบอต:
-
signal-cli link -n "OpenClaw"แล้วสแกน QR ใน Signal - กำหนดค่า Signal และเริ่ม Gateway
ตัวอย่าง:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
การรองรับหลายบัญชี: ใช้ channels.signal.accounts พร้อมคอนฟิกต่อบัญชีและ name แบบไม่บังคับ ดู gateway/configuration สำหรับรูปแบบร่วมกัน อย่าคอมมิต ~/.openclaw/openclaw.json (มักมีโทเคน) รองรับหลายบัญชี: ใช้ channels.signal.accounts พร้อมคอนฟิกต่อบัญชีและ name แบบไม่บังคับ ดู gateway/configuration สำหรับรูปแบบที่ใช้ร่วมกัน
External daemon mode (httpUrl)¶
หากต้องการจัดการ signal-cli ด้วยตนเอง (การเริ่ม JVM ช้า, การเริ่มคอนเทนเนอร์, หรือ CPU ร่วม) ให้รันเดมอนแยกต่างหากและชี้ OpenClaw ไปยังมัน:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false,
},
},
}
การตั้งค่านี้จะข้ามการสร้างอัตโนมัติและการรอเริ่มต้นภายใน OpenClaw วิธีนี้จะข้ามการสปอว์นอัตโนมัติและการรอเริ่มต้นภายใน OpenClaw สำหรับการเริ่มช้าเมื่อสปอว์นอัตโนมัติ ให้ตั้งค่า channels.signal.startupTimeoutMs
Access control (DMs + groups)¶
DMs:
- ค่าเริ่มต้น:
channels.signal.dmPolicy = "pairing" - ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่; ข้อความจะถูกเพิกเฉยจนกว่าจะอนุมัติ (รหัสหมดอายุหลัง 1 ชั่วโมง)
- อนุมัติผ่าน:
openclaw pairing list signalopenclaw pairing approve signal <CODE>- การจับคู่เป็นการแลกเปลี่ยนโทเคนเริ่มต้นสำหรับ Signal DMs รายละเอียด: Pairing การจับคู่เป็นการแลกเปลี่ยนโทเคนเริ่มต้น รายละเอียด: Pairing
- ผู้ส่งแบบ UUID เท่านั้น (จาก
sourceUuid) จะถูกจัดเก็บเป็นuuid:<id>ในchannels.signal.allowFrom
Groups:
channels.signal.groupPolicy = open | allowlist | disabledchannels.signal.groupAllowFromควบคุมว่าใครสามารถกระตุ้นในกลุ่มเมื่อมีการตั้งค่าallowlist
How it works (behavior)¶
signal-cliทำงานเป็นเดมอน; Gateway อ่านอีเวนต์ผ่าน SSE- ข้อความขาเข้าถูกทำให้เป็นมาตรฐานเป็นซองช่องทางที่ใช้ร่วมกัน
- การตอบกลับจะถูกส่งกลับไปยังหมายเลขหรือกลุ่มเดิมเสมอ
Media + limits¶
- ข้อความขาออกถูกแบ่งเป็นชิ้นตาม
channels.signal.textChunkLimit(ค่าเริ่มต้น 4000) - การแบ่งตามบรรทัดใหม่แบบไม่บังคับ: ตั้งค่า
channels.signal.chunkMode="newline"เพื่อแบ่งตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนการแบ่งตามความยาว - รองรับไฟล์แนบ (base64 ดึงจาก
signal-cli) - ขีดจำกัดสื่อเริ่มต้น:
channels.signal.mediaMaxMb(ค่าเริ่มต้น 8) - ใช้
channels.signal.ignoreAttachmentsเพื่อข้ามการดาวน์โหลดสื่อ - บริบทประวัติกลุ่มใช้
channels.signal.historyLimit(หรือchannels.signal.accounts.*.historyLimit) และจะถอยกลับไปใช้messages.groupChat.historyLimitตั้งค่า0เพื่อปิด (ค่าเริ่มต้น 50) ตั้งค่า0เพื่อปิด (ค่าเริ่มต้น 50)
Typing + read receipts¶
- ตัวบ่งชี้การพิมพ์: OpenClaw ส่งสัญญาณการพิมพ์ผ่าน
signal-cli sendTypingและรีเฟรชระหว่างที่กำลังสร้างคำตอบ - ใบรับการอ่าน: เมื่อ
channels.signal.sendReadReceiptsเป็น true OpenClaw จะส่งต่อใบรับการอ่านสำหรับ DMs ที่ได้รับอนุญาต - signal-cli ไม่เปิดเผยใบรับการอ่านสำหรับกลุ่ม
Reactions (message tool)¶
- ใช้
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=true
message 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 | extensiveoff/ackปิดปฏิกิริยาของเอเจนต์ (เครื่องมือข้อความreactจะเกิดข้อผิดพลาด)minimal/extensiveเปิดปฏิกิริยาของเอเจนต์และตั้งค่าระดับคำแนะนำ- การเขียนทับต่อบัญชี:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel
Delivery targets (CLI/cron)¶
- DMs:
signal:+15551234567(หรือ E.164 แบบปกติ) - UUID DMs:
uuid:<id>(หรือ UUID เปล่า) - กลุ่ม:
signal:group:<groupId> - ชื่อผู้ใช้:
username:<name>(หากบัญชี Signal ของคุณรองรับ)
Troubleshooting¶
รันลำดับขั้นนี้ก่อน:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
จากนั้นยืนยันสถานะการจับคู่ DM หากจำเป็น:
openclaw pairing list signal
ความล้มเหลวที่พบบ่อย:
- เดมอนเข้าถึงได้แต่ไม่มีการตอบกลับ: ตรวจสอบการตั้งค่าบัญชี/เดมอน (
httpUrl,account) และโหมดรับ - DMs ถูกเพิกเฉย: ผู้ส่งกำลังรอการอนุมัติการจับคู่
- ข้อความกลุ่มถูกเพิกเฉย: การควบคุมผู้ส่ง/การกล่าวถึงของกลุ่มบล็อกการส่งมอบ
สำหรับโฟลว์การคัดแยก: /channels/troubleshooting
Configuration reference (Signal)¶
คอนฟิกเต็มรูปแบบ: Configuration
ตัวเลือกผู้ให้บริการ:
channels.signal.enabled: เปิด/ปิดการเริ่มต้นช่องทางchannels.signal.account: E.164 สำหรับบัญชีบอตchannels.signal.cliPath: พาธไปยังsignal-clichannels.signal.httpUrl: URL เดมอนแบบเต็ม (แทนที่โฮสต์/พอร์ต)channels.signal.httpHost,channels.signal.httpPort: การผูกเดมอน (ค่าเริ่มต้น 127.0.0.1:8080)channels.signal.autoStart: สปอว์นเดมอนอัตโนมัติ (ค่าเริ่มต้น true หากไม่ได้ตั้งค่าhttpUrl)channels.signal.startupTimeoutMs: เวลารอเริ่มต้นเป็นมิลลิวินาที (จำกัด 120000)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 allowlist (E.164 หรือuuid:<id>)openต้องใช้"*"Signal ไม่มีชื่อผู้ใช้; ใช้รหัสโทรศัพท์/UUIDopenต้องใช้"*". Signal ไม่มีชื่อผู้ใช้; ใช้รหัสโทรศัพท์/UUIDchannels.signal.groupPolicy:open | allowlist | disabled(ค่าเริ่มต้น: allowlist)channels.signal.groupAllowFrom: allowlist ผู้ส่งในกลุ่มchannels.signal.historyLimit: จำนวนข้อความกลุ่มสูงสุดที่จะรวมเป็นบริบท (ตั้ง 0 เพื่อปิด)channels.signal.dmHistoryLimit: ขีดจำกัดประวัติ DM เป็นจำนวนเทิร์นของผู้ใช้ การแทนที่ต่อผู้ใช้:channels.imessage.dms["<handle>"].historyLimitchannels.signal.dmHistoryLimit: ขีดจำกัดประวัติ DM ในรอบผู้ใช้ การเขียนทับต่อผู้ใช้:channels.signal.dms["<phone_or_uuid>"].historyLimitchannels.signal.textChunkLimit: ขนาดการแบ่งชิ้นขาออก (อักขระ)channels.signal.chunkMode:length(ค่าเริ่มต้น) หรือnewlineเพื่อแบ่งตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนการแบ่งตามความยาวchannels.signal.mediaMaxMb: ขีดจำกัดสื่อขาเข้า/ขาออก (MB)
ตัวเลือกส่วนกลางที่เกี่ยวข้อง:
agents.list[].groupChat.mentionPatterns(Signal ไม่รองรับการกล่าวถึงแบบเนทีฟ)messages.groupChat.mentionPatterns(ตัวสำรองส่วนกลาง)messages.responsePrefix