Bộ tài liệu Hermes Agent · Phần 6 · Zalo

Hermes Agent với Zalo: Zalo Bot, Zalo OA, ZNS

Hermes chưa có kết nối Zalo dựng sẵn. Tài liệu chọn đúng "cửa" chính thức của Zalo cho từng nhu cầu và cung cấp cầu nối an toàn cho Zalo Bot. Tài liệu nội bộ Aduca, chia sẻ cho học viên.

Cập nhật 02/10/2026⏱ 1–2 giờQuy trìnhTrung cấp → Nâng cao

Chọn đúng "cửa" Zalo

CửaDùng khiChính thức?Chi phí / giới hạn (tại 10/2026)
Zalo Bot (Zalo Bot Platform)Bot tư vấn khách, tên bắt đầu bằng "Bot …"; shop nhỏ, thử nghiệmCóGói Basic miễn phí: 3 bot, mỗi bot tối đa 50 người dùng; gói Pro 129.000đ/tháng đang "sắp ra mắt"
Zalo OA + Open APIKênh chăm sóc khách chính thức của doanh nghiệp, nhiều kháchCóOpen API hiển thị ở gói Tăng trưởng (2,5 triệu/năm) và Toàn diện (6 triệu/năm); tin tư vấn trong 48 giờ miễn phí
ZBS Template Message (tên mới của ZNS)Gửi xác nhận đơn, nhắc lịch, nhắc thanh toán theo mẫu đã duyệtCóKhoảng 200–300đ/tin (chưa VAT)
Zalo cá nhân (thư viện không chính thức)—KhôngTrái chính sách Zalo, có thể bị khoá tài khoản
Doanh nghiệp bán hàng chủ yếu qua Zalo: OpenClaw hiện có kết nối Zalo dựng sẵn (Zalo ClawBot, Zalo Bot) — xem Agent Zalo với OpenClaw. Có thể để OpenClaw lo Zalo, Hermes lo việc nội bộ.

Ghi chú: trang gói Zalo Bot ghi giới hạn tin nhắn theo tháng, phần câu hỏi thường gặp lại ghi theo ngày; bảng giá Zalo OA chưa nói rõ gói miễn phí và gói Tiêu chuẩn có dùng được Open API hay không. Hãy kiểm tra lại với Zalo trước khi đăng ký.

Nguồn: Zalo Bot – gói dịch vụ · Zalo OA – bảng giá · ZBS – bảng giá

Cách 1 — Zalo Bot trả lời khách bằng agent cskh

Luồng: khách nhắn bot Zalo → cầu nối trên VPS hỏi Zalo "có tin mới không" (cách long polling, không cần tên miền, không mở cổng) → hỏi agent cskh qua API nội bộ → gửi câu trả lời.

1.1. Chuẩn bị

1.2. Tạo bot

  1. Trong app Zalo, tìm OA Zalo Bot Manager → Tạo bot. Tên bot phải bắt đầu bằng "Bot", vd Bot Aduca Shop.
  2. Zalo gửi thông tin bot và Bot Token (dạng 12345689:abc-xyz) vào tin nhắn Zalo của bạn. Token không tự hết hạn; muốn đổi thì vào Zalo Bot Creator → cài đặt → đặt lại.
  3. Copy token vào trình quản lý mật khẩu, sau đó xoá tin nhắn chứa token trong Zalo.

Nguồn: Tạo Bot · Bot Token

1.3. Khai báo bí mật cho cầu nối (tài khoản hermes)

Lệnh TermiusChạy cả khối; dán token khi được hỏi
mkdir -p ~/.config && (umask 077; touch ~/.config/zalo-bridge.env)
read -rsp "Dán ZALO_BOT_TOKEN rồi Enter (chữ không hiện): " V; echo; echo "ZALO_BOT_TOKEN=$V" >> ~/.config/zalo-bridge.env; unset V
grep '^API_SERVER_KEY=' ~/.hermes/profiles/cskh/.env | sed 's/^API_SERVER_KEY=/CSKH_API_KEY=/' >> ~/.config/zalo-bridge.env
echo "GIOI_THIEU=Dạ em là trợ lý tự động của <tên shop>, nhân viên sẽ hỗ trợ thêm khi cần ạ." >> ~/.config/zalo-bridge.env
T=$(grep '^ZALO_BOT_TOKEN=' ~/.config/zalo-bridge.env | cut -d= -f2-); curl -s -X POST "https://bot-api.zaloplatforms.com/bot$T/getMe"; echo; unset T   # thấy "ok":true là token đúng

1.4. Tạo cầu nối và chạy 24/7

Lệnh TermiusCopy cả khối → dán vào Termius → Enter (tạo file cầu nối)
mkdir -p ~/zalo-bridge && cat > ~/zalo-bridge/cau_noi.py <<'EOF'
#!/usr/bin/env python3
"""Cầu nối Zalo Bot → Hermes (agent cskh), kiểu tự hỏi tin mới (long polling). Aduca viết, dùng tự do.
Không cần tên miền: cầu nối tự hỏi Zalo có tin mới không, hỏi agent cskh qua API nội bộ rồi trả lời."""
import json, os, re, time, urllib.request

E = dict(l.strip().split('=', 1) for l in open(os.path.expanduser('~/.config/zalo-bridge.env')) if '=' in l and not l.startswith('#'))
Z = 'https://bot-api.zaloplatforms.com/bot' + E['ZALO_BOT_TOKEN'] + '/'
HERMES = 'http://127.0.0.1:8642/p/cskh/v1/chat/completions'
KHACH = os.path.expanduser('~/zalo-bridge/khach-de-lai-sdt.txt')
SDT = re.compile(r'(?:\+?84|0)(?:\d[\s.-]?){8,10}')
lan_cuoi = {}

def goi(url, data, headers=None, timeout=60):
    h = {'Content-Type': 'application/json', **(headers or {})}
    with urllib.request.urlopen(urllib.request.Request(url, json.dumps(data).encode(), h), timeout=timeout) as r:
        return json.load(r)

def zalo(ham, **data):  # không in URL ra nhật ký vì URL chứa token
    return goi(Z + ham, data, timeout=45)

def hoi_cskh(phien, noi_dung):
    try:
        j = goi(HERMES, {'model': 'cskh', 'messages': [{'role': 'user', 'content': noi_dung}]},
                {'Authorization': 'Bearer ' + E['CSKH_API_KEY'], 'X-Hermes-Session-Id': phien}, timeout=90)
        return j['choices'][0]['message']['content'].strip()
    except Exception as e:
        print('Loi goi Hermes:', type(e).__name__, flush=True)
        return 'Dạ shop đã nhận tin nhắn, nhân viên sẽ phản hồi anh/chị sớm nhất ạ!'

def xu_ly(u):
    msg = (u or {}).get('message') or {}
    chat = msg.get('chat') or {}
    if chat.get('chat_type') != 'PRIVATE' or (msg.get('from') or {}).get('is_bot'):
        return
    cid = chat.get('id')
    if u.get('event_name') != 'message.text.received':
        zalo('sendMessage', chat_id=cid, text='Dạ hiện em chỉ đọc được tin nhắn chữ, anh/chị nhắn giúp em bằng chữ nhé ạ.')
        return
    text = msg.get('text', '')
    if SDT.search(text):
        with open(KHACH, 'a') as f:
            f.write(time.strftime('%d/%m %H:%M') + ' | Zalo | ' + (msg.get('from') or {}).get('display_name', '') + ' | ' + text[:300].replace('\n', ' ') + '\n')
    try:
        zalo('sendChatAction', chat_id=cid, action='typing')
    except Exception:
        pass
    tra_loi = hoi_cskh('zalo-' + cid, text)
    if time.time() - lan_cuoi.get(cid, 0) > 86400:
        tra_loi = E.get('GIOI_THIEU', 'Dạ em là trợ lý tự động của shop.') + '\n' + tra_loi
    lan_cuoi[cid] = time.time()
    zalo('sendMessage', chat_id=cid, text=tra_loi[:2000])

while True:
    try:
        j = zalo('getUpdates', timeout='30')
        kq = j.get('result') if j.get('ok') else None
        for u in (kq if isinstance(kq, list) else [kq] if kq else []):
            xu_ly(u)
    except Exception as e:
        print('Loi:', type(e).__name__, flush=True)
        time.sleep(5)
EOF
Lệnh TermiusCopy cả khối → dán vào Termius → Enter
mkdir -p ~/.config/systemd/user && cat > ~/.config/systemd/user/zalo-bridge.service <<'EOF'
[Unit]
Description=Cau noi Zalo Bot - Hermes
After=network-online.target
[Service]
ExecStart=/usr/bin/python3 %h/zalo-bridge/cau_noi.py
Restart=always
RestartSec=5
[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload && systemctl --user enable --now zalo-bridge
systemctl --user status zalo-bridge --no-pager

Nhắn thử bot từ Zalo. Xem nhật ký: journalctl --user -u zalo-bridge -n 50. Tạm tắt: systemctl --user stop zalo-bridge.

1.5. Báo bạn khi khách để lại số điện thoại

Dùng cùng mẫu script canh gác ở Phần 5 – D6, đổi đường dẫn file thành ~/zalo-bridge/khach-de-lai-sdt.txt và tên lịch thành "Khách Zalo".

Cầu nối xử lý những gì

Polling hay webhook? Zalo cho dùng một trong hai, không dùng cùng lúc. Tài liệu Zalo khuyên webhook cho môi trường chạy thật để không lỡ sự kiện. Khi lượng khách lớn, có thể chuyển sang webhook: thêm đường dẫn /zalo/ vào Caddy (Phần 4), gọi setWebhook với secret_token, và kiểm tra header X-Bot-Api-Secret-Token trong mọi yêu cầu.

Nguồn: Gọi API · getUpdates · sendMessage · Webhook · Nhóm (beta)

Cách 2 — Zalo OA cho doanh nghiệp nhiều khách

Zalo Official Account là kênh chính thức, không giới hạn 50 người như Zalo Bot, nhưng thiết lập phức tạp hơn. Những điều cần biết trước khi nhờ kỹ thuật viên (hoặc agent Tổng) dựng cầu nối:

Hạng mụcQuy định của Zalo
Gói dịch vụOA đã xác thực; Open API hiển thị ở gói Tăng trưởng, Toàn diện (bảng giá từ 01/06/2026)
Nhận tinWebhook HTTPS bằng tên miền đã xác thực với Zalo; sự kiện user_send_text…; header chữ ký X-ZEvent-Signature = sha256(appId + dữ liệu + timeStamp + OA secret key)
Thời gian phản hồi webhookTrả 200 trong 2 giây (xử lý sau); Zalo thử lại nhiều lần rồi tắt webhook nếu lỗi liên tục
Trả lời kháchTin tư vấn: POST https://openapi.zalo.me/v3.0/oa/message/cs, header access_token, tối đa 2.000 ký tự
Được gửi khi nàoKhách tương tác với OA trong 7 ngày; trong 48 giờ từ tương tác gần nhất thì miễn phí, sau đó tính phí (55đ/tin khi hết hạn mức gói)
Mã truy cậpAccess token sống 25 giờ; refresh token sống 3 tháng và chỉ dùng 1 lần — cầu nối phải lưu refresh token mới sau mỗi lần làm mới
Giới hạn tốc độTheo ứng dụng 4.000 yêu cầu/phút; theo gói OA: 100 (Tăng trưởng) – 2.000 (Toàn diện) yêu cầu/phút

Cầu nối OA có cấu trúc giống cầu nối Fanpage ở Phần 5 (nhận webhook, kiểm chữ ký, trả lời nhanh, xử lý sau, hỏi agent cskh). Gợi ý: nhắn agent Tổng trong Termius "Đọc tài liệu Zalo OA webhook và tin tư vấn, viết cầu nối dựa trên ~/meta-bridge/cau_noi.py, có lưu refresh token an toàn", rồi đọc kỹ và chạy thử trước khi dùng thật.

Nguồn: OA Webhook · Sự kiện tin nhắn · Gửi tin tư vấn · Điều kiện 7 ngày · 48 giờ · Xác thực · Bảng giá OA

Tin mẫu ZBS (ZNS): thông báo đơn hàng, lịch hẹn

ZBS Template Message (trước đây gọi là ZNS) gửi được theo số điện thoại, dùng cho tin giao dịch và hậu mãi, mẫu phải được Zalo duyệt trước. Cần OA, ứng dụng Zalo và tài khoản ZBS để thanh toán. Agent giúp soạn mẫu để nộp duyệt:

Tin nhắn TelegramCopy rồi dán vào khung chat với bot
Soạn 3 mẫu ZBS loại giao dịch cho <shop>: xác nhận đơn hàng, thông báo giao hàng, nhắc thanh toán.
Mỗi mẫu có biến <ten_khach>, <ma_don>, <thoi_gian>, <so_tien>; nội dung đúng tính chất giao dịch, không quảng cáo, dưới 400 ký tự.

Nguồn: Tổng quan tin nhắn – ZBS · Bảng giá

Vì sao Aduca không khuyên dùng Zalo cá nhân

Một số hướng dẫn trên mạng dùng thư viện không chính thức (giả lập Zalo Web, vd zca-js) để bot trả lời bằng tài khoản Zalo cá nhân. Chính tác giả thư viện cảnh báo việc này trái chính sách của Zalo và tài khoản có thể bị khoá. Ngoài ra mỗi tài khoản chỉ giữ được một phiên web, mở Zalo trên trình duyệt là bot ngắt.

Mất số Zalo bán hàng là mất toàn bộ khách và lịch sử trò chuyện — rủi ro không đáng. Hãy dùng Zalo Bot hoặc Zalo OA. Nếu vẫn thử nghiệm, chỉ dùng số phụ và không gửi tin hàng loạt.

Nguồn: zca-js README – cảnh báo

Pháp lý cần nhớ

Đây là tóm tắt tham khảo của Aduca, không phải tư vấn pháp lý.

Nguồn: Luật 91/2025/QH15 · Nghị định 356/2025 · Nghị định 91/2020

Tài liệu liên quan

Xem tất cả tài liệu hướng dẫn →

Học trực tiếp cùng Aduca

Muốn có đội AI Agent chạy thật cho doanh nghiệp?

Khóa Meta Ads AI Automation do Nguyễn Đức – Chủ tịch Aduca Group đào tạo trực tiếp 3 ngày: dựng AI Agent quảng cáo, nội dung, chăm sóc khách trên chính tài khoản của bạn, chọn công cụ (OpenClaw hoặc Hermes) phù hợp với đội của bạn.

Nguồn tham khảo

Thông tin kỹ thuật trong bài lấy từ các tài liệu dưới đây (đã ghi nguồn ngay dưới từng mục). Phần diễn giải, ví dụ và quy trình là của Aduca.

Lịch sử cập nhật

Miễn trừ trách nhiệm

Tài liệu này thuộc bộ tài liệu nội bộ Aduca dùng để triển khai AI Agent và giảng dạy, được chia sẻ công khai miễn phí cho mục đích học tập. Nội dung do Aduca viết mới, đối chiếu với tài liệu chính thức của Hermes Agent (Hermes v0.21.5 (24/09/2026)) và của các nền tảng liên quan tại ngày cập nhật; những chỗ là nhận định riêng của Aduca được ghi rõ.

  • Phần mềm của bên thứ ba: Hermes Agent là phần mềm mã nguồn mở (giấy phép MIT) do Nous Research phát triển. Aduca không phải đơn vị phát triển, đối tác hay đại diện của Nous Research. Telegram, Meta, Google, Zalo, TikTok, nhà cung cấp VPS và nhà cung cấp model AI là dịch vụ của bên thứ ba; lệnh, giao diện, giá và chính sách có thể thay đổi so với tài liệu.
  • Trách nhiệm của người áp dụng: bạn tự chịu trách nhiệm về VPS, tài khoản, mã bí mật, dữ liệu, chi phí phát sinh (VPS, API AI, ngân sách quảng cáo) và mọi hành động do Agent của bạn thực hiện. Đọc kỹ từng lệnh trước khi chạy, sao lưu trước khi thay đổi lớn.
  • Tuân thủ: khi Agent xử lý dữ liệu khách hàng, bạn có trách nhiệm tuân thủ điều khoản của từng nền tảng và pháp luật Việt Nam, bao gồm quy định về bảo vệ dữ liệu cá nhân. Các cách kết nối không chính thức (ví dụ Zalo cá nhân) có thể khiến tài khoản bị khoá.
  • Giới hạn trách nhiệm: trong phạm vi pháp luật cho phép, Aduca không chịu trách nhiệm cho thiệt hại trực tiếp hay gián tiếp (mất dữ liệu, lộ thông tin, khoá tài khoản, chi phí quảng cáo, gián đoạn kinh doanh…) phát sinh từ việc sử dụng tài liệu.
  • Không phải tư vấn chuyên sâu: tài liệu không thay thế đánh giá bảo mật chuyên nghiệp. Hệ thống quan trọng nên được chuyên gia rà soát riêng.
  • Không thu thập thông tin bí mật: Aduca không bao giờ yêu cầu bạn gửi token, mật khẩu, mã OTP hay file bí mật.
  • Bản quyền: © 2026 Công ty Cổ phần Giáo dục Aduca. Được trích dẫn khi ghi rõ nguồn aduca.vn. Hermes Agent, Nous Research và các nhãn hiệu nêu trên thuộc về chủ sở hữu tương ứng.