Bagaimana bot ini berfungsi?
Ambil contoh kedai kek kecil di Bangsar, Kuala Lumpur. Setiap hari pelanggan bertanya soalan yang sama di WhatsApp: ada kek coklat tak, boleh hantar ke Petaling Jaya tak, perlu tempah berapa hari awal. Bot AI boleh menjawab soalan begini 24 jam, dan pemilik kedai hanya masuk bila ada tempahan sebenar.
Alirannya ringkas: pelanggan menghantar mesej → Meta menghantar mesej itu ke webhook (pelayan anda) → pelayan menghantar teks ke model AI melalui MaCloud AI → jawapan dihantar semula ke pelanggan melalui WhatsApp Cloud API.
Langkah-langkah membina bot
- Di Meta for Developers, cipta app dan tambah produk WhatsApp. Di sana anda akan mendapat access token, Phone number ID dan nombor ujian. Butiran tepat setiap skrin, ikut dokumentasi rasmi Meta.
- Di MaCloud AI, daftar, tambah nilai di Tambah nilai dan cipta kunci khas bernama
bot-whatsappdi API Key. - Sediakan pelayan Python dengan kod di bawah, pada pelayan yang boleh dicapai dari internet melalui HTTPS.
- Isi pemboleh ubah persekitaran: kunci MaCloud AI, access token WhatsApp, Phone number ID, verify token pilihan anda sendiri dan versi Graph API.
- Di tetapan WhatsApp dalam app Meta, isi alamat webhook (contohnya
https://bot.kedai-anda.my/webhook) dan verify token yang sama, kemudian langgan medanmessages. - Hantar mesej dari telefon anda ke nombor bot dan semak jawapannya. Semak kosnya di Penggunaan.
Verify token ialah perkataan rahsia yang anda cipta sendiri (contohnya kekbangsar2026), bukan token dari Meta dan bukan kunci API MaCloud AI. Ia mesti sama di app Meta dan dalam pemboleh ubah WA_VERIFY_TOKEN, kalau tidak pengesahan webhook akan gagal.
Kod pelayan Python lengkap
Pasang pakej dengan pip install flask openai requests, simpan kod ini sebagai bot.py:
import os
import requests
from flask import Flask, request
from openai import OpenAI
app = Flask(__name__)
ai = OpenAI(base_url="https://api.macloudai.com/v1", api_key=os.environ["MACLOUD_KEY"])
VERIFY_TOKEN = os.environ["WA_VERIFY_TOKEN"]
WA_TOKEN = os.environ["WA_TOKEN"]
PHONE_ID = os.environ["WA_PHONE_ID"]
GRAPH_VERSION = os.environ["WA_GRAPH_VERSION"] # contoh: v21.0, semak versi semasa di dokumentasi Meta
ARAHAN = (
"Anda pembantu WhatsApp untuk Kedai Kek Seri Bangsar, Kuala Lumpur. "
"Jawab dalam bahasa pelanggan (Melayu, Inggeris atau Cina), ringkas dan mesra. "
"Menu: kek coklat moist, kek red velvet, kek pandan gula melaka, cupcake. "
"Waktu buka: Selasa hingga Ahad, 10 pagi hingga 8 malam. "
"Tempahan kek hari jadi perlu dibuat sekurang-kurangnya 2 hari awal. "
"Penghantaran sekitar Kuala Lumpur dan Petaling Jaya. "
"Jangan sahkan harga, bayaran atau tempahan sendiri; untuk itu katakan staf akan membalas."
)
sejarah = {} # nombor -> mesej terkini (dalam memori sahaja)
@app.get("/webhook")
def sahkan():
if request.args.get("hub.mode") == "subscribe" and request.args.get("hub.verify_token") == VERIFY_TOKEN:
return request.args.get("hub.challenge", "")
return "forbidden", 403
@app.post("/webhook")
def terima():
data = request.get_json(silent=True) or {}
for entry in data.get("entry", []):
for change in entry.get("changes", []):
for msg in change.get("value", {}).get("messages", []):
if msg.get("type") == "text":
balas(msg["from"], msg["text"]["body"])
return "ok", 200
def balas(nombor, teks):
h = sejarah.setdefault(nombor, [])
h.append({"role": "user", "content": teks})
del h[:-10] # simpan 10 mesej terakhir sahaja supaya token tidak membengkak
try:
r = ai.chat.completions.create(
model="gem-3.8-flash",
messages=[{"role": "system", "content": ARAHAN}] + h,
max_tokens=400,
)
jawapan = r.choices[0].message.content
except Exception:
jawapan = "Maaf, sistem kami sibuk sebentar. Staf kami akan membalas secepat mungkin."
h.append({"role": "assistant", "content": jawapan})
requests.post(
f"https://graph.facebook.com/{GRAPH_VERSION}/{PHONE_ID}/messages",
headers={"Authorization": "Bearer " + WA_TOKEN},
json={"messaging_product": "whatsapp", "to": nombor, "type": "text", "text": {"body": jawapan}},
timeout=15,
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Kod ini sengaja dibuat ringkas: sejarah perbualan disimpan dalam memori dan hilang bila pelayan dimulakan semula. Untuk kedai sebenar, simpan sejarah dalam pangkalan data kecil seperti SQLite, dan jalankan balas() di latar belakang supaya webhook terus memulangkan 200 kepada Meta.
Jalankan pelayan
export MACLOUD_KEY=sk-...
export WA_TOKEN=token-dari-meta
export WA_PHONE_ID=phone-number-id-anda
export WA_VERIFY_TOKEN=kekbangsar2026
export WA_GRAPH_VERSION=v21.0
python bot.py
Meta memerlukan alamat HTTPS. Anda boleh letak pelayan di VPS kecil dengan sijil HTTPS, atau semasa ujian, guna alat terowong yang memberi alamat HTTPS sementara ke port 8000 di komputer anda.
Berapa kos AI setiap sembang?
Satu soalan pelanggan biasanya pendek, tetapi setiap panggilan turut menghantar arahan sistem dan sejarah sembang. Sebagai anggaran kasar, satu balasan mungkin guna kira-kira seribu hingga dua ribu token input dan beberapa ratus token output. Kosnya ialah token input × harga input + token output × harga output, ikut harga semasa:
Harga sebenar sekarang
Anggaran daripada harga di halaman model: 2,000 token input dan 500 token output bagi setiap chat. Caj sebenar dipaparkan dalam konsol.
| Model | Setiap chat | 1,000 chat |
|---|---|---|
| GEM 3.8 Flash | RM 0.001 | RM 0.99 |
| TT-6 Luna | RM 0.0024 | RM 2.38 |
| TT-6.1 Terra | RM 0.0016 | RM 1.63 |
| HK-5.5 | RM 0.0008 | RM 0.78 |
| GEM 4 Argon | RM 0.02 | RM 18.94 |
| TT-6.1 Sol | RM 0.0033 | RM 3.25 |
Cara paling tepat: biarkan bot berjalan sehari, kemudian buka Penggunaan dan bahagikan jumlah kos dengan bilangan balasan. Untuk soalan kedai yang mudah, model yang lebih murah biasanya sudah memadai; baca cara memilih model.
Kos di pihak Meta (contohnya caj perbualan atau mesej templat) adalah berasingan dan ikut polisi serta harga Meta. Ia tidak ditolak daripada baki MaCloud AI. Semak syarat terkini di dokumentasi WhatsApp Business rasmi.
Tip supaya bot berguna dan selamat
- Tulis maklumat kedai yang betul dalam arahan sistem: menu, waktu buka, kawasan penghantaran. AI hanya tahu apa yang anda beritahu.
- Larang bot mengesahkan harga, bayaran atau tempahan sendiri. Biar staf yang mengesahkan.
- Hadkan
max_tokensdan bilangan mesej sejarah supaya kos setiap sembang kekal kecil. - Simpan kunci dalam pemboleh ubah persekitaran, bukan dalam kod. Kalau kunci bocor, padam di konsol dan cipta yang baharu.
- Ikut polisi WhatsApp Business Meta, termasuk peraturan bila anda boleh menghantar mesej kepada pelanggan.
Boleh guna untuk Telegram atau laman web?
Boleh. Bahagian AI (fungsi balas) tetap sama; yang berubah hanya cara menerima dan menghantar mesej. Contoh tetapan SDK lain ada di dokumentasi, dan kalau anda baru bermula, baca dahulu satu kunci untuk semua model.
Soalan lazim
Q1Adakah saya perlu WhatsApp Business API yang berbayar?
Q2Bolehkah bot menjawab dalam Bahasa Melayu, Inggeris dan Cina?
Q3Model mana yang sesuai untuk bot kedai?
Q4Adakah isi sembang pelanggan disimpan oleh MaCloud AI?
Q5Apa jadi kalau baki habis?
Panduan lain
- API Claude dan ChatGPT dengan satu kunci, bayar ikut penggunaan
- Cara mula guna Claude Code dengan kunci API MaCloud AI
- Pilih Claude, GPT, Gemini atau DeepSeek: model mana untuk anda?
Bagaimana kos API AI dikira ikut token (dengan contoh)
Bayar ikut penggunaan vs langganan AI bulanan: mana lebih jimat?