Panduan Lengkap Membangun WhatsApp Bot dengan Go dan Whatsmeow
Go (Golang) adalah bahasa yang sangat cocok untuk membangun WhatsApp gateway karena performanya yang tinggi dan kemampuan concurrency yang excellent.
Kenapa Go untuk WhatsApp Bot?
- High Performance — Compiled language, sangat cepat
- Concurrency — Goroutines untuk handle banyak pesan
- Low Memory — Efisien untuk long-running service
- Whatsmeow — Library Go terbaik untuk WhatsApp Web API
Setup Project
mkdir wa-bot && cd wa-bot
go mod init wa-bot
go get go.moe.whatsmeow@latest
go get github.com/mattn/go-sqlite3
Struktur Project
wa-bot/
├── main.go
├── handler/
│ ├── message.go
│ └── event.go
├── ai/
│ └── gemini.go
├── store/
│ └── database.go
└── config/
└── config.go
Koneksi WhatsApp
// main.go
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
_ "github.com/mattn/go-sqlite3"
"go.moe.whatsmeow"
"go.moe.whatsmeow/store/sqlstore"
waLog "go.moe.whatsmeow/util/log"
)
func main() {
// Setup database untuk session
dbLog := waLog.Stdout("Database", "DEBUG", true)
container, err := sqlstore.New("sqlite3",
"file:session.db?_journal_mode=WAL", dbLog)
if err != nil {
panic(err)
}
deviceStore, err := container.GetFirstDevice()
if err != nil {
panic(err)
}
// Buat client
client := whatsmeow.NewClient(deviceStore, nil)
// Register event handler
client.AddEventHandler(handleEvent)
// Connect
if client.Store.ID == nil {
// QR code login
qrChan, _ := client.GetQRChannel(context.Background())
err = client.Connect()
if err != nil {
panic(err)
}
for evt := range qrChan {
if evt.Event == "code" {
fmt.Println("QR Code:", evt.Code)
}
}
} else {
err = client.Connect()
if err != nil {
panic(err)
}
}
// Wait for interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
<-c
client.Disconnect()
}
Handler Pesan
// handler/message.go
package handler
import (
"fmt"
"strings"
"go.moe.whatsmeow"
"go.moe.whatsmeow/proto/waE2E"
"go.moe.whatsmeow/types/events"
"google.golang.org/protobuf/proto"
)
func HandleMessage(client *whatsmeow.Client, msg *events.Message) {
// Abaikan pesan dari diri sendiri
if msg.Info.IsFromMe {
return
}
text := msg.Message.GetConversation()
if text == "" {
text = msg.Message.GetExtendedTextMessage().GetText()
}
sender := msg.Info.Sender.String()
fmt.Printf("[%s] %s: %s\n", msg.Info.Timestamp, sender, text)
// Simple keyword auto-reply
lower := strings.ToLower(text)
var reply string
switch {
case strings.Contains(lower, "halo"),
strings.Contains(lower, "hi"):
reply = "Halo! Selamat datang di Digitcode Studio. Ada yang bisa dibantu?"
case strings.Contains(lower, "harga"),
strings.Contains(lower, "biaya"):
reply = "Untuk informasi harga, silakan hubungi tim kami:\n" +
"📧 digitcode.id@gmail.com\n📱 0813-1360-0301"
case strings.Contains(lower, "layanan"),
strings.Contains(lower, "service"):
reply = "Layanan kami:\n" +
"• Web Development\n" +
"• Mobile App Development\n" +
"• System Integration\n" +
"• IT Consulting\n\n" +
"Info lengkap: digitcode.id"
}
if reply != "" {
_, err := client.SendMessage(
context.Background(),
msg.Info.Chat,
&waE2E.Message{
Conversation: proto.String(reply),
},
)
if err != nil {
fmt.Println("Error sending:", err)
}
}
}
Integrasi AI (Gemini)
// ai/gemini.go
package ai
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
type GeminiService struct {
apiKey string
client *http.Client
}
func NewGeminiService() *GeminiService {
return &GeminiService{
apiKey: os.Getenv("GEMINI_API_KEY"),
client: &http.Client{},
}
}
func (g *GeminiService) GenerateReply(message string) (string, error) {
url := fmt.Sprintf(
"https://generativelanguage.googleapis.com/v1beta/models/" +
"gemini-2.0-flash:generateContent?key=%s",
g.apiKey,
)
body := map[string]any{
"contents": []map[string]any{
{
"role": "user",
"parts": []map[string]string{
{"text": message},
},
},
},
"systemInstruction": map[string]any{
"role": "user",
"parts": []map[string]string{
{"text": "Kamu adalah AI assistant untuk WhatsApp. " +
"Jawab singkat, jelas, bahasa Indonesia. Max 200 kata."},
},
},
}
jsonBody, _ := json.Marshal(body)
resp, err := g.client.Post(url, "application/json",
bytes.NewReader(jsonBody))
if err != nil {
return "", err
}
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
var result map[string]any
json.Unmarshal(data, &result)
// Extract text from response
candidates := result["candidates"].([]any)
if len(candidates) > 0 {
content := candidates[0].(map[string]any)["content"].(map[string]any)
parts := content["parts"].([]any)
if len(parts) > 0 {
return parts[0].(map[string]any)["text"].(string), nil
}
}
return "Maaf, saya tidak bisa memproses pesan ini.", nil
}
Tips Keamanan WhatsApp Bot
- Jangan spam — Ikuti rules WhatsApp untuk menghindari ban
- Rate limiting — Batasi jumlah pesan per menit
- Session management — Simpan session dengan aman
- Input sanitization — Bersihkan user input sebelum proses
- Error handling — Jangan crash saat dapat pesan unexpected
- Logging — Log semua aktivitas untuk troubleshooting
Kesimpulan
Go + Whatsmeow adalah kombinasi powerful untuk membangun WhatsApp Bot yang performant. Dengan integrasi Gemini AI, bot Anda bisa memberikan respons yang cerdas dan natural.
Di Digitcode, kami menggunakan stack ini untuk membangun WA Gateway Himawa yang mendukung multi-device, auto-post ke channel, dan AI reply.