Pendahuluan
Layanan pelanggan yang responsif 24/7 menjadi keharusan di era digital. Tutorial ini menjelaskan cara membangun AI Customer Service di WhatsApp dengan:
- WhatsApp Cloud API (Meta) untuk mengirim/terima pesan.
- Python Flask sebagai server webhook.
- ChatGPT Plus sebagai otak percakapan AI (ChatGPT Plus).
- Opsional: Claude Pro, Gemini Advanced, atau Perplexity Pro untuk model alternatif.
Arsitektur singkat:
User → WhatsApp Cloud API → Webhook (Flask) → AI Model (ChatGPT) → Response → WhatsApp → User
Prasyarat & Persiapan
| Kebutuhan | Detail | Link |
|---|---|---|
| Akun Meta for Developers | Daftar, buat aplikasi, aktifkan WhatsApp Cloud API | https://developers.facebook.com/docs/whatsapp/cloud-api |
| Token Akses & Phone Number ID | Diperoleh dari dashboard Meta | — |
| Server Linux/VM (Ubuntu 22.04+) | Untuk menjalankan Flask & ngrok | — |
| Python ≥3.9 | Virtualenv disarankan | — |
| OpenAI API Key (ChatGPT Plus) | Dapatkan di akun ChatGPT Plus | ChatGPT Plus |
| Ngrok (untuk expose localhost) | npm i -g ngrok atau download binary |
— |
| (Opsional) Notion AI untuk prompt engineering | Membantu merumuskan prompt yang efektif | Notion AI |
Instalasi dasar
# Update sistem
sudo apt update && sudo apt upgrade -y
# Install Python & pip
sudo apt install -y python3 python3-venv python3-pip
# Buat virtualenv
python3 -m venv venv
source venv/bin/activate
# Install dependensi Python
pip install flask requests python-dotenv
Langkah Demi Langkah
Step 1 – Siapkan Project Struktur
mkdir whatsapp-ai-bot && cd whatsapp-ai-bot
touch app.py .env requirements.txt
.env (jangan commit ke repo!)
WHATSAPP_TOKEN=YOUR_WHATSAPP_CLOUD_API_TOKEN
PHONE_NUMBER_ID=YOUR_PHONE_NUMBER_ID
OPENAI_API_KEY=YOUR_CHATGPT_PLUS_API_KEY
VERIFY_TOKEN=some_random_string # untuk webhook verification
Step 2 – Buat Flask Webhook
# app.py
import os
import json
import requests
from flask import Flask, request, abort
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
WHATSAPP_TOKEN = os.getenv("WHATSAPP_TOKEN")
PHONE_NUMBER_ID = os.getenv("PHONE_NUMBER_ID")
VERIFY_TOKEN = os.getenv("VERIFY_TOKEN")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
WHATSAPP_API_URL = f"https://graph.facebook.com/v16.0/{PHONE_NUMBER_ID}/messages"
def call_chatgpt(prompt: str) -> str:
headers = {
"Authorization": f"Bearer {OPENAI_API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "gpt-4o-mini", # model yang tersedia di ChatGPT Plus
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 300,
"temperature": 0.7
}
resp = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data)
resp.raise_for_status()
return resp.json()["choices"][0]["message"]["content"].strip()
def send_whatsapp_message(to: str, text: str):
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "text",
"text": {"body": text}
}
headers = {"Authorization": f"Bearer {WHATSAPP_TOKEN}", "Content-Type": "application/json"}
r = requests.post(WHATSAPP_API_URL, headers=headers, json=payload)
r.raise_for_status()
return r.json()
@app.route("/webhook", methods=["GET", "POST"])
def webhook():
if request.method == "GET":
# Verifikasi webhook
mode = request.args.get("hub.mode")
token = request.args.get("hub.verify_token")
challenge = request.args.get("hub.challenge")
if mode == "subscribe" and token == VERIFY_TOKEN:
return challenge, 200
else:
abort(403)
if request.method == "POST":
data = request.get_json()
# Pastikan pesan masuk
try:
entry = data["entry"][0]
changes = entry["changes"][0]
value = changes["value"]
messages = value.get("messages")
if not messages:
return "no message", 200
msg = messages[0]
phone_number = msg["from"]
text = msg["text"]["body"]
# Call AI
reply = call_chatgpt(text)
# Kirim balasan
send_whatsapp_message(phone_number, reply)
except Exception as e:
app.logger.error(f"Error processing webhook: {e}")
return "ok", 200
if __name__ == "__main__":
app.run(port=5000, debug=False)
Step 3 – Expose Webhook dengan Ngrok
ngrok http 5000
Catat URL HTTPS yang diberikan, misalnya https://abcd1234.ngrok.io.
Step 4 – Daftarkan Webhook di Meta Dashboard
- Buka WhatsApp Cloud API → Webhooks.
- Masukkan URL:
https://abcd1234.ngrok.io/webhook. - Pilih messages dan message_deliveries.
- Masukkan Verify Token yang sama dengan
VERIFY_TOKENdi.env. - Simpan.
Step 5 – Uji Bot
Kirim pesan WhatsApp ke nomor bisnis yang terhubung. Bot akan merespon dengan output dari ChatGPT Plus.
Step 6 – Deploy ke Production
Untuk produksi, gunakan layanan VPS atau platform seperti Render, Fly.io, atau DigitalOcean App Platform. Pastikan:
- Port 443 (HTTPS) terbuka.
- Sertifikat TLS valid (Let’s Encrypt atau Cloudflare).
- Variabel lingkungan disimpan aman (Docker secrets, env files dengan permission 600).
Contoh Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 443
CMD ["gunicorn", "-b", "0.0.0.0:443", "app:app"]
Tips Optimasi & Keamanan
| Area | Best Practice |
|---|---|
| Rate Limiting | Tambahkan middleware Flask‑Limiter untuk melindungi API OpenAI dari spam. |
| Prompt Engineering | Gunakan Notion AI untuk menyusun prompt standar (mis. “Berikan jawaban singkat, sopan, dan sertakan CTA”). |
| Caching | Simpan respons AI untuk pertanyaan berulang selama 5 menit dengan Redis. |
| Logging | Gunakan struktur JSON log (mis. python-json-logger) agar mudah di‑integrasi dengan ELK. |
| Secrets Management | Pada cloud, gunakan Vault atau AWS Secrets Manager; hindari menaruh kunci di repo. |
| Scalability | Deploy dengan Gunicorn + Uvicorn workers atau gunakan Kubernetes Horizontal Pod Autoscaler. |
| Compliance | Pastikan data pribadi (nama, nomor) dienkripsi saat disimpan atau diproses. |
Troubleshooting Error Umum
| Error | Penyebab | Solusi |
|---|---|---|
401 Unauthorized pada panggilan WhatsApp API |
Token atau Phone Number ID salah / kadaluarsa | Regenerasi token di Meta Dashboard, periksa .env. |
429 Too Many Requests dari OpenAI |
Rate limit terlampaui | Implementasikan exponential backoff & queue (Celery). |
| Ngrok disconnects | Tunnel timeout atau limit free tier | Upgrade ke ngrok paid atau gunakan reverse proxy di VPS. |
| Webhook verification fails | Verify token tidak cocok | Pastikan VERIFY_TOKEN di .env sama persis dengan yang di Meta. |
JSONDecodeError pada response OpenAI |
Response tidak JSON (mis. error HTML) | Tambahkan resp.raise_for_status() dan log resp.text untuk debugging. |
Kesimpulan
Dengan WhatsApp Cloud API, Flask, dan model bahasa ChatGPT Plus, Anda dapat meluncurkan layanan pelanggan AI 24/7 dalam hitungan jam. Integrasi tambahan seperti Claude Pro, Gemini Advanced, atau Perplexity Pro memungkinkan fleksibilitas model. Ikuti praktik keamanan, caching, dan monitoring untuk memastikan bot tetap responsif dan aman di lingkungan produksi.
Referensi tools:
- ChatGPT Plus untuk model bahasa utama.
- Notion AI membantu merumuskan prompt yang konsisten.
- Ngrok untuk pengujian lokal.
- Docker untuk containerization.
Selamat membangun!