---
read_when:
    - การตั้งค่า Zalo Personal สำหรับ OpenClaw
    - การดีบักขั้นตอนการเข้าสู่ระบบหรือการส่งข้อความของ Zalo Personal
summary: การรองรับบัญชีส่วนบุคคลของ Zalo ผ่าน zca-js แบบเนทีฟ (เข้าสู่ระบบด้วย QR) ความสามารถ และการกำหนดค่า
title: Zalo ส่วนบุคคล
x-i18n:
    generated_at: "2026-07-19T07:14:11Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 09cecad1a9a5b34b932c5e68e2b3164b360fb6af1dcd2fd5b5979d1b2a1bd62b
    source_path: channels/zalouser.md
    workflow: 16
---

สถานะ: ทดลองใช้งาน การผสานรวมนี้ทำให้ **บัญชี Zalo ส่วนบุคคล** ทำงานอัตโนมัติผ่าน `zca-js` แบบเนทีฟ ภายในโปรเซส โดยไม่ต้องใช้ไบนารี CLI ภายนอก

<Warning>
นี่เป็นการผสานรวมที่ไม่เป็นทางการและอาจส่งผลให้บัญชีถูกระงับหรือแบน โปรดใช้งานโดยยอมรับความเสี่ยงเอง
</Warning>

## ติดตั้ง

Zalo Personal เป็น Plugin ภายนอกอย่างเป็นทางการ ซึ่งไม่ได้รวมอยู่ในแกนหลัก โปรดติดตั้งก่อนใช้งาน:

```bash
openclaw plugins install @openclaw/zalouser
```

- ตรึงเวอร์ชัน: `openclaw plugins install @openclaw/zalouser@<version>`
- จากการเช็กเอาต์ซอร์ส: `openclaw plugins install ./path/to/local/zalouser-plugin`
- รายละเอียด: [Plugin](/th/tools/plugin)

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

1. ติดตั้ง Plugin (ด้านบน)
2. เข้าสู่ระบบ (ด้วย QR บนเครื่อง Gateway):
   - `openclaw channels login --channel zalouser`
   - สแกนโค้ด QR ด้วยแอป Zalo บนอุปกรณ์เคลื่อนที่
3. เปิดใช้งานช่องทาง:

```json5
{
  channels: {
    zalouser: {
      enabled: true,
      dmPolicy: "pairing",
    },
  },
}
```

4. รีสตาร์ต Gateway (หรือตั้งค่าให้เสร็จสิ้น)
5. การเข้าถึง DM มีค่าเริ่มต้นเป็นการจับคู่ โปรดอนุมัติรหัสจับคู่เมื่อมีการติดต่อครั้งแรก

## สิ่งนี้คืออะไร

- ทำงานทั้งหมดภายในโปรเซสผ่านไลบรารี `zca-js` (ไม่มีไบนารี `zca`/`openzca` ภายนอก)
- ใช้ตัวรับฟังเหตุการณ์แบบเนทีฟ (`message`, `error`) เพื่อรับข้อความขาเข้า
- ส่งการตอบกลับโดยตรงผ่าน JS API (ข้อความ/สื่อ/ลิงก์)
- ออกแบบมาสำหรับกรณีใช้งาน "บัญชีส่วนบุคคล" ซึ่งไม่สามารถใช้ Zalo Bot API ได้

## การตั้งชื่อ

รหัสช่องทางคือ `zalouser` เพื่อระบุอย่างชัดเจนว่าสิ่งนี้ทำให้ **บัญชีผู้ใช้ Zalo ส่วนบุคคล** ทำงานอัตโนมัติ (ไม่เป็นทางการ) ส่วน `zalo` สงวนไว้สำหรับการผสานรวม Zalo API อย่างเป็นทางการที่อาจมีในอนาคต

## การค้นหารหัส (ไดเรกทอรี)

```bash
openclaw directory self --channel zalouser
openclaw directory peers list --channel zalouser --query "name"
openclaw directory groups list --channel zalouser --query "work"
```

## ขีดจำกัด

- ข้อความขาออกถูกแบ่งเป็นส่วนละ 2000 อักขระ (ขีดจำกัดของไคลเอนต์ Zalo)
- ไม่รองรับการสตรีม
- รหัสข้อความขาเข้าที่ประมวลผลเสร็จแล้วจะถูกเก็บไว้ 30 วัน โดยจำกัดไว้ที่ 1000 รายการล่าสุดต่อบัญชี

## ความทนทานของข้อความขาเข้า

OpenClaw จัดเก็บคอลแบ็กข้อความดิบ `zca-js` แต่ละรายการก่อนประมวลผล ข้อความที่รอดำเนินการจะทำงานต่อจากคิวของบัญชีหลังรีสตาร์ต Gateway และการประมวลผลจะยังคงเป็นแบบลำดับต่อแชตส่วนตัวหรือกลุ่ม

ตัวรับฟังซ็อกเก็ต `zca-js` ไม่ได้เปิดเผยการตอบรับการส่งหรือเล่นข้อความเก่าซ้ำโดยอัตโนมัติหลังเชื่อมต่อใหม่ ดังนั้นคิวที่ทนทานจึงป้องกันช่วงเวลาที่ระบบภายในขัดข้องหลังจากคอลแบ็กมาถึง OpenClaw แต่ไม่สามารถกู้คืนข้อความที่ซ็อกเก็ตไม่เคยส่งมาได้ Tombstone สำหรับการเล่นซ้ำมีไว้เป็นมาตรการป้องกันเป็นหลักในกรณีที่คอลแบ็กเดิมซ้ำด้วยรหัสข้อความ Zalo เดียวกัน

## การควบคุมการเข้าถึง (DM)

`channels.zalouser.dmPolicy`: `pairing | allowlist | open | disabled` (ค่าเริ่มต้น: `pairing`)

`channels.zalouser.allowFrom` ควรใช้รหัสผู้ใช้ Zalo ที่คงที่ และยังสามารถอ้างอิงกลุ่มการเข้าถึงของผู้ส่งแบบคงที่ (`accessGroup:<name>`) ได้ ระหว่างการตั้งค่าแบบโต้ตอบ ชื่อที่ป้อนสามารถแปลงเป็นรหัสได้โดยใช้การค้นหารายชื่อติดต่อภายในโปรเซสของ Plugin

หากยังมีชื่อดิบอยู่ในการกำหนดค่า ระบบจะหาค่ารหัสให้เมื่อเริ่มต้นเฉพาะในกรณีที่เปิดใช้ `channels.zalouser.dangerouslyAllowNameMatching: true` เท่านั้น หากไม่ได้เลือกใช้งานนี้ การตรวจสอบผู้ส่งขณะรันไทม์จะใช้เฉพาะรหัส และชื่อดิบจะถูกละเว้นในการอนุญาต

อนุมัติผ่าน:

- `openclaw pairing list zalouser`
- `openclaw pairing approve zalouser <code>`

## การเข้าถึงกลุ่ม (ไม่บังคับ)

- ค่าเริ่มต้น: `channels.zalouser.groupPolicy = "allowlist"` (กลุ่มต้องมีรายการในรายการอนุญาตอย่างชัดเจน)
- เปิดทุกกลุ่ม: `channels.zalouser.groupPolicy = "open"`
- บล็อกทุกกลุ่ม: `channels.zalouser.groupPolicy = "disabled"`
- เมื่อใช้ `groupPolicy = "allowlist"`:
  - คีย์ `channels.zalouser.groups` ควรเป็นรหัสกลุ่มที่คงที่ โดยระบบจะแปลงชื่อเป็นรหัสเมื่อเริ่มต้นเฉพาะในกรณีที่เปิดใช้ `channels.zalouser.dangerouslyAllowNameMatching: true`
  - `channels.zalouser.groupAllowFrom` ควบคุมว่าผู้ส่งรายใดในกลุ่มที่อนุญาตสามารถเรียกใช้บอตได้ และสามารถอ้างอิงกลุ่มการเข้าถึงของผู้ส่งแบบคงที่ด้วย `accessGroup:<name>`
- วิซาร์ดกำหนดค่าสามารถแจ้งให้ระบุรายการอนุญาตของกลุ่มได้
- โดยค่าเริ่มต้น การจับคู่รายการอนุญาตของกลุ่มจะใช้เฉพาะรหัส ชื่อที่แปลงไม่ได้จะถูกละเว้นสำหรับการอนุญาต เว้นแต่จะเปิดใช้ `channels.zalouser.dangerouslyAllowNameMatching: true`
- `channels.zalouser.dangerouslyAllowNameMatching: true` เป็นโหมดความเข้ากันได้สำหรับเหตุฉุกเฉิน ซึ่งเปิดใช้งานการแปลงชื่อที่เปลี่ยนแปลงได้เมื่อเริ่มต้นและการจับคู่ชื่อกลุ่มขณะรันไทม์อีกครั้ง
- `groupAllowFrom` จะ **ไม่** ย้อนกลับไปใช้ `allowFrom` สำหรับข้อความกลุ่มทั่วไป กล่าวคือ หากปล่อยว่างในกลุ่มที่อยู่ในรายการอนุญาต ผู้ส่งทุกคนจะเข้าถึงกลุ่มนั้นได้ คำสั่งควบคุมที่ได้รับอนุญาต (เช่น `/new`) เป็นข้อยกเว้น โดยการตรวจสอบผู้ส่งคำสั่งจะย้อนกลับไปใช้ `allowFrom` เมื่อ `groupAllowFrom` ว่างเปล่า

ตัวอย่าง:

```json5
{
  channels: {
    zalouser: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["1471383327500481391"],
      groups: {
        "123456789": { enabled: true },
        "Work Chat": { enabled: true },
      },
    },
  },
}
```

<Note>
`channels.zalouser.groups.<id>.allow` เป็นชื่อฟิลด์เดิม การกำหนดค่าปัจจุบันใช้ `enabled` โดย `openclaw doctor --fix` จะย้าย `allow` ไปยัง `enabled` โดยอัตโนมัติ
</Note>

### การควบคุมด้วยการกล่าวถึงในกลุ่ม

- `channels.zalouser.groups.<group>.requireMention` ควบคุมว่าการตอบกลับในกลุ่มต้องมีการกล่าวถึงหรือไม่
- ลำดับการหาค่า: รหัสกลุ่ม -> นามแฝง `group:<id>` -> ชื่อกลุ่ม/slug (ตัวเลือกที่อิงตามชื่อจะใช้เฉพาะเมื่อ `dangerouslyAllowNameMatching: true`) -> `*` -> ค่าเริ่มต้น (`true`)
- ใช้กับทั้งกลุ่มที่อยู่ในรายการอนุญาตและโหมดเปิดกลุ่ม
- การอ้างข้อความของบอตถือเป็นการกล่าวถึงโดยนัยเพื่อเปิดใช้งานกลุ่ม
- คำสั่งควบคุมที่ได้รับอนุญาต (เช่น `/new`) สามารถข้ามการควบคุมด้วยการกล่าวถึงได้
- เมื่อข้อความกลุ่มถูกข้ามเนื่องจากจำเป็นต้องมีการกล่าวถึง OpenClaw จะจัดเก็บข้อความนั้นเป็นประวัติกลุ่มที่รอดำเนินการ และรวมไว้กับข้อความกลุ่มถัดไปที่ประมวลผล
- ขีดจำกัดประวัติกลุ่ม: `channels.zalouser.historyLimit` จากนั้น `messages.groupChat.historyLimit` แล้วจึงใช้ค่าสำรอง `50`

ตัวอย่าง:

```json5
{
  channels: {
    zalouser: {
      groupPolicy: "allowlist",
      groups: {
        "*": { enabled: true, requireMention: true },
        "Work Chat": { enabled: true, requireMention: false },
      },
    },
  },
}
```

## หลายบัญชี

บัญชีจะเชื่อมโยงกับโปรไฟล์ `zalouser` ในสถานะ OpenClaw ตัวอย่าง:

```json5
{
  channels: {
    zalouser: {
      enabled: true,
      defaultAccount: "default",
      accounts: {
        work: { enabled: true, profile: "work" },
      },
    },
  },
}
```

## ตัวแปรสภาพแวดล้อม

การเลือกโปรไฟล์สามารถมาจากตัวแปรสภาพแวดล้อมได้เช่นกัน:

| ตัวแปร                | วัตถุประสงค์                                                                    |
| ------------------ | -------------------------------------------------------------------------- |
| `ZALOUSER_PROFILE` | ชื่อโปรไฟล์ที่จะใช้เมื่อไม่ได้ตั้งค่า `profile` ในการกำหนดค่าช่องทางหรือบัญชี |
| `ZCA_PROFILE`      | ค่าสำรองเดิม ซึ่งใช้เฉพาะเมื่อไม่ได้ตั้งค่า `ZALOUSER_PROFILE`             |

ชื่อโปรไฟล์ใช้เลือกข้อมูลประจำตัวสำหรับเข้าสู่ระบบ Zalo ที่บันทึกไว้ในสถานะ OpenClaw ลำดับการหาค่า:

1. `profile` ที่ระบุอย่างชัดเจนในการกำหนดค่า
2. `ZALOUSER_PROFILE`
3. `ZCA_PROFILE`
4. รหัสบัญชีสำหรับบัญชีที่ไม่ใช่บัญชีเริ่มต้น หรือ `default` สำหรับบัญชีเริ่มต้น

สำหรับการตั้งค่าหลายบัญชี ควรตั้งค่า `profile` ให้แต่ละบัญชีในการกำหนดค่า เพื่อป้องกันไม่ให้ตัวแปรสภาพแวดล้อมเพียงตัวเดียวทำให้หลายบัญชีใช้เซสชันเข้าสู่ระบบเดียวกันร่วมกัน

## การพิมพ์ รีแอ็กชัน และการตอบรับการส่ง

- OpenClaw ส่งเหตุการณ์การพิมพ์ก่อนส่งการตอบกลับ (ตามความสามารถ)
- รองรับการดำเนินการรีแอ็กชันข้อความ `react` สำหรับ `zalouser` ในการดำเนินการของช่องทาง
  - ใช้ `remove: true` เพื่อลบอีโมจิรีแอ็กชันรายการใดรายการหนึ่งออกจากข้อความ
  - ความหมายของรีแอ็กชัน: [รีแอ็กชัน](/th/tools/reactions)
- สำหรับข้อความขาเข้าที่มีข้อมูลเมตาของเหตุการณ์ OpenClaw จะส่งการตอบรับว่าส่งถึงแล้วและเห็นแล้ว (ตามความสามารถ)

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

**สถานะการเข้าสู่ระบบไม่คงอยู่:**

- `openclaw channels status --probe`
- เข้าสู่ระบบอีกครั้ง: `openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser`

**แปลงชื่อในรายการอนุญาต/ชื่อกลุ่มไม่ได้:**

- ใช้รหัสตัวเลขใน `allowFrom`/`groupAllowFrom` และใช้รหัสกลุ่มที่คงที่ใน `groups` หากตั้งใจใช้ชื่อเพื่อน/กลุ่มแบบตรงกันทุกประการ ให้เปิดใช้ `channels.zalouser.dangerouslyAllowNameMatching: true`

**อัปเกรดจากการตั้งค่าภายนอกแบบ `zca`/CLI รุ่นเก่า:**

- นำสมมติฐานเกี่ยวกับโปรเซส `zca` ภายนอกออก ปัจจุบันช่องทางทำงานทั้งหมดภายในโปรเซสผ่าน `zca-js` โดยไม่มีไบนารี CLI ภายนอก

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

- [ภาพรวมช่องทาง](/th/channels) - ช่องทางทั้งหมดที่รองรับ
- [การจับคู่](/th/channels/pairing) - การยืนยันตัวตน DM และขั้นตอนการจับคู่
- [กลุ่ม](/th/channels/groups) - ลักษณะการทำงานของแชตกลุ่มและการควบคุมด้วยการกล่าวถึง
- [การกำหนดเส้นทางช่องทาง](/th/channels/channel-routing) - การกำหนดเส้นทางเซสชันสำหรับข้อความ
- [ความปลอดภัย](/th/gateway/security) - โมเดลการเข้าถึงและการเสริมความแข็งแกร่ง
