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 ส่วนตัวของคุณ จะทำให้บอตเพิกเฉยต่อข้อความของคุณเอง (การป้องกันลูป)
  • หากต้องการให้ "ฉันส่งข้อความหาบอตแล้วบอตตอบกลับ" ให้ใช้ หมายเลขบอตแยกต่างหาก

การติดตั้ง

bash
openclaw plugins install @openclaw/signal

ข้อกำหนด Plugin ที่ระบุเพียงชื่อจะลองค้นหาใน ClawHub ก่อน แล้วจึงใช้ npm เป็นทางเลือกสำรอง บังคับแหล่งที่มาด้วย openclaw plugins install clawhub:@openclaw/signal หรือ npm:@openclaw/signal คำสั่ง plugins install จะลงทะเบียนและเปิดใช้งาน Plugin จึงไม่ต้องมีขั้นตอน enable แยกต่างหาก ดูกฎการติดตั้งทั่วไปได้ที่ Plugin

การตั้งค่าอย่างรวดเร็ว

  • เลือกหมายเลข

    ใช้ หมายเลข Signal แยกต่างหาก สำหรับบอต (แนะนำ)

  • ติดตั้ง Plugin

    bash
    openclaw plugins install @openclaw/signal
  • เรียกใช้การตั้งค่าแบบมีคำแนะนำ

    bash
    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)

  • เชื่อมโยงหรือลงทะเบียนบัญชี

    • เชื่อมโยงด้วย QR (เร็วที่สุด): signal-cli link -n "OpenClaw" จากนั้นสแกนด้วย Signal ดูเส้นทาง A
    • ลงทะเบียนด้วย SMS: ใช้หมายเลขเฉพาะพร้อม captcha และการยืนยันทาง SMS ดูเส้นทาง B
  • ตรวจสอบและจับคู่

    bash
    openclaw gateway call channels.status --params '{"probe":true}'

    ส่ง DM ครั้งแรกและอนุมัติการจับคู่: openclaw pairing approve signal &lt;CODE&gt;

  • การกำหนดค่าขั้นต่ำ:

    json5
    {  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)

    1. ติดตั้ง signal-cli (บิลด์ JVM หรือแบบเนทีฟ) หรือให้ openclaw channels add ติดตั้งให้
    2. เชื่อมโยงบัญชีบอตด้วย signal-cli link -n "OpenClaw" จากนั้นสแกน QR ใน Signal
    3. กำหนดค่า Signal และเริ่ม Gateway

    เส้นทางการตั้งค่า B: ลงทะเบียนหมายเลขบอตเฉพาะ (SMS, Linux)

    ใช้วิธีนี้สำหรับหมายเลขบอตเฉพาะแทนการเชื่อมโยงบัญชีแอป Signal ที่มีอยู่ ขั้นตอนด้านล่างผ่านการทดสอบบน Ubuntu 24

    1. จัดหาหมายเลขที่รับ SMS ได้ (หรือรับการยืนยันด้วยเสียงสำหรับโทรศัพท์พื้นฐาน) หมายเลขบอตเฉพาะช่วยหลีกเลี่ยงความขัดแย้งของบัญชี/เซสชัน
    2. ติดตั้ง signal-cli บนโฮสต์ Gateway:
    bash
    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 เปลี่ยนแปลง

    1. ลงทะเบียนและยืนยันหมายเลข:
    bash
    signal-cli -a +&lt;BOT_PHONE_NUMBER&gt; register

    หากต้องใช้ captcha (จำเป็นต้องเข้าถึงเบราว์เซอร์เพื่อทำขั้นตอนนี้ให้เสร็จ):

    1. เปิด https://signalcaptchas.org/registration/generate.html
    2. ทำ captcha ให้เสร็จ แล้วคัดลอกปลายทางลิงก์ signalcaptcha://... จาก "Open Signal"
    3. หากเป็นไปได้ ให้เรียกใช้จาก IP ภายนอกเดียวกับเซสชันเบราว์เซอร์ (โทเค็น captcha หมดอายุอย่างรวดเร็ว)
    4. ลงทะเบียนและยืนยันทันที:
    bash
    signal-cli -a +&lt;BOT_PHONE_NUMBER&gt; register --captcha '&lt;SIGNALCAPTCHA_URL&gt;'signal-cli -a +&lt;BOT_PHONE_NUMBER&gt; verify &lt;VERIFICATION_CODE&gt;
    1. กำหนดค่า OpenClaw รีสตาร์ต Gateway และตรวจสอบช่องทาง:
    bash
    # หากเรียกใช้ Gateway เป็นบริการ systemd ระดับผู้ใช้:systemctl --user restart openclaw-gateway.service # จากนั้นตรวจสอบ:openclaw doctoropenclaw channels status --probe
    1. จับคู่ผู้ส่ง DM:
      • ส่งข้อความใดก็ได้ไปยังหมายเลขบอต
      • อนุมัติบนเซิร์ฟเวอร์: openclaw pairing approve signal &lt;PAIRING_CODE&gt;
      • บันทึกหมายเลขบอตเป็นรายชื่อติดต่อในโทรศัพท์เพื่อหลีกเลี่ยงข้อความ "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 เชื่อมต่อไปยังดีมอนนั้น:

    json5
    {  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:

    yaml
    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:

    json5
    {  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 &lt;CODE&gt;
    • การจับคู่เป็นการแลกเปลี่ยนโทเค็นเริ่มต้นสำหรับ DM ของ Signal ดูรายละเอียดที่ การจับคู่
    • ผู้ส่งที่มีเฉพาะ UUID (จาก sourceUuid) จะถูกจัดเก็บเป็น uuid:<id> ใน channels.signal.allowFrom

    กลุ่ม:

    • channels.signal.groupPolicy = open | allowlist | disabled
    • channels.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 ไว้ก็ตาม)

    กลุ่มที่จำกัดด้วยการกล่าวถึงและมีบริบทแบบจำกัด:

    json5
    {  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
    text
    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

    json5
    {  channels: {    signal: {      aliases: {        me: "+15557654321",        jane: "uuid:123e4567-e89b-12d3-a456-426614174000",        ops: "group:<groupId>",      },      defaultTo: "signal:me",    },  },}

    ใช้นามแฝงได้ทุกที่ที่ยอมรับเป้าหมายการส่ง Signal:

    bash
    openclaw message send --channel signal --target signal:ops --message "การปรับใช้เสร็จสมบูรณ์แล้ว"

    นามแฝงรายบัญชีจะสืบทอดนามแฝงระดับบนสุด และสามารถเพิ่มหรือแทนที่ชื่อได้:

    json5
    {  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

    การแก้ไขปัญหา

    เรียกใช้ลำดับนี้ก่อน:

    bash
    openclaw statusopenclaw gateway statusopenclaw logs --followopenclaw doctoropenclaw channels status --probe

    จากนั้นตรวจสอบสถานะการจับคู่ DM หากจำเป็น:

    bash
    openclaw pairing list signal

    ความล้มเหลวที่พบบ่อย:

    • เข้าถึงดีมอนได้แต่ไม่มีการตอบกลับ: ตรวจสอบการตั้งค่าบัญชี/ดีมอน (httpUrl, account) และโหมดรับ
    • DM ถูกละเว้น: ผู้ส่งกำลังรอการอนุมัติการจับคู่
    • ข้อความกลุ่มถูกละเว้น: การคัดกรองผู้ส่ง/การกล่าวถึงของกลุ่มขัดขวางการส่ง
    • เกิดข้อผิดพลาดในการตรวจสอบการกำหนดค่าหลังแก้ไข: เรียกใช้ openclaw doctor --fix
    • ไม่พบ Signal ในข้อมูลวินิจฉัย: ตรวจสอบ channels.signal.enabled: true

    การตรวจสอบเพิ่มเติม:

    bash
    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-cli
    • channels.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 | manual
    • channels.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 โทรศัพท์/UUID
    • channels.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, toolsBySender
    • channels.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>"].historyLimit
    • channels.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.

    ที่เกี่ยวข้อง

    Was this useful?
    On this page

    On this page