Kembali ke Blog1 April 2026

Panduan Lengkap Membangun WhatsApp Bot dengan Go dan Whatsmeow

Tutorial step-by-step membangun WhatsApp Bot menggunakan Go (Golang) dan library Whatsmeow dengan fitur auto-reply, multi-device, dan AI integration.

Panduan Lengkap Membangun WhatsApp Bot dengan Go dan Whatsmeow

Panduan Lengkap Membangun WhatsApp Bot dengan Go dan Whatsmeow

WhatsApp Bot

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

Go Programming

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

  1. Jangan spam — Ikuti rules WhatsApp untuk menghindari ban
  2. Rate limiting — Batasi jumlah pesan per menit
  3. Session management — Simpan session dengan aman
  4. Input sanitization — Bersihkan user input sebelum proses
  5. Error handling — Jangan crash saat dapat pesan unexpected
  6. 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.

Tertarik dengan artikel lainnya?

Lihat Semua Artikel