Mainstream messaging
สถานะ: พร้อมใช้งานจริงผ่าน WhatsApp Web (Baileys) โดย Gateway เป็นเจ้าของเซสชันที่เชื่อมโยงไว้ และไม่มีช่องทาง Twilio WhatsApp แยกต่างหาก
การติดตั้ง
openclaw onboard และ openclaw channels add --channel whatsapp จะแจ้งให้ติดตั้ง Plugin เมื่อเลือกเป็นครั้งแรก ส่วน openclaw channels login --channel whatsapp จะเสนอขั้นตอนการติดตั้งเดียวกันหากไม่มี Plugin เช็กเอาต์สำหรับการพัฒนาใช้พาธ Plugin ภายในเครื่อง ส่วนการติดตั้งรุ่น stable/beta จะติดตั้ง @openclaw/whatsapp จาก ClawHub ก่อน และใช้ npm เป็นทางเลือกสำรอง รันไทม์ WhatsApp จัดส่งแยกจากแพ็กเกจ npm หลักของ OpenClaw ดังนั้นการขึ้นต่อกันของรันไทม์จึงอยู่กับ Plugin ภายนอก การติดตั้งด้วยตนเอง:
openclaw plugins install clawhub:@openclaw/whatsappใช้แพ็กเกจ npm แบบไม่มีคำนำหน้า (@openclaw/whatsapp) สำหรับการใช้รีจิสทรีเป็นทางเลือกสำรองเท่านั้น และตรึงเวอร์ชันที่แน่นอนเฉพาะเมื่อต้องการให้การติดตั้งทำซ้ำได้
นโยบาย DM เริ่มต้นสำหรับผู้ส่งที่ไม่รู้จักคือการจับคู่
แนวทางวินิจฉัยและซ่อมแซมข้ามช่องทาง
รูปแบบและตัวอย่างการกำหนดค่าช่องทางอย่างครบถ้วน
การตั้งค่าด่วน
กำหนดค่านโยบายการเข้าถึง
{channels: {whatsapp: { dmPolicy: "pairing", allowFrom: ["+15551234567"], groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"],},},}เชื่อมโยง WhatsApp (QR)
openclaw channels login --channel whatsappการเข้าสู่ระบบทำได้ผ่าน QR เท่านั้น สำหรับโฮสต์ระยะไกลหรือแบบไม่มีหน้าจอ ให้เตรียมช่องทางที่เชื่อถือได้สำหรับส่ง QR ที่ยังใช้งานได้ไปยังโทรศัพท์ก่อนเริ่มเข้าสู่ระบบ เนื่องจาก QR ที่แสดงในเทอร์มินัล ภาพหน้าจอ หรือไฟล์แนบในแชตอาจหมดอายุระหว่างการส่ง
สำหรับบัญชีที่ระบุ:
openclaw channels login --channel whatsapp --account workหากต้องการแนบไดเรกทอรีการยืนยันตัวตนที่มีอยู่หรือกำหนดเองก่อนเข้าสู่ระบบ:
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-authopenclaw channels login --channel whatsapp --account workเริ่ม Gateway
openclaw gatewayอนุมัติคำขอจับคู่ครั้งแรก (โหมดจับคู่)
openclaw pairing list whatsappopenclaw pairing approve whatsapp <CODE>คำขอจับคู่จะหมดอายุหลังจาก 1 ชั่วโมง และจำกัดคำขอที่รอดำเนินการไว้ที่ 3 รายการต่อบัญชี
รูปแบบการปรับใช้
หมายเลขเฉพาะ (แนะนำ)
- ข้อมูลประจำตัว WhatsApp แยกต่างหากสำหรับ OpenClaw
- รายการอนุญาต DM และขอบเขตการกำหนดเส้นทางที่ชัดเจนขึ้น
- ลดโอกาสเกิดความสับสนจากการแชตกับตนเอง
{ channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551234567"], }, },}ทางเลือกสำรองด้วยหมายเลขส่วนตัว
การเริ่มต้นใช้งานรองรับโหมดหมายเลขส่วนตัวและเขียนค่าพื้นฐานที่เหมาะกับการแชตกับตนเอง ได้แก่ dmPolicy: "allowlist", allowFrom ซึ่งรวมหมายเลขของตนเอง และ selfChatMode: true การป้องกันการแชตกับตนเองในรันไทม์อ้างอิงจากหมายเลขของตนเองที่เชื่อมโยงไว้ร่วมกับ allowFrom
โมเดลรันไทม์
- Gateway เป็นเจ้าของซ็อกเก็ต WhatsApp และลูปการเชื่อมต่อใหม่
- ตัวเฝ้าระวังติดตามสัญญาณสองประเภทแยกจากกัน ได้แก่ กิจกรรมการรับส่งข้อมูลดิบของ WhatsApp Web และกิจกรรมข้อความของแอปพลิเคชัน เซสชันที่ไม่มีการใช้งานแต่ยังเชื่อมต่ออยู่จะไม่เริ่มใหม่เพียงเพราะไม่มีข้อความเข้ามาเมื่อเร็ว ๆ นี้ แต่จะบังคับให้เชื่อมต่อใหม่เฉพาะเมื่อไม่มีเฟรมการรับส่งข้อมูลเข้ามาภายในช่วงเวลาคงที่ภายในระบบ (ผู้ใช้กำหนดค่าไม่ได้) หรือไม่มีข้อความของแอปพลิเคชันเป็นเวลานานกว่า 4 เท่าของระยะหมดเวลาข้อความปกติ หลังเชื่อมต่อใหม่ทันทีสำหรับเซสชันที่เพิ่งมีการใช้งาน ช่วงเวลาแรกจะใช้ระยะหมดเวลาข้อความปกติที่สั้นกว่าแทนช่วงเวลา 4 เท่า OpenClaw สามารถตอบกลับข้อความออฟไลน์ที่ Baileys ส่งมาในช่วงต้นของการเชื่อมต่อใหม่นั้นโดยอัตโนมัติ ภายใต้ขอบเขตอายุการขจัดข้อความซ้ำตามรหัสข้อความขาเข้า ส่วนการเริ่มต้นครั้งแรกยังคงใช้การป้องกันประวัติเก่าด้วยช่วงเวลาสั้น
- การกำหนดเวลาของซ็อกเก็ต Baileys ระบุไว้อย่างชัดเจนภายใต้
web.whatsapp.*:keepAliveIntervalMs(ช่วงเวลาการ ping ของแอปพลิเคชัน),connectTimeoutMs(ระยะหมดเวลาของแฮนด์เชกขณะเปิด) และdefaultQueryTimeoutMs(การรอคิวรีของ Baileys รวมถึงระยะหมดเวลาการส่งขาออก/สถานะการแสดงตัวของ OpenClaw และระยะหมดเวลาการตอบรับการอ่านข้อความขาเข้า) - การส่งขาออกต้องมีตัวรับฟัง WhatsApp ที่ทำงานอยู่สำหรับบัญชีเป้าหมาย มิฉะนั้นการส่งจะล้มเหลวทันที
- การส่งไปยังกลุ่มจะแนบข้อมูลเมตาการกล่าวถึงแบบเนทีฟสำหรับโทเค็น
@+<digits>และ@<digits>(ในข้อความและคำบรรยายสื่อ) เมื่อโทเค็นตรงกับข้อมูลเมตาของผู้เข้าร่วมปัจจุบัน รวมถึงกลุ่มที่ใช้ LID - ระบบจะละเว้นแชตสถานะและบรอดแคสต์ (
@status,@broadcast) - แชตโดยตรงใช้กฎเซสชัน DM (
session.dmScope; ค่าเริ่มต้นmainจะรวม DM ไว้ในเซสชันหลักของเอเจนต์) เซสชันกลุ่มจะแยกตาม JID (agent:<agentId>:whatsapp:group:<jid>) - สามารถกำหนด WhatsApp Channels/Newsletters เป็นเป้าหมายขาออกโดยตรงผ่าน JID แบบเนทีฟ
@newsletterโดยใช้ข้อมูลเมตาเซสชันช่องทาง (agent:<agentId>:whatsapp:channel:<jid>) แทนความหมายแบบ DM - การรับส่งข้อมูล WhatsApp Web รองรับตัวแปรสภาพแวดล้อมพร็อกซีมาตรฐานบนโฮสต์ Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXYและรูปแบบตัวพิมพ์เล็ก) ควรใช้การกำหนดค่าพร็อกซีระดับโฮสต์แทนการตั้งค่ารายช่องทาง - เมื่อเปิดใช้
messages.removeAckAfterReplyOpenClaw จะล้างรีแอ็กชันตอบรับเมื่อส่งคำตอบที่มองเห็นได้สำเร็จแล้ว
โทรหาผู้ส่งคำขอปัจจุบันด้วย MeowCaller (ทดลอง)
Plugin สามารถเปิดให้ใช้ whatsapp_call ในเทิร์นของเอเจนต์ที่มาจาก WhatsApp โดยใช้ MeowCaller เพื่อโทรด้วยเสียงผ่าน WhatsApp ไปยังผู้ส่งคำขอปัจจุบันที่ได้รับอนุญาต และเล่นข้อความ TTS ของ OpenClaw หลังจากรับสาย เครื่องมือนี้ไม่มีพารามิเตอร์หมายเลขปลายทาง ดังนั้นพรอมต์จึงไม่สามารถเปลี่ยนเส้นทางสายได้ โดยปิดใช้งานเป็นค่าเริ่มต้น
เปิดใช้การโทรแบบทดลอง
เพิ่ม actions.calls: true ในการกำหนดค่าช่องทาง WhatsApp แล้วเริ่ม Gateway ใหม่:
{"channels": {"whatsapp": { "actions": { "calls": true }}}}หากไม่มีค่านี้หรือเป็น false OpenClaw จะไม่เปิดให้ใช้เครื่องมือ whatsapp_call
ติดตั้ง MeowCaller CLI ที่ผ่านการรีวิว
อะแดปเตอร์ต้องการไฟล์ปฏิบัติการ meowcaller ใน PATH ของโฮสต์ Gateway จนกว่า MeowCaller PR #7 จะผสานรวม ให้บิลด์แบรนช์ที่ผ่านการรีวิว:
git clone --branch feat/send-only-notify https://github.com/steipete/meowcaller.gitcd meowcallergit checkout 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3fmkdir -p "$HOME/.local/bin"go build -o "$HOME/.local/bin/meowcaller" ./cmd/meowcallerตรวจสอบให้แน่ใจว่า $HOME/.local/bin อยู่ใน PATH ของบริการ Gateway รีวิชันนี้มีคำสั่ง pair และคำสั่งส่งอย่างเดียว notify อย่างชัดเจน โดย notify จะไม่เปิดไมโครโฟน ลำโพง อุปกรณ์วิดีโอ หรือการบันทึกข้อมูลวินิจฉัย ห้ามใช้คำสั่ง play ของ CLI ตัวอย่างจากต้นทางแทน
จับคู่อุปกรณ์ที่เชื่อมโยงของ MeowCaller
ขอให้เอเจนต์ WhatsApp ตรวจสอบการตั้งค่าการโทร (การดำเนินการสถานะ whatsapp_call จะรายงานไดเรกทอรีสถานะเฉพาะบัญชีและคำสั่งจับคู่) สำหรับบัญชีเริ่มต้น:
state_dir="$HOME/.openclaw/credentials/whatsapp-calls/default"mkdir -p "$state_dir"chmod 700 "$state_dir"meowcaller pair --store "$state_dir/wa-voip.db"เรียกใช้แบบโต้ตอบ สแกน QR จาก WhatsApp > Linked devices และรอ MeowCaller linked device ready เก็บ wa-voip.db เป็นความลับ เนื่องจากเป็นเซสชัน MeowCaller บัญชีที่ไม่ใช่ค่าเริ่มต้นจะได้รับพาธที่เก็บของตนเองจากการดำเนินการสถานะ ส่วนบน Windows ให้เรียกใช้คำสั่ง PowerShell ที่ระบุ
กำหนดค่า TTS และโทรจาก WhatsApp
กำหนดค่า ผู้ให้บริการ TTS ที่รองรับโทรศัพท์ เริ่ม Gateway ใหม่ แล้วส่งคำขอ เช่น Call me and say the build finished. เครื่องมือจะระบุผู้ส่งจากบริบทขาเข้าที่เชื่อถือได้ สังเคราะห์ไฟล์ WAV ส่วนตัวชั่วคราว เรียกใช้ MeowCaller ภายในช่วงเวลาการโทรที่จำกัด และลบไฟล์เสียงหลังจากนั้น OpenClaw จะส่งที่เก็บของบัญชีอย่างชัดเจน รอสถานะออกเป็นศูนย์หลังการรับสาย/เล่นเสียง/วางสาย และถือว่าการหมดเวลาหรือสถานะออกที่ไม่ใช่ศูนย์เป็นการเรียกเครื่องมือที่ล้มเหลว
ข้อจำกัด: รองรับเฉพาะการโทรด้วยเสียงขาออกแบบหนึ่งต่อหนึ่ง ไม่มีหมายเลขปลายทางตามอำเภอใจ ไม่ใช้การยืนยันตัวตนร่วมกับการเชื่อมต่อแชต ไม่รองรับการโทรหาตนเองจากโหมดหมายเลขส่วนตัว/การแชตกับตนเอง จำกัดเสียงที่สังเคราะห์ไว้ที่ 60 วินาที ไม่มีการตอบรับว่าผู้ใช้ได้ยินเสียงทางโทรศัพท์นอกเหนือจากการเสร็จสิ้นขั้นตอนรับสาย/เล่นเสียง/วางสายของ MeowCaller และ OpenClaw จะหยุดกระบวนการร่วมหลังจากช่วงเวลาจำกัด 115-175 วินาที (ครอบคลุมขั้นตอนการเชื่อมต่อ การรับสาย การเล่นเสียง และการปิดระบบของ MeowCaller)
พรอมต์การอนุมัติ
WhatsApp สามารถแสดงพรอมต์การอนุมัติการดำเนินการและ Plugin เป็นรีแอ็กชัน 👍/👎 ซึ่งควบคุมด้วยการกำหนดค่าการส่งต่อการอนุมัติระดับบนสุด:
{ approvals: { exec: { enabled: true, mode: "session", }, plugin: { enabled: true, mode: "targets", targets: [{ channel: "whatsapp", to: "+15551234567" }], }, },}approvals.exec และ approvals.plugin เป็นอิสระจากกัน การเปิดใช้ WhatsApp เป็นช่องทางจะเพียงเชื่อมโยงการรับส่งข้อมูลและไม่ส่งสิ่งใด เว้นแต่จะเปิดใช้กลุ่มการอนุมัติที่ตรงกันและกำหนดเส้นทางมายังช่องทางนั้น โหมดเซสชันจะส่งการอนุมัติด้วยอีโมจิแบบเนทีฟเฉพาะสำหรับการอนุมัติที่มาจาก WhatsApp ส่วนโหมดเป้าหมายใช้ไปป์ไลน์การส่งต่อร่วมสำหรับเป้าหมายที่ระบุ และไม่สร้างการกระจาย DM ไปยังผู้อนุมัติแยกต่างหาก
รีแอ็กชันการอนุมัติของ WhatsApp ต้องระบุผู้อนุมัติอย่างชัดเจนใน allowFrom (หรือ "*") ส่วน defaultTo ใช้กำหนดเป้าหมายข้อความเริ่มต้นทั่วไป ไม่ใช่รายชื่อผู้อนุมัติ คำสั่ง /approve แบบดำเนินการด้วยตนเองยังคงต้องผ่านกระบวนการอนุญาตผู้ส่งตามปกติของ WhatsApp ก่อนประมวลผลการอนุมัติ
รีแอ็กชันสำหรับคำถาม
สำหรับพรอมต์ ask_user ที่มีคำถามแบบเลือกได้คำตอบเดียวซึ่งไม่เป็นความลับจำนวนหนึ่งคำถาม และมีตัวเลือกตั้งแต่หนึ่งถึงสี่ตัวเลือก WhatsApp จะแสดง 1️⃣ ถึง 4️⃣ ข้างป้ายกำกับตัวเลือก ให้รีแอ็กต์ต่อพรอมต์ที่ส่งมาด้วยหมายเลขที่ตรงกันเพื่อตอบ OpenClaw จะจับคู่หมายเลขกับตัวเลือกมาตรฐานผ่าน Gateway และจะละเว้นการแตะที่หมดอายุหรือซ้ำ พรอมต์แบบหลายคำถาม เลือกได้หลายคำตอบ และข้อความอิสระยังคงตอบได้ด้วยข้อความเท่านั้น กฎการรับ DM/กลุ่มตามปกติของ WhatsApp จะใช้อนุญาตผู้ส่งรีแอ็กชัน
ฮุกของ Plugin และความเป็นส่วนตัว
ข้อความ WhatsApp ขาเข้าอาจมีเนื้อหาส่วนบุคคล หมายเลขโทรศัพท์ ตัวระบุกลุ่ม ชื่อผู้ส่ง และฟิลด์เชื่อมโยงเซสชัน WhatsApp จะไม่เผยแพร่เพย์โหลดฮุก message_received ขาเข้าไปยัง Plugin เว้นแต่จะเลือกเข้าร่วม:
{ channels: { whatsapp: { pluginHooks: { messageReceived: true, }, }, },}จำกัดขอบเขตการเลือกเข้าร่วมไว้ที่หนึ่งบัญชีภายใต้ channels.whatsapp.accounts.<id>.pluginHooks.messageReceived เปิดใช้เฉพาะกับ Plugin ที่เชื่อถือให้เข้าถึงเนื้อหาและตัวระบุ WhatsApp ขาเข้าเท่านั้น
การควบคุมการเข้าถึงและการเปิดใช้งาน
นโยบาย DM
channels.whatsapp.dmPolicy:
| ค่า | ลักษณะการทำงาน |
|---|---|
pairing (ค่าเริ่มต้น) |
ผู้ส่งที่ไม่รู้จักส่งคำขอจับคู่ เจ้าของเป็นผู้อนุมัติ |
allowlist |
อนุญาตเฉพาะผู้ส่งใน allowFrom |
open |
กำหนดให้ allowFrom ต้องมี "*" |
disabled |
บล็อก DM ทั้งหมด |
allowFrom ยอมรับหมายเลขรูปแบบ E.164 (ปรับให้อยู่ในรูปแบบมาตรฐานภายใน) รายการนี้เป็นเพียงรายการควบคุมการเข้าถึงของผู้ส่ง DM เท่านั้น — ไม่ได้จำกัดการส่งออกที่ระบุอย่างชัดเจนไปยัง JID ของกลุ่มหรือ JID ของช่องทาง @newsletter
การแทนที่สำหรับหลายบัญชี: channels.whatsapp.accounts.<id>.dmPolicy (และ .allowFrom) มีลำดับความสำคัญเหนือค่าเริ่มต้นระดับช่องทางสำหรับบัญชีนั้น
หมายเหตุเกี่ยวกับรันไทม์:
- การจับคู่จะคงอยู่ในที่เก็บรายการอนุญาตของช่องทางและรวมเข้ากับ
allowFromที่กำหนดค่าไว้ - ระบบอัตโนมัติตามกำหนดเวลาและการใช้ผู้รับสำรองของ Heartbeat จะใช้เป้าหมายการส่งที่ระบุอย่างชัดเจนหรือ
allowFromที่กำหนดค่าไว้ การอนุมัติการจับคู่ DM ไม่ได้ทำให้ผู้ส่งนั้นเป็นผู้รับ Cron/Heartbeat โดยอัตโนมัติ - หากไม่ได้กำหนดค่ารายการอนุญาต ระบบจะอนุญาตหมายเลขของตนเองที่เชื่อมโยงไว้โดยค่าเริ่มต้น
- OpenClaw จะไม่จับคู่ DM ขาออกของ
fromMeโดยอัตโนมัติ (ข้อความที่คุณส่งถึงตัวเองจากอุปกรณ์ที่เชื่อมโยง)
นโยบายกลุ่มและรายการอนุญาต
การเข้าถึงกลุ่มมีสองชั้น:
- รายการอนุญาตสมาชิกกลุ่ม (
channels.whatsapp.groups): หากละเว้นgroupsทุกกลุ่มจะมีสิทธิ์ใช้งาน หากระบุไว้ ค่านี้จะทำหน้าที่เป็นรายการอนุญาตกลุ่ม ("*"อนุญาตทั้งหมด) - นโยบายผู้ส่งในกลุ่ม (
channels.whatsapp.groupPolicy+groupAllowFrom):openข้ามรายการอนุญาตผู้ส่ง,allowlistกำหนดให้ต้องตรงกับgroupAllowFrom(หรือ*) และdisabledบล็อกข้อความขาเข้าจากกลุ่มทั้งหมด
หากไม่ได้ตั้งค่า groupAllowFrom การตรวจสอบผู้ส่งจะใช้ allowFrom เป็นค่าทดแทนเมื่อมีรายการอยู่ ระบบจะประเมินรายการอนุญาตผู้ส่งก่อนการเปิดใช้งานด้วยการกล่าวถึง/การตอบกลับ
หากไม่มีบล็อก channels.whatsapp อยู่เลย รันไทม์จะใช้ groupPolicy: "allowlist" เป็นค่าทดแทน (พร้อมบันทึกคำเตือน) แม้ว่า channels.defaults.groupPolicy จะถูกตั้งเป็นค่าอื่นก็ตาม
การกล่าวถึงและ /activation
โดยค่าเริ่มต้น การตอบกลับในกลุ่มต้องมีการกล่าวถึง การตรวจจับการกล่าวถึงครอบคลุมถึง:
- การกล่าวถึงตัวตนบอตอย่างชัดเจนใน WhatsApp
- รูปแบบนิพจน์ทั่วไปสำหรับการกล่าวถึงที่กำหนดค่าไว้ (
agents.list[].groupChat.mentionPatterns, ใช้messages.groupChat.mentionPatternsเป็นค่าทดแทน) - ข้อความถอดเสียงจากบันทึกเสียงขาเข้าสำหรับข้อความกลุ่มที่ได้รับอนุญาต
- การตรวจจับการตอบกลับถึงบอตโดยนัย (ผู้ส่งที่ตอบกลับตรงกับตัวตนบอต)
ความปลอดภัย: การอ้างข้อความ/ตอบกลับทำให้ผ่านเพียงเงื่อนไขการกล่าวถึงเท่านั้น — ไม่ได้ ให้สิทธิ์แก่ผู้ส่ง เมื่อใช้ groupPolicy: "allowlist" ผู้ส่งที่ไม่อยู่ในรายการอนุญาตจะยังคงถูกบล็อก แม้จะตอบกลับข้อความของผู้ใช้ที่อยู่ในรายการอนุญาตก็ตาม
คำสั่งเปิดใช้งานระดับเซสชัน: /activation mention หรือ /activation always คำสั่งนี้อัปเดตสถานะเซสชัน (ไม่ใช่การกำหนดค่าส่วนกลาง) และจำกัดให้เจ้าของเป็นผู้ใช้งาน
การเชื่อมโยง ACP ที่กำหนดค่าไว้
WhatsApp รองรับการเชื่อมโยง ACP แบบถาวรผ่าน bindings[] ระดับบนสุด:
{ bindings: [ { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "direct", id: "+15555550123" }, }, }, { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "group", id: "120363424282127706@g.us" }, }, }, ],}แชตโดยตรงจะจับคู่กับหมายเลข E.164 ส่วนกลุ่มจะจับคู่กับ JID กลุ่มของ WhatsApp รายการอนุญาตกลุ่ม นโยบายผู้ส่ง และเงื่อนไขการกล่าวถึง/การเปิดใช้งานจะทำงานก่อนที่ OpenClaw จะตรวจสอบว่าเซสชัน ACP ที่เชื่อมโยงมีอยู่ การเชื่อมโยงที่ตรงกันจะเป็นเจ้าของเส้นทาง — กลุ่มบรอดแคสต์จะไม่กระจายรอบการทำงานนั้นไปยังเซสชัน WhatsApp ทั่วไป
ลักษณะการทำงานของหมายเลขส่วนบุคคลและแชตกับตนเอง
เมื่อหมายเลขของตนเองที่เชื่อมโยงอยู่ใน allowFrom ด้วย มาตรการป้องกันสำหรับแชตกับตนเองจะทำงาน: ข้ามการตอบรับว่าอ่านแล้วสำหรับรอบการทำงานของแชตกับตนเอง เพิกเฉยต่อพฤติกรรมทริกเกอร์อัตโนมัติจาก JID ที่กล่าวถึงซึ่งจะส่งการแจ้งเตือนถึงตัวคุณเอง และตั้งค่าเริ่มต้นของการตอบกลับเป็น [{identity.name}] (หรือ [openclaw]) เมื่อไม่ได้ตั้งค่า messages.responsePrefix
การปรับข้อความให้อยู่ในรูปแบบมาตรฐานและบริบท
เอนเวโลปขาเข้าและบริบทการตอบกลับ
ข้อความขาเข้าจะถูกห่อด้วยเอนเวโลปขาเข้าที่ใช้ร่วมกัน การตอบกลับที่อ้างข้อความจะเพิ่มบริบทในรูปแบบนี้:
[Replying to <sender> id:<stanzaId>]<quoted body or media placeholder>[/Replying]ระบบจะเติมข้อมูลเมตาของการตอบกลับ (ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 ของผู้ส่ง) เมื่อมีข้อมูล หากเป้าหมายที่อ้างถึงเป็นสื่อที่ดาวน์โหลดได้ OpenClaw จะบันทึกผ่านที่เก็บสื่อขาเข้าตามปกติและเปิดเผย MediaPath/MediaType เพื่อให้เอเจนต์ตรวจสอบได้โดยตรง แทนที่จะเห็นเพียง <media:image>
ตัวยึดตำแหน่งสื่อและการแยกตำแหน่งที่ตั้ง/ผู้ติดต่อ
ข้อความที่มีเฉพาะสื่อจะถูกปรับให้อยู่ในรูปตัวยึดตำแหน่ง: <media:image>, <media:video>, <media:audio>, <media:document>, <media:sticker>
ระบบจะถอดเสียงบันทึกเสียงของกลุ่มที่ได้รับอนุญาตก่อนตรวจสอบเงื่อนไขการกล่าวถึงเมื่อเนื้อหามีเพียง <media:audio> ดังนั้นการกล่าวถึงบอตในบันทึกเสียงจึงสามารถทริกเกอร์การตอบกลับได้ หากข้อความถอดเสียงยังไม่ได้กล่าวถึงบอต ข้อความดังกล่าวจะอยู่ในประวัติกลุ่มที่รอดำเนินการแทนตัวยึดตำแหน่งดิบ
เนื้อหาตำแหน่งที่ตั้งจะแสดงเป็นข้อความพิกัดแบบกระชับ ป้ายกำกับ/ความคิดเห็นของตำแหน่งที่ตั้งและรายละเอียดผู้ติดต่อ/vCard จะแสดงเป็นข้อมูลเมตาที่ไม่น่าเชื่อถือภายในกรอบ ไม่ใช่ข้อความพรอมต์แบบอินไลน์
การแทรกประวัติกลุ่มที่รอดำเนินการ
ข้อความกลุ่มที่ยังไม่ได้ประมวลผลจะถูกบัฟเฟอร์และแทรกเป็นบริบทเมื่อบอตถูกทริกเกอร์ในที่สุด
- ขีดจำกัดเริ่มต้น:
50 - การกำหนดค่า:
channels.whatsapp.historyLimit, ใช้messages.groupChat.historyLimitเป็นค่าทดแทน 0ปิดใช้งาน
เครื่องหมายการแทรก: [Chat messages since your last reply - for context] และ [Current message - respond to this]
การตอบรับว่าอ่านแล้ว
เปิดใช้งานโดยค่าเริ่มต้นสำหรับข้อความขาเข้าที่ได้รับการยอมรับ ปิดใช้งานทั้งหมด:
{ channels: { whatsapp: { sendReadReceipts: false } } }การแทนที่ต่อบัญชี: channels.whatsapp.accounts.<id>.sendReadReceipts รอบการทำงานของแชตกับตนเองจะข้ามการตอบรับว่าอ่านแล้วแม้จะเปิดใช้งานทั้งหมดอยู่ก็ตาม
การส่ง การแบ่งส่วน และสื่อ
การแบ่งข้อความเป็นส่วน
- ขีดจำกัดส่วนเริ่มต้น:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.streaming.chunkMode = "length" | "newline";newlineให้ความสำคัญกับขอบเขตย่อหน้า (บรรทัดว่าง) แล้วจึงใช้การแบ่งส่วนตามความยาวที่ปลอดภัยเป็นค่าทดแทน
ลักษณะการทำงานของสื่อขาออก
- รองรับเพย์โหลดรูปภาพ วิดีโอ เสียง (บันทึกเสียง PTT) และเอกสาร
- เสียงจะถูกส่งเป็นเพย์โหลด
audioของ Baileys พร้อมptt: trueโดยแสดงผลเป็นบันทึกเสียงแบบกดเพื่อพูด ระบบจะคงaudioAsVoiceไว้ในเพย์โหลดการตอบกลับ เพื่อให้เอาต์พุตบันทึกเสียง TTS ใช้เส้นทางนี้ต่อไปโดยไม่ขึ้นกับรูปแบบต้นทางของผู้ให้บริการ - เสียง Ogg/Opus แบบเนทีฟจะส่งเป็น
audio/ogg; codecs=opusส่วนรูปแบบอื่นทั้งหมด (รวมถึงเอาต์พุต MP3/WebM จาก TTS ของ Microsoft Edge) จะถูกแปลงด้วยffmpegเป็น Ogg/Opus โมโน 48 kHz ก่อนส่งแบบ PTT /tts latestจะส่งคำตอบล่าสุดของผู้ช่วยเป็นบันทึกเสียงหนึ่งรายการและระงับการส่งซ้ำสำหรับคำตอบเดียวกัน ส่วน/tts chat on|off|defaultควบคุม TTS อัตโนมัติสำหรับแชตปัจจุบัน- การใช้
gifPlayback: trueในการส่งวิดีโอจะเปิดใช้งานการเล่น GIF แบบเคลื่อนไหว forceDocument/asDocumentกำหนดเส้นทางรูปภาพ GIF และวิดีโอขาออกผ่านเพย์โหลดเอกสารของ Baileys เพื่อหลีกเลี่ยงการบีบอัดสื่อของ WhatsApp โดยคงชื่อไฟล์และชนิด MIME ที่แก้ไขแล้วไว้- คำบรรยายจะใช้กับสื่อรายการแรกในการตอบกลับที่มีหลายสื่อ ยกเว้นบันทึกเสียง PTT: ระบบจะส่งเสียงก่อนโดยไม่มีคำบรรยาย แล้วส่งคำบรรยายเป็นข้อความแยกต่างหาก (ไคลเอนต์ WhatsApp แสดงคำบรรยายบันทึกเสียงไม่สม่ำเสมอ)
- แหล่งสื่อสามารถเป็น HTTP(S),
file://หรือพาธในเครื่อง
ขีดจำกัดขนาดสื่อและลักษณะการทำงานเมื่อใช้ค่าทดแทน
- ขีดจำกัดการบันทึกขาเข้าและการส่งขาออก:
channels.whatsapp.mediaMaxMb(ค่าเริ่มต้น50) - การแทนที่ต่อบัญชี:
channels.whatsapp.accounts.<id>.mediaMaxMb - ระบบจะปรับรูปภาพให้เหมาะสมโดยอัตโนมัติ (ปรับขนาด/ไล่ระดับคุณภาพ) ให้พอดีกับขีดจำกัด เว้นแต่
forceDocument/asDocumentจะร้องขอการส่งแบบเอกสาร - เมื่อส่งสื่อล้มเหลว ค่าทดแทนสำหรับรายการแรกจะส่งคำเตือนแบบข้อความแทนการละทิ้งคำตอบโดยไม่แจ้งให้ทราบ
การอ้างข้อความในการตอบกลับ
channels.whatsapp.replyToMode ควบคุมการอ้างข้อความแบบเนทีฟในการตอบกลับ (การตอบกลับขาออกจะแสดงการอ้างข้อความขาเข้า):
| ค่า | ลักษณะการทำงาน |
|---|---|
"off" (ค่าเริ่มต้น) |
ไม่อ้างข้อความ ส่งเป็นข้อความธรรมดา |
"first" |
อ้างเฉพาะส่วนแรกของการตอบกลับขาออก |
"all" |
อ้างทุกส่วนของการตอบกลับขาออก |
"batched" |
อ้างข้อความในการตอบกลับแบบแบตช์ที่อยู่ในคิว และไม่อ้างข้อความในการตอบกลับทันที |
การแทนที่ต่อบัญชี: channels.whatsapp.accounts.<id>.replyToMode
{ channels: { whatsapp: { replyToMode: "first" } } }ระดับปฏิกิริยา
channels.whatsapp.reactionLevel ควบคุมขอบเขตการใช้ปฏิกิริยาอีโมจิของเอเจนต์:
| ระดับ | ปฏิกิริยาตอบรับ | ปฏิกิริยาที่เอเจนต์เป็นผู้เริ่ม |
|---|---|---|
"off" |
ไม่ | ไม่ |
"ack" |
ใช่ | ไม่ |
"minimal" (ค่าเริ่มต้น) |
ใช่ | ใช่ แนวทางแบบระมัดระวัง |
"extensive" |
ใช่ | ใช่ แนวทางแบบสนับสนุน |
การแทนที่ต่อบัญชี: channels.whatsapp.accounts.<id>.reactionLevel
{ channels: { whatsapp: { reactionLevel: "ack" } } }ปฏิกิริยาตอบรับ
channels.whatsapp.ackReaction ส่งปฏิกิริยาทันทีเมื่อได้รับข้อความขาเข้า โดยมี reactionLevel เป็นเงื่อนไข (ระงับเมื่อ "off"):
{ channels: { whatsapp: { ackReaction: { emoji: "👀", direct: true, group: "mentions", // always | mentions | never }, }, },}หมายเหตุ: ส่งทันทีหลังจากยอมรับข้อความขาเข้า (ก่อนตอบกลับ) หากมี ackReaction แต่ไม่มี emoji WhatsApp จะใช้อีโมจิตัวตนของเอเจนต์ที่รับเส้นทาง โดยใช้ "👀" เป็นค่าทดแทน (ละเว้น ackReaction หรือตั้งค่า emoji: "" เพื่อไม่ให้มีการตอบรับ) ระบบจะบันทึกความล้มเหลวแต่จะไม่ขัดขวางการส่งคำตอบ โหมดกลุ่ม mentions จะตอบสนองเฉพาะรอบการทำงานที่ถูกทริกเกอร์ด้วยการกล่าวถึง ขณะที่การเปิดใช้งานกลุ่ม always จะข้ามการตรวจสอบดังกล่าว WhatsApp ใช้เฉพาะ channels.whatsapp.ackReaction เท่านั้น (messages.ackReaction แบบเดิมไม่มีผลในส่วนนี้)
ปฏิกิริยาสถานะวงจรชีวิต
ตั้งค่า messages.statusReactions.enabled: true เพื่อให้ WhatsApp แทนที่ปฏิกิริยาตอบรับระหว่างรอบการทำงาน แทนการคงอีโมจิรับข้อความแบบคงที่ โดยวนผ่านสถานะต่าง ๆ เช่น อยู่ในคิว กำลังคิด กิจกรรมของเครื่องมือ Compaction เสร็จสิ้น และข้อผิดพลาด:
{ messages: { statusReactions: { enabled: true, emojis: { deploy: "🛫", build: "🏗️", concierge: "💁", }, }, },}หมายเหตุ: channels.whatsapp.ackReaction ยังคงควบคุมสิทธิ์การใช้งานสำหรับข้อความส่วนตัวและกลุ่ม สถานะที่อยู่ในคิวใช้อีโมจิที่มีผลเหมือนกับปฏิกิริยาตอบรับแบบธรรมดา WhatsApp มีช่องปฏิกิริยาของบอตหนึ่งช่องต่อข้อความ ดังนั้นการอัปเดตวงจรชีวิตจะแทนที่ปฏิกิริยาปัจจุบันในตำแหน่งเดิม messages.removeAckAfterReply: true จะล้างปฏิกิริยาสถานะสุดท้ายหลังจากระยะเวลาคงสถานะเสร็จสิ้น/ข้อผิดพลาดที่กำหนดไว้ หมวดหมู่อีโมจิของเครื่องมือประกอบด้วย tool, coding, web, deploy, build และ concierge
หลายบัญชีและข้อมูลประจำตัว
การเลือกบัญชีและค่าเริ่มต้น
ID บัญชีมาจาก channels.whatsapp.accounts การเลือกบัญชีเริ่มต้นใช้ default หากมี มิฉะนั้นจะใช้ ID บัญชีแรกที่กำหนดค่าไว้ (เรียงตามตัวอักษร) ระบบจะปรับ ID บัญชีให้อยู่ในรูปแบบมาตรฐานภายในเพื่อใช้ค้นหา
พาธข้อมูลประจำตัวและความเข้ากันได้กับระบบเดิม
- พาธการยืนยันตัวตนปัจจุบัน:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json(ข้อมูลสำรอง:creds.json.bak) - ระบบยังคงรู้จัก/ย้ายข้อมูลการยืนยันตัวตนเริ่มต้นแบบเดิมใน
~/.openclaw/credentials/สำหรับขั้นตอนของบัญชีเริ่มต้น
ลักษณะการทำงานเมื่อออกจากระบบ
openclaw channels logout --channel whatsapp [--account <id>] จะล้างสถานะการยืนยันตัวตน WhatsApp ของบัญชีนั้น เมื่อสามารถเข้าถึง Gateway ได้ การออกจากระบบจะหยุดตัวรับฟังที่ทำงานอยู่ของบัญชีนั้นก่อน เพื่อให้เซสชันที่เชื่อมโยงหยุดรับข้อความก่อนการเริ่มระบบครั้งถัดไป openclaw channels remove --channel whatsapp จะหยุดตัวรับฟังที่ทำงานอยู่ก่อนปิดใช้งานหรือลบการกำหนดค่าบัญชีด้วย
ในไดเรกทอรีการยืนยันตัวตนแบบเดิม ระบบจะเก็บ oauth.json ไว้ขณะลบไฟล์การยืนยันตัวตนของ Baileys
เครื่องมือ การดำเนินการ และการเขียนการกำหนดค่า
- การรองรับเครื่องมือของเอเจนต์รวมถึงการดำเนินการปฏิกิริยาของ WhatsApp (
react) - เงื่อนไขเปิดใช้การดำเนินการ:
channels.whatsapp.actions.reactions,channels.whatsapp.actions.polls(การดำเนินการที่มีอยู่มีค่าเริ่มต้นเป็นtrue),channels.whatsapp.actions.calls(ค่าเริ่มต้นfalseโปรดดู MeowCaller ด้านบน) - การเขียนการกำหนดค่าที่เริ่มต้นโดยช่องทางเปิดใช้งานเป็นค่าเริ่มต้น ปิดใช้งานผ่าน
channels.whatsapp.configWrites: false
การแก้ไขปัญหา
ยังไม่ได้เชื่อมโยง (ต้องใช้ QR)
อาการ: สถานะช่องทางรายงานว่ายังไม่ได้เชื่อมโยง
openclaw channels login --channel whatsappopenclaw channels statusเชื่อมโยงแล้วแต่ตัดการเชื่อมต่อ / วนเชื่อมต่อใหม่
อาการ: บัญชีที่เชื่อมโยงแล้วตัดการเชื่อมต่อหรือพยายามเชื่อมต่อใหม่ซ้ำ ๆ
บัญชีที่ไม่ค่อยมีการใช้งานสามารถคงการเชื่อมต่อเกินระยะหมดเวลาข้อความปกติได้ watchdog จะเริ่มใหม่เฉพาะเมื่อกิจกรรมการรับส่งข้อมูลของ WhatsApp Web หยุดลง ซ็อกเก็ตปิด หรือกิจกรรมระดับแอปพลิเคชันเงียบเกินช่วงเวลาความปลอดภัยที่ยาวกว่า (โปรดดูโมเดลรันไทม์ด้านบน)
หากบันทึกแสดง status=408 Request Time-out Connection was lost ซ้ำ ๆ ให้ปรับช่วงเวลาซ็อกเก็ตของ Baileys ภายใต้ web.whatsapp เริ่มต้นโดยลด keepAliveIntervalMs ให้ต่ำกว่าระยะหมดเวลาขณะไม่ได้ใช้งานของเครือข่าย และเพิ่ม connectTimeoutMs สำหรับการเชื่อมต่อที่ช้าหรือมีการสูญเสียข้อมูล:
{ web: { whatsapp: { keepAliveIntervalMs: 15000, connectTimeoutMs: 60000, defaultQueryTimeoutMs: 60000, }, },}วิธีแก้ไข:
openclaw channels status --probeopenclaw doctoropenclaw logs --followopenclaw gateway statusหากยังคงวนซ้ำหลังจากแก้ไขการเชื่อมต่อของโฮสต์และการตั้งเวลาแล้ว ให้สำรองไดเรกทอรีการยืนยันตัวตนของบัญชีและเชื่อมโยงใหม่:
cp -a ~/.openclaw/credentials/whatsapp/<accountId> \ ~/.openclaw/credentials/whatsapp/<accountId>.bakopenclaw channels logout --channel whatsapp --account <accountId>openclaw channels login --channel whatsapp --account <accountId>หาก ~/.openclaw/logs/whatsapp-health.log ระบุว่า Gateway inactive แต่ทั้ง openclaw gateway status และ openclaw channels status --probe แสดงว่าปกติ ให้เรียกใช้ openclaw doctor บน Linux doctor จะเตือนเกี่ยวกับรายการ crontab แบบเดิมที่เรียกใช้สคริปต์ ~/.openclaw/bin/ensure-whatsapp.sh ซึ่งเลิกใช้แล้ว ให้ลบรายการเหล่านั้นด้วย crontab -e เนื่องจาก Cron อาจไม่มีสภาพแวดล้อมบัสผู้ใช้ของ systemd และทำให้สคริปต์เก่านั้นรายงานสถานะของ Gateway ผิดพลาด
การเข้าสู่ระบบด้วย QR หมดเวลาหลังพร็อกซี
อาการ: openclaw channels login --channel whatsapp ล้มเหลวก่อนแสดง QR ที่ใช้งานได้ พร้อมด้วย status=408 Request Time-out หรือการตัดการเชื่อมต่อซ็อกเก็ต TLS
การเข้าสู่ระบบ WhatsApp Web ใช้สภาพแวดล้อมพร็อกซีมาตรฐานของโฮสต์ Gateway (HTTPS_PROXY, HTTP_PROXY, รูปแบบตัวพิมพ์เล็ก, NO_PROXY) ตรวจสอบว่ากระบวนการ Gateway สืบทอดตัวแปรสภาพแวดล้อมพร็อกซี และ NO_PROXY ไม่ตรงกับ mmg.whatsapp.net
ไม่มีตัวรับฟังที่ทำงานอยู่ขณะส่ง
การส่งออกจะล้มเหลวทันทีเมื่อไม่มีตัวรับฟัง Gateway ที่ทำงานอยู่สำหรับบัญชีเป้าหมาย ตรวจสอบว่า Gateway กำลังทำงานและบัญชีเชื่อมโยงแล้ว
คำตอบปรากฏในบทถอดความแต่ไม่ปรากฏใน WhatsApp
แถวบทถอดความบันทึกสิ่งที่เอเจนต์สร้างขึ้น ส่วนการส่งผ่าน WhatsApp จะได้รับการตรวจสอบแยกต่างหาก OpenClaw จะถือว่าส่งการตอบกลับอัตโนมัติแล้วก็ต่อเมื่อ Baileys ส่งคืน ID ข้อความขาออกสำหรับการส่งข้อความหรือสื่อที่มองเห็นได้อย่างน้อยหนึ่งรายการ
ปฏิกิริยาตอบรับเป็นการยืนยันการรับก่อนตอบกลับที่แยกเป็นอิสระ การเพิ่มปฏิกิริยาสำเร็จไม่ได้พิสูจน์ว่าคำตอบข้อความ/สื่อภายหลังได้รับการยอมรับ ตรวจสอบบันทึกของ Gateway เพื่อหา auto-reply delivery failed หรือ auto-reply was not accepted by WhatsApp provider
ข้อความกลุ่มถูกละเว้นโดยไม่คาดคิด
ตรวจสอบตามลำดับนี้: groupPolicy, groupAllowFrom/allowFrom, รายการ allowlist ใน groups, เงื่อนไขการกล่าวถึง (requireMention + รูปแบบการกล่าวถึง) และคีย์ซ้ำใน openclaw.json (รายการ JSON5 ที่อยู่ภายหลังจะแทนที่รายการก่อนหน้า ให้เก็บ groupPolicy เพียงรายการเดียวต่อขอบเขต)
หากมี channels.whatsapp.groups WhatsApp ยังคงตรวจพบข้อความจากกลุ่มอื่นได้ แต่ OpenClaw จะทิ้งข้อความเหล่านั้นก่อนกำหนดเส้นทางเซสชัน เพิ่ม JID ของกลุ่มลงใน channels.whatsapp.groups หรือเพิ่ม groups["*"] เพื่ออนุญาตทุกกลุ่ม ขณะที่ยังคงควบคุมการอนุญาตผู้ส่งภายใต้ groupPolicy/groupAllowFrom
คำเตือนรันไทม์ Bun
Gateway ของ OpenClaw ต้องใช้ Node โดย Bun ไม่มี API node:sqlite ที่ที่เก็บสถานะมาตรฐานใช้งาน และ doctor จะย้ายบริการ Bun แบบเดิมไปยัง Node
พรอมต์ระบบ
WhatsApp รองรับพรอมต์ระบบแบบ Telegram สำหรับกลุ่มและแชตส่วนตัวผ่านแมป groups และ direct
การแก้ค่าสำหรับข้อความกลุ่ม: ระบบจะกำหนดแมป groups ที่มีผลก่อน หากบัญชีกำหนดคีย์ groups ของตนเองไว้ ไม่ว่าในรูปแบบใด คีย์นั้นจะแทนที่แมป groups ระดับรากทั้งหมด (ไม่มีการผสานแบบลึก) จากนั้นการค้นหาพรอมต์จะดำเนินการกับแมปผลลัพธ์เพียงแมปเดียวนั้น:
- พรอมต์เฉพาะกลุ่ม (
groups["<groupId>"].systemPrompt): ใช้เมื่อมีรายการกลุ่มอยู่ และ มีการกำหนดคีย์systemPromptสตริงว่าง ("") จะระงับไวลด์การ์ดและไม่ใช้พรอมต์ใด ๆ - พรอมต์ไวลด์การ์ดของกลุ่ม (
groups["*"].systemPrompt): ใช้เมื่อไม่มีรายการของกลุ่มนั้น หรือมีรายการแต่ไม่มีคีย์systemPrompt
การแก้ค่าสำหรับข้อความส่วนตัวใช้รูปแบบเดียวกันกับแมป direct และ direct["*"]
ความแตกต่างจาก Telegram: Telegram จะระงับ groups ระดับรากสำหรับทุกบัญชีในการตั้งค่าแบบหลายบัญชี (แม้แต่บัญชีที่ไม่มี groups ของตนเอง) เพื่อป้องกันไม่ให้บอตรับข้อความกลุ่มจากกลุ่มที่ตนไม่ได้เป็นสมาชิก WhatsApp ไม่ใช้กลไกป้องกันดังกล่าว โดยบัญชีใดก็ตามที่ไม่มีการแทนที่ของตนเองจะสืบทอด groups/direct ระดับราก ไม่ว่าจะมีบัญชีกี่บัญชี ในการตั้งค่า WhatsApp แบบหลายบัญชี ให้กำหนดแมปทั้งหมดภายใต้แต่ละบัญชีอย่างชัดเจนหากต้องการพรอมต์แยกตามบัญชี
ลักษณะการทำงานที่สำคัญ:
channels.whatsapp.groupsเป็นทั้งแมปการกำหนดค่าแยกตามกลุ่มและ allowlist ของกลุ่มระดับแชต ที่ขอบเขตระดับรากหรือบัญชีgroups["*"]หมายถึง "อนุญาตทุกกลุ่ม" สำหรับขอบเขตนั้น- เพิ่มไวลด์การ์ด
systemPromptเฉพาะเมื่อขอบเขตนั้นควรอนุญาตทุกกลุ่มอยู่แล้ว หากต้องการให้เฉพาะชุด ID กลุ่มแบบคงที่มีสิทธิ์ใช้งาน ให้ระบุพรอมต์ซ้ำในแต่ละรายการที่อยู่ใน allowlist อย่างชัดเจนแทนการใช้groups["*"] - การอนุญาตกลุ่มและการอนุญาตผู้ส่งเป็นการตรวจสอบที่แยกจากกัน
groups["*"]ขยายขอบเขตกลุ่มที่จะเข้าสู่การจัดการกลุ่ม แต่ไม่ได้อนุญาตผู้ส่งทุกคนในกลุ่มเหล่านั้น ซึ่งยังคงควบคุมโดยgroupPolicy/groupAllowFrom channels.whatsapp.directไม่มีผลข้างเคียงที่เทียบเท่ากันสำหรับ DM:direct["*"]เพียงระบุการกำหนดค่าเริ่มต้นหลังจาก DM ได้รับอนุญาตแล้วโดยdmPolicyร่วมกับallowFromหรือกฎของที่เก็บการจับคู่
ตัวอย่าง:
{ channels: { whatsapp: { groups: { // ใช้เฉพาะเมื่อควรอนุญาตทุกกลุ่มในขอบเขตระดับราก // มีผลกับทุกบัญชีที่ไม่ได้กำหนดแมป groups ของตนเอง "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับทุกกลุ่ม" }, }, direct: { // มีผลกับทุกบัญชีที่ไม่ได้กำหนดแมป direct ของตนเอง "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับแชตส่วนตัวทั้งหมด" }, }, accounts: { work: { groups: { // บัญชีนี้กำหนด groups ของตนเอง ดังนั้น groups ระดับรากจึงถูก // แทนที่ทั้งหมด หากต้องการเก็บไวลด์การ์ดไว้ ให้กำหนด "*" ที่นี่อย่างชัดเจนด้วย "120363406415684625@g.us": { requireMention: false, systemPrompt: "มุ่งเน้นการจัดการโครงการ", }, // ใช้เฉพาะเมื่อควรอนุญาตทุกกลุ่มในบัญชีนี้ "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับกลุ่มงาน" }, }, direct: { // บัญชีนี้กำหนดแมป direct ของตนเอง ดังนั้นรายการ direct ระดับรากจึงถูก // แทนที่ทั้งหมด หากต้องการเก็บไวลด์การ์ดไว้ ให้กำหนด "*" ที่นี่อย่างชัดเจนด้วย "+15551234567": { systemPrompt: "พรอมต์สำหรับแชตส่วนตัวของงานที่ระบุ" }, "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับแชตส่วนตัวของงาน" }, }, }, }, }, },}ตัวชี้ไปยังเอกสารอ้างอิงการกำหนดค่า
เอกสารอ้างอิงหลัก: เอกสารอ้างอิงการกำหนดค่า - WhatsApp
| พื้นที่ | ฟิลด์ |
|---|---|
| การเข้าถึง | dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups |
| การส่งมอบ | textChunkLimit, streaming.chunkMode, mediaMaxMb, sendReadReceipts, ackReaction, reactionLevel |
| หลายบัญชี | accounts.<id>.enabled, accounts.<id>.authDir และการแทนที่อื่น ๆ แยกตามบัญชี |
| การดำเนินงาน | configWrites, debounceMs, web.enabled, web.heartbeatSeconds, web.reconnect.*, web.whatsapp.* |
| ลักษณะการทำงานของเซสชัน | session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit |
| พรอมต์ | groups.<id>.systemPrompt, groups["*"].systemPrompt, direct.<id>.systemPrompt, direct["*"].systemPrompt |