Aduca Hướng dẫn Agent tạo webapp với OpenClaw
Agent lập trình giúp người không biết code tạo landing page, form thu khách hàng tiềm năng, máy tính giá, trang tra cứu đơn, mini CRM — xem thử an toàn rồi đưa lên mạng miễn phí bằng Cloudflare Pages. Quy trình nội bộ Aduca, chia sẻ cho học viên · Cập nhật 02/10/2026
Agent tạo webapp làm được gì
| Loại webapp | Dùng cho | Độ khó |
|---|---|---|
| Landing page sản phẩm / khoá học / sự kiện | Chạy quảng cáo, thu khách | Dễ |
| Form đăng ký → Google Sheets + báo Telegram | Thu khách tiềm năng không cần máy chủ | Dễ |
| Máy tính giá / phí ship / học phí, báo giá nhanh | Tăng chuyển đổi trên website | Dễ |
| Trang khảo sát, quiz chọn sản phẩm, vòng quay voucher | Tương tác, thu thập nhu cầu | Trung bình |
| Trang tra cứu đơn hàng/bảo hành theo mã | Chăm sóc khách sau bán | Trung bình |
| Mini CRM nội bộ đọc Google Sheet (danh sách khách, trạng thái) | Đội sale | Trung bình (cần khoá truy cập) |
Agent viết toàn bộ mã; bạn chỉ cần mô tả rõ mình muốn gì, xem thử và góp ý. Webapp chạy miễn phí trên Cloudflare Pages.
Hiểu nhanh 4 khái niệm
| Khái niệm | Hiểu đơn giản | Quy tắc an toàn |
|---|---|---|
| Giao diện (frontend) | HTML/CSS/JS chạy trên điện thoại của khách | Ai cũng xem được mã → không bao giờ chứa mã bí mật |
| Xử lý phía sau (backend) | Nơi nhận dữ liệu form, gọi Telegram, ghi Sheet. Ở đây dùng Google Apps Script | Mã bí mật để trong Script Properties, không để trong mã |
| Lưu trữ web (hosting) | Cloudflare Pages: đưa thư mục web lên, có địa chỉ tên.pages.dev | Bật HTTPS (mặc định) |
| Tên miền | vd khuyenmai.tenmien.vn trỏ về Pages | Tuỳ chọn |
Tạo Agent Web
Bước 1 — Tạo Agent Web với bot Telegram riêng
Làm giống mục 6 hướng dẫn gốc. Tạo bot mới ở @BotFather (/newbot), lưu token vào trình quản lý mật khẩu. Mã Agent: web.
Khối 1 — tạo Agent với thư mục làm việc riêng:
openclaw agents add web --workspace ~/.openclaw/workspace-webKhối 2 — nhập token bot vào ô ẩn (chạy riêng):
openclaw secrets store set TG_WEB_TOKEN --kind secret # dán token bot → EnterKhối 3 — thêm bot, nối với Agent, đặt quyền: được chạy lệnh nhưng phải hỏi bạn trước lệnh lạ:
openclaw config set channels.telegram.accounts.web '{"enabled":true,"botToken":{"source":"store","provider":"default","id":"TG_WEB_TOKEN"}}' --strict-json --merge
openclaw agents bind --agent web --bind telegram:web
openclaw config set agents.entries.web.tools.profile '"coding"' --strict-json
openclaw config set agents.entries.web.tools.exec.mode '"ask"' --strict-json # hỏi trước khi chạy lệnh lạ
openclaw gateway restartNhắn "hi" cho bot mới → bot trả mã 8 ký tự → duyệt: openclaw pairing approve telegram <CODE> --account web.
Khối 4 — giao vai trò (tin nhắn này không chứa bí mật):
Hãy cập nhật SOUL.md, IDENTITY.md và AGENTS.md của bạn:
- Tên: Web. Bạn là lập trình viên web của <tên doanh nghiệp>, làm webapp đơn giản, nhanh, chạy tốt trên điện thoại.
- Mỗi dự án một thư mục trong ~/.openclaw/workspace-web/du-an/<tên-dự-án>/, có file README.md ghi cách chạy.
- Ưu tiên HTML/CSS/JavaScript thuần, ít thư viện. Giao diện tiếng Việt, chữ dễ đọc, nút bấm lớn.
- TUYỆT ĐỐI không đặt mã bí mật (token, mật khẩu, API key) trong mã chạy trên trình duyệt.
- Trước khi đưa lên mạng: kiểm tra trên màn hình điện thoại, kiểm tra form, quét mã nguồn tìm mã bí mật, chờ tôi trả lời "DUYỆT".
- Không tự cài phần mềm hệ thống, không mở cổng ra Internet, không xoá thư mục ngoài dự án.
- Không in, ghi ra file hay gửi mã bí mật; không yêu cầu tôi gửi mã bí mật qua chat.Duyệt lệnh ngay trong Telegram (làm 1 lần cho cả bộ)
Agent có quyền chạy lệnh ở chế độ ask sẽ xin phép trước lệnh lạ. Để nhận yêu cầu duyệt ngay trong Telegram: lấy Telegram user ID của bạn (nhắn @userinfobot, nó trả về một dãy số) rồi chạy:
openclaw config set channels.telegram.execApprovals '{"enabled":true,"approvers":["<Telegram user ID>"]}' --strict-json --merge
openclaw gateway restartKhi Agent xin chạy lệnh, bot gửi nút Cho phép 1 lần / Luôn cho phép / Từ chối hoặc dòng /approve <id> allow-once. Đọc kỹ lệnh trước khi duyệt; lệnh có rm, curl … | bash, gửi dữ liệu ra ngoài → hỏi lại Agent vì sao cần. Chi tiết: Exec approvals.
Agent Web cần chạy lệnh (tạo file, chạy máy chủ xem thử) nên ở chế độ hỏi trước. Với dự án lớn, có thể giao cho Agent lập trình chuyên dụng (Claude Code, Codex…) chạy qua OpenClaw — xem ACP agents; người mới chưa cần.
Quy trình 6 bước làm 1 webapp
Bước 1 — Mô tả yêu cầu (càng rõ càng tốt)
Tạo dự án "landing-khoa-hoc": landing page 1 trang cho khoá học <tên khoá>.
- Khách hàng: <chân dung>. Màu chủ đạo: <mã màu>. Logo: tôi gửi kèm ảnh.
- Các phần: tiêu đề + lợi ích chính, 3 lợi ích, nội dung khoá học, giảng viên, cảm nhận học viên,
học phí + ưu đãi, câu hỏi thường gặp, form đăng ký (họ tên, số điện thoại, nhu cầu).
- Ưu tiên điện thoại, tải nhanh, ảnh nén WebP, có thẻ title/description/og:image.
- Form gửi tới địa chỉ Apps Script tôi sẽ gửi sau (để trống trước).
Dựng bản đầu và báo tôi cách xem thử.Bước 2 — Agent dựng bản đầu
Agent tạo thư mục ~/.openclaw/workspace-web/du-an/landing-khoa-hoc/. Khi Agent xin chạy lệnh (tạo file, nén ảnh…), đọc và duyệt.
Bước 3 — Xem thử (2 cách)
Cách A (dễ nhất): nhắn bot "Nén thư mục dự án thành file zip và gửi tôi" → giải nén trên máy → mở index.html.
Cách B (xem trực tiếp trên VPS): nhắn bot "Chạy máy chủ xem thử cho dự án ở cổng 8080, chỉ nghe 127.0.0.1", rồi trên laptop mở đường hầm và vào http://127.0.0.1:8080:
ssh -N -L 8080:127.0.0.1:8080 openclaw@<IP_VPS>Không mở cổng 8080 ra Internet (không chạy ufw allow 8080).
Bước 4 — Góp ý và sửa
Sửa landing-khoa-hoc: phần tiêu đề chữ to hơn trên điện thoại, nút "Đăng ký" luôn hiện ở cuối màn hình,
đổi ảnh giảng viên sang file tôi gửi kèm, rút gọn phần câu hỏi còn 6 câu.Bước 5 — Kiểm tra trước khi đưa lên mạng
Kiểm tra landing-khoa-hoc trước khi đưa lên mạng và báo cáo từng mục ĐẠT/CHƯA:
1. Quét toàn bộ mã tìm mã bí mật (token, key, mật khẩu, chuỗi dài lạ) — phải không có.
2. Hiển thị đúng ở chiều rộng 360px và 1280px, không tràn ngang.
3. Form: bắt buộc nhập, kiểm tra số điện thoại, có ô bẫy chống bot, có ô đồng ý và link chính sách quyền riêng tư.
4. Tất cả liên kết và ảnh hoạt động; tổng dung lượng trang dưới 1,5 MB.
5. Có title, description, og:image, favicon.- Đã xem trên điện thoại thật
- Đã gửi thử form và thấy dữ liệu trong Google Sheet
- Agent báo không có mã bí mật trong mã nguồn
- Có chính sách quyền riêng tư nếu thu thập số điện thoại/email
Bước 6 — Đưa lên mạng
Xem mục "Đưa lên Cloudflare Pages" bên dưới.
Form thu khách → Google Sheets + báo Telegram
Dùng Google Apps Script làm phần xử lý phía sau: miễn phí, không cần máy chủ, dữ liệu vào thẳng Google Sheet của bạn.
Bước 1 — Tạo Sheet và Apps Script
- Tạo Google Sheet
Khách từ webapp. - Menu Tiện ích mở rộng → Apps Script.
- Xoá mã mẫu, dán đoạn mã dưới, bấm Lưu.
// Aduca – nhận form từ webapp, ghi vào Google Sheet và báo Telegram
// Token bot báo tin KHÔNG nằm trong mã: lưu ở Project Settings → Script Properties
function doPost(e) {
const d = JSON.parse(e.postData.contents || '{}');
if (d.website) return ok_(); // ô bẫy chống bot: người thật để trống
const ten = String(d.ten || '').slice(0, 100);
const sdt = String(d.sdt || '').replace(/[^0-9+]/g, '').slice(0, 15);
if (!ten || sdt.length < 9) return ok_();
const sh = SpreadsheetApp.getActive().getSheetByName('Khach') || SpreadsheetApp.getActive().insertSheet('Khach');
sh.appendRow([new Date(), ten, sdt, String(d.nhucau || '').slice(0, 500), String(d.nguon || '')]);
const p = PropertiesService.getScriptProperties();
const token = p.getProperty('TG_TOKEN'), chat = p.getProperty('TG_CHAT');
if (token && chat) {
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/sendMessage', {
method: 'post', contentType: 'application/json', muteHttpExceptions: true,
payload: JSON.stringify({ chat_id: chat, text: 'Khách mới: ' + ten + ' – ' + sdt.slice(0, 4) + '***' + sdt.slice(-3) })
});
}
return ok_();
}
function ok_() {
return ContentService.createTextOutput('{"ok":true}').setMimeType(ContentService.MimeType.JSON);
}Bước 2 — Lưu token bot báo tin vào Script Properties (không đặt trong mã)
- Tạo 1 bot Telegram riêng chỉ để báo tin (không dùng bot của Agent).
- Apps Script → Cài đặt dự án (biểu tượng bánh răng) → Thuộc tính tập lệnh → Thêm:
TG_TOKEN= token bot báo tin,TG_CHAT= ID nhóm Telegram nhận tin. Bạn tự nhập trong trang của Google — không gửi qua chat. - Tin báo chỉ hiện 4 số đầu và 3 số cuối điện thoại khách; số đầy đủ nằm trong Sheet.
Bước 3 — Triển khai
- Triển khai → Tùy chọn triển khai mới → Loại: Ứng dụng web.
- Thực thi dưới dạng: Tôi; Người có quyền truy cập: Bất kỳ ai → Triển khai → cấp quyền.
- Copy URL ứng dụng web (dạng
https://script.google.com/macros/s/…/exec). URL này không phải mã bí mật — gửi cho Agent được.
Bước 4 — Nối form với Apps Script
Nối form của landing-khoa-hoc với Apps Script: URL <URL ứng dụng web>.
Gửi bằng fetch POST, Content-Type text/plain (tránh lỗi CORS), dữ liệu JSON gồm ten, sdt, nhucau, nguon (lấy utm_source trên URL),
website (ô bẫy ẩn). Gửi xong hiện lời cảm ơn; lỗi mạng thì báo khách gọi hotline <số>.Gửi thử form → dòng mới xuất hiện trong Sheet, nhóm Telegram nhận tin là đạt. Sửa mã Apps Script thì phải Triển khai → Quản lý triển khai → Chỉnh sửa → Phiên bản mới.
Đưa lên Cloudflare Pages
Cách 1 (khuyên dùng cho người mới) — Kéo thả trên web
- Nhắn bot: "Nén thư mục dự án landing-khoa-hoc (chỉ các file web) thành zip và gửi tôi".
- Đăng nhập Cloudflare (tài khoản miễn phí) → Workers & Pages → Create → Pages → Upload assets.
- Đặt tên dự án (vd
landing-khoa-hoc) → kéo thả file zip/thư mục → Deploy. - Mở
https://landing-khoa-hoc.pages.devkiểm tra. Lần sau cập nhật: vào dự án → Create deployment → tải bản mới. - Gắn tên miền: dự án → Custom domains → Set up a domain (vd
khoahoc.tenmien.vn).
Cách 2 — Agent tự đưa lên bằng token giới hạn quyền
- Cloudflare → My Profile → API Tokens → Create Token → Custom token.
- Quyền: Account · Cloudflare Pages · Edit (chỉ quyền này). Account resources: chỉ tài khoản của bạn. Có thể đặt thời hạn.
- Create Token → copy (chỉ hiện 1 lần) → nhập bằng khung đỏ:
openclaw secrets store set CLOUDFLARE_API_TOKEN --kind secret # dán token Cloudflare → Enteropenclaw secrets store set CLOUDFLARE_API_TOKEN --allow-host api.cloudflare.com
openclaw secrets store set CLOUDFLARE_ACCOUNT_ID --kind env --value <Account ID> # Cloudflare → trang tổng quan → Account ID
openclaw gateway restartKhi tôi trả lời "DUYỆT" mới đưa landing-khoa-hoc lên mạng bằng lệnh:
npx wrangler pages deploy ./ --project-name landing-khoa-hoc (chạy trong thư mục dự án, chỉ các file web).
Dùng biến $CLOUDFLARE_API_TOKEN có sẵn, không in giá trị. Gửi tôi địa chỉ bản vừa đưa lên.Token này chỉ đưa web lên Pages được, không sửa DNS hay tài khoản. Nếu lệnh báo lỗi kết nối/chứng chỉ khi đi qua proxy bí mật, quay về Cách 1.
Mẫu yêu cầu cho các webapp hay dùng
Máy tính giá / phí ship
Tạo dự án "bao-gia": khách chọn sản phẩm <danh sách + giá>, số lượng, khu vực giao hàng (bảng phí <…>),
hiện tổng tiền, ưu đãi theo số lượng, nút "Nhận báo giá qua Zalo" mở zalo.me/<số> kèm nội dung đơn.Quiz chọn sản phẩm
Tạo dự án "quiz-chon-san-pham": 5 câu hỏi trắc nghiệm về nhu cầu, cuối cùng gợi ý 1 trong 3 sản phẩm <…>
kèm lý do, nút mua và form để lại số điện thoại (nối Apps Script như dự án landing).Tra cứu đơn hàng
Tạo dự án "tra-cuu-don": khách nhập mã đơn + 4 số cuối điện thoại, trang gọi Apps Script (doGet) đọc Sheet "Don hang"
và chỉ trả về trạng thái, ngày giao dự kiến — không trả tên, địa chỉ. Giới hạn 10 lần tra cứu/phút.Mini CRM nội bộ
Tạo dự án "crm-noi-bo": bảng danh sách khách từ Sheet "Khach", lọc theo trạng thái, nút đổi trạng thái
(mới / đã gọi / hẹn / chốt / không mua), ghi chú. Đọc/ghi qua Apps Script. Trang này dành cho nội bộ.An toàn và sao lưu dự án
- Mã chạy trên trình duyệt là công khai: không đặt token, mật khẩu, API key, link Sheet nội bộ có quyền sửa.
- Dữ liệu khách nằm trong Google Sheet của bạn; chỉ chia sẻ Sheet cho người cần.
- Thu thập số điện thoại/email: có ô đồng ý và link chính sách quyền riêng tư.
- Thư mục dự án nằm trong
~/.openclaw/nên đã có trong bản sao lưu hằng ngày (mục 5b hướng dẫn gốc). Nhờ Agent giữ thêm bản nén theo phiên bản trước mỗi lần đưa lên mạng. - Cloudflare Pages lưu lịch sử các lần đưa lên: bản mới lỗi thì vào dự án → Deployments → chọn bản cũ → Rollback.
Lỗi thường gặp & cách sửa
| Hiện tượng | Nguyên nhân | Cách sửa |
|---|---|---|
| Form báo lỗi CORS | Gửi JSON với Content-Type application/json tới Apps Script | Dùng Content-Type text/plain như mẫu |
| Sheet không có dòng mới | Triển khai sai: "Thực thi dưới dạng" hoặc "Ai có quyền" chưa đúng; quên tạo phiên bản mới sau khi sửa mã | Triển khai lại theo Bước 3 |
| Không nhận tin Telegram | Sai TG_TOKEN/TG_CHAT, bot chưa được thêm vào nhóm | Kiểm tra Script Properties, thêm bot vào nhóm |
| pages.dev báo 404 | Tải lên thư mục cha, file index.html không nằm ở gốc | Nén đúng thư mục có index.html ở ngoài cùng |
| Sửa rồi mà web vẫn cũ | Trình duyệt giữ bản cũ | Tải lại trang (Ctrl/Cmd+Shift+R), đổi tên file ảnh/CSS khi cập nhật |
| Agent không xem thử được | Chưa duyệt lệnh chạy máy chủ, hoặc chưa mở đường hầm SSH | Duyệt trong Telegram; chạy lệnh khung tím |
Muốn dựng độ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: cài OpenClaw, dựng Agent quảng cáo, nội dung, chốt sale, kế toán trên chính tài khoản của bạn.
Nguồn
- Cloudflare Pages – Direct Upload
- Cloudflare Pages – Custom domains
- Cloudflare – Tạo API token
- Cloudflare Access (bảo vệ trang nội bộ)
- Google Apps Script – Web apps
- Apps Script – Script Properties
- OpenClaw – ACP agents (Claude Code, Codex…)
- Aduca – Hướng dẫn cài đặt OpenClaw trên VPS (nền tảng)
Miễn trừ trách nhiệm
Tài liệu này là quy trình nội bộ Aduca đang sử dụng để triển khai AI Agent và giảng dạy trong các lớp AI Agent, được chia sẻ công khai miễn phí cho mục đích học tập và tham khảo. Nội dung được đối chiếu với tài liệu chính thức của OpenClaw và của các nền tảng liên quan tại thời điểm cập nhật (02/10/2026).
- Phần mềm của bên thứ ba: OpenClaw là phần mềm mã nguồn mở do cộng đồng phát triển, không thuộc sở hữu của Aduca. Các plugin cộng đồng, Telegram, Zalo, Meta, Google, TikTok và nhà cung cấp VPS/AI là dịch vụ của bên thứ ba. Aduca không bảo đảm các phần mềm, dịch vụ này hoạt động liên tục, không lỗi hay không thay đổi; lệnh, giao diện và chính sách có thể khác 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. Hãy kiểm tra từng lệnh trước khi chạy, thử trên môi trường thử nghiệm và sao lưu trước mọi thay đổi.
- 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. Kết nối Zalo cá nhân là cách không chính thức và 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 bất kỳ thiệt hại trực tiếp hay gián tiếp nào (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 này.
- 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 hoặc xử lý nhiều dữ liệu khách hà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. OpenClaw và các nhãn hiệu nêu trên thuộc về chủ sở hữu tương ứng.