# Zalo Bot — Chạy từ đầu (chưa login Zalo)

Coi như máy mới, **chưa từng quét QR**. Bot nằm ở `scripts/zalo-bot/`.

Server Linux thường **không có màn hình**. Không dùng `npm run start:ui`. Login bằng file `qr.png` + app Zalo điện thoại.

---

## Bước 0 — Chuẩn bị

Trên máy chạy bot:

- Node.js (vd v20)
- Acc Zalo trên điện thoại (acc này sẽ là “tài khoản bot”, phải **đã vào nhóm** cần gửi tin)

```bash
cd /var/www/html/lms_hocmai/scripts/zalo-bot
```

Lần đầu trên máy này:

```bash
npm install
npm run install-chrome
```

Xóa session cũ (bắt buộc nếu muốn login lại từ đầu):

```bash
rm -rf zalo_user_data
```

Không xóa thì Chrome dùng cookie cũ, **không hiện QR**.

Cài pm2 nếu chưa có:

```bash
npm i -g pm2
```

---

## Bước 1 — Bật bot để lấy QR

Chạy **foreground** (đừng pm2 lúc này):

```bash
cd /var/www/html/lms_hocmai/scripts/zalo-bot
npm start
```

Log sẽ giống:

```
🚀 Launching Chrome...
🔐 Need QR login...
👉 QR: /var/www/html/lms_hocmai/scripts/zalo-bot/qr.png
```

File QR: `scripts/zalo-bot/qr.png`

Timeout chờ quét: **180 giây**. Quét chậm quá → chạy lại `npm start`.

---

## Bước 2 — Quét QR trên điện thoại

1. Mở file `qr.png` (copy về máy, hoặc `scp`, hoặc xem trong IDE).
2. App Zalo → **Quét mã QR** (thường: Tôi → QR / quét).
3. Xác nhận đăng nhập Zalo Web.

Log khi thành công:

```
✅ QR login success
🟢 Zalo Bot API: http://127.0.0.1:3910
```

Session đã nằm trong `zalo_user_data/`. Lần sau **không quét lại** (trừ khi bị logout / xóa thư mục đó).

Giữ cửa sổ `npm start` đang chạy. Sang bước 3 để kiểm tra, rồi bước 4 chuyển sang pm2.

---

## Bước 3 — Kiểm tra đã login

Terminal khác:

```bash
curl -s http://127.0.0.1:3910/health
```

Cần:

```json
{ "success": true, "ready": true, "logged_in": true, "group": "placementtest_lcms" }
```

`ready: false` / `logged_in: false` → chưa quét kịp, chạy lại bước 1–2.

Gửi thử (đổi `group` / `tags` cho đúng tên thật trên Zalo):

```bash
curl -s -X POST http://127.0.0.1:3910/send \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: lms-zalo-secret" \
  -d '{"group":"placementtest_lcms","message":"bot login ok","tags":[]}'
```

---

## Bước 4 — Chạy nền bằng pm2 (để khỏi mở terminal)

1. Terminal đang `npm start` → **Ctrl+C** (session vẫn giữ trong `zalo_user_data/`).
2. Không chạy `npm start` nữa (tránh trùng port 3910).

```bash
cd /var/www/html/lms_hocmai/scripts/zalo-bot
npm run pm2:start
curl -s http://127.0.0.1:3910/health
```

Lệnh pm2:

```bash
npm run pm2:logs       # log
npm run pm2:restart
npm run pm2:stop
pm2 list
```

pm2 dùng `ecosystem.config.cjs`: port `3910`, key `lms-zalo-secret`, nhóm mặc định `placementtest_lcms`, `ZALO_HEADLESS=true`.

---

## Máy có GUI thì sao?

Có màn hình / VNC mới dùng cửa sổ Chrome:

```bash
cd /var/www/html/lms_hocmai/scripts/zalo-bot
rm -rf zalo_user_data
npm run start:ui
```

Quét QR trên cửa sổ Chrome, rồi Ctrl+C → `npm run pm2:start`.

Server LMS hiện tại **không có `DISPLAY`** → bỏ qua `start:ui`, dùng bước 1–2 (`npm start` + `qr.png`).

---

## Sự cố lúc login

| Hiện tượng | Làm gì |
|---|---|
| Không có `qr.png` mới | Đã còn `zalo_user_data` → `rm -rf zalo_user_data` rồi `npm start` |
| Quét QR không kịp | Chạy lại `npm start` (180s) |
| `Chrome not found` | `npm run install-chrome` |
| Port 3910 đã dùng | `npm run pm2:stop` hoặc `kill` process `node server.js` |
| Login xong `/health` fail | Bot đã tắt; `npm run pm2:start` |
| Sau này bị logout Zalo | `rm -rf zalo_user_data`, làm lại bước 1–2, rồi `pm2:restart` |

Gửi tin + @tag: [`zalo-bot-send-tag.md`](zalo-bot-send-tag.md).
