Product

Solusi

Sumber Daya

Company

Product

Solusi

Sumber Daya

Company

Cara membangun bot WhatsApp untuk daftar tugas menggunakan API Percakapan Terprogram Bird

Burung

5 Feb 2020

WhatsApp

1 min read

Cara membangun bot WhatsApp untuk daftar tugas menggunakan API Percakapan Terprogram Bird

Burung

5 Feb 2020

WhatsApp

1 min read

Cara membangun bot WhatsApp untuk daftar tugas menggunakan API Percakapan Terprogram Bird

Bird baru saja meluncurkan Percakapan yang Dapat Diprogram. Ini memungkinkan perusahaan mencampurkan platform komunikasi seperti WhatsApp, Messenger, dan SMS ke dalam sistem mereka — menggunakan satu API.

Business in a box.

Temukan solusi kami.

Bird baru saja meluncurkan Programmable Conversations. Ini memungkinkan perusahaan menggabungkan platform komunikasi seperti WhatsApp, Messenger dan SMS ke dalam sistem mereka — menggunakan satu API.

Saya ingin mencobanya, jadi saya membuat daftar tugas bot WhatsApp, karena siapa yang tidak membutuhkan daftar tugas otomatis untuk membantu mengatur hari mereka? Mungkin terdengar rumit, tetapi sebenarnya mudah, dan saya ingin memberi tahu Anda semua tentangnya.

Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung terjun dan mulai membangun. Jika Anda mencoba ini, Anda perlu meminta akses awal. Tetapi setelah Anda mengatur saluran WhatsApp, Anda dapat masuk ke Dashboard di situs web MessageBird dan memulai.

Hal pertama yang saya lakukan adalah membaca dokumentasi. Saya mengetahui bahwa, untuk mendapatkan pesan dari bot, saya harus menggunakan webhook. Ini berarti bot saya perlu dapat diakses dari internet. Saat mengembangkan API seperti ini, penting untuk mengikuti praktik terbaik versi API untuk menjaga. Karena saya baru memulai untuk mengkodenya, saya memutuskan untuk menggunakan ngrok. Ini membuat terowongan dari internet publik ke port localhost tersayang Anda 5007. Mulai!

ngrok http 5007 -region eu -subdomain todobot

Selanjutnya, saya perlu melakukan panggilan ke API Programmable Conversations untuk membuat webhook. Ini adalah POST ke https://conversations.messagebird.com/v1/webhooks dan terlihat seperti ini:


func main() {// define the webhook json payload
  wh := struct {
         Events    []string `json:"events"`
         ChannelID string   `json:"channelId"`
         URL       string   `json:"url"`
  } {
    // we would like to be notified on the URL
    URL:       "https://todobot.eu.ngrok.io/create-hook",
    // whenever a message gets created
    Events:    []string{"message.created"},
    // on the WhatsApp channel with ID
    ChannelID: "23a780701b8849f7b974d8620a89a279",
  }
  
  // encode the payload to json
  var b bytes.Buffer
  err := json.NewEncoder(&b).Encode(&wh)
  if err != nil {
    panic(err)
  }
  
  // create the http request and set authorization header
  req, err := http.NewRequest("POST", "https://conversations.messagebird.com/v1/webhooks", &b)
  req.Header.Set("Authorization", "AccessKey todo-your-access-key")
  req.Header.Set("Content-Type", "application/json") // fire the http request
  client := &http.Client{}
  resp, err := client.Do(req)
  if err != nil {
         panic(err)
  }
  defer resp.Body.Close()// is everything ok?
  body, _ := ioutil.ReadAll(resp.Body)
  if resp.StatusCode >= http.StatusBadRequest {
    panic(fmt.Errorf("Bad response code from api when trying to create webhook: %s. Body: %s", resp.Status, string(body)))
  } else {
    log.Println("All good. response body: ", string(body))
  }
}

Hebat. Sekarang API Conversations akan melakukan permintaan POST ke:

https://todobot.eu.ngrok.io/create-hook setiap kali pesan baru dibuat pada saluran WhatsApp yang Anda atur sebelumnya.

Berikut adalah seperti apa payload webhook:


{
  "conversation":{
    "id":"55c66895c22a40e39a8e6bd321ec192e",
    "contactId":"db4dd5087fb343738e968a323f640576",
    "status":"active",
    "createdDatetime":"2018-08-17T10:14:14Z",
    "updatedDatetime":"2018-08-17T14:30:31.915292912Z",
    "lastReceivedDatetime":"2018-08-17T14:30:31.898389294Z"
  },
  "message":{
    "id":"ddb150149e2c4036a48f581544e22cfe",
    "conversationId":"55c66895c22a40e39a8e6bd321ec192e",
    "channelId":"23a780701b8849f7b974d8620a89a279",
    "status":"received",
    "type":"text",
    "direction":"received",
    "content":{
      "text":"add buy milk"
    },
    "createdDatetime":"2018-08-17T14:30:31.898389294Z",
    "updatedDatetime":"2018-08-17T14:30:31.915292912Z"
  },
  "type":"message.created"
}

Kami ingin menjawab pesan-pesan itu. Mari mulai dengan mencerminkan mereka, bagaimana menurut Anda?


// define the structs where we'll parse the webhook payload into
type whPayload struct {
  Conversation conversation `json:"conversation"`
  Message      message      `json:"message"`
  Type         string       `json:"type"`
}

type message struct {
  ID        string  `json:"id"`
  Direction string  `json:"direction"`
  Type      string  `json:"type"`
  Content   content `json:"content"`
}

type content struct {
  Text string `json:"text"`
}

type conversation struct {
  ID string `json:"id"`
}

func main() {
  http.HandleFunc("/create-hook", createHookHandler)
  log.Fatal(http.ListenAndServe(*httpListenAddress, nil))
}
// createHookHandler is an http handler that will handle webhook requests
func createHookHandler(w http.ResponseWriter, r *http.Request) {
  // parse the incoming json payload
  whp := &whPayload{}
  err := json.NewDecoder(r.Body).Decode(whp)
  if err != nil {
    log.Println("Err: got weird body on the webhook")
    w.WriteHeader(http.StatusInternalServerError)
    fmt.Fprintf(w, "Internal Server Error")
    return
  } 
  if whp.Message.Direction != "received" {
    // you will get *all* messages on the webhook. Even the ones this bot sends to the channel. We don't want to answer those.
    fmt.Fprintf(w, "ok")
    return
  } // echo: respond what we get
  err = respond(whp.Conversation.ID, whp.Message.Content.Text)
  
  if err != nil {
    log.Println("Err: ", err)
    w.WriteHeader(http.StatusInternalServerError)
    fmt.Fprintf(w, "Internal Server Error")return
  }
  w.WriteHeader(http.StatusOK)
  fmt.Fprintf(w, "ok")
}

Sekarang, bagian yang menarik. Lakukan permintaan POST ke:

https://conversations.messagebird.com/v1/conversations/<conversationID>/messages untuk menjawab permintaan tersebut.


func respond(conversationID, responseBody string) error {
  u := fmt.Sprintf("https://conversations.messagebird.com/v1/conversations/%s/messages", conversationID)msg := message{
  Content: content{
    Text: responseBody,
  },
  Type: "text",
  }
  var b bytes.Buffer
  err := json.NewEncoder(&b).Encode(&msg)
  if err != nil {
    return fmt.Errorf("Error encoding buffer: %v", err)
  }
  req, err := http.NewRequest("POST", u.String(), &b)
  req.Header.Set("Authorization", "AccessKey todo-your-access-key")
  req.Header.Set("Content-Type", "application/json")client := &http.Client{}
  resp, err := client.Do(req)
  if err != nil {
    return err
  }
  defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)
  if resp.StatusCode != http.StatusCreated {
    return fmt.Errorf("Bad response code from api when trying to create message: %s. Body: %s", resp.Status, string(body))
  }
  log.Println("All good. Response body: ", string(body))
  return nil
}

Itu saja. Ini adalah semua yang Anda butuhkan untuk membuat bot yang bertindak seperti manusia berusia 5 tahun.

Sekarang, mari kita bergerak menuju membangun seluruh daftar tugas. Pertama, modifikasi sedikit fungsi createHookHandler sehingga memanggil fungsi handleMessage baru alih-alih menjawab.

func createHookHandler(w http.ResponseWriter, r *http.Request) {
  ...
  err = handleMessage(whp)
  ...
}

handle akan secara sederhana mengurai pesan, melakukan beberapa pekerjaan, dan memilih respons. Mari kita lihat perintah "add":

func handleMessage(whp *whPayload) error {
  // every conversation has a todo list
  list := manager.fetch(whp.Conversation.ID)
  // parse the command from the message body: it's the first word
  text := whp.Message.Content.Text
  text = regexp.MustCompile(" +").ReplaceAllString(text, " ")
  parts := strings.Split(text, " ")
  command := strings.ToLower(parts[0])
  // default message
  responseBody := "I don't understand. Type 'help' to get help."
  switch command {
  ...
  case "add":
    if len(parts) < 2 {
           return respond(whp.Conversation.ID, "err... the 'add' command needs a second param: the todo item you want to save. Something like 'add buy milk'.")
    }
    // get the item from the message body
    item := strings.Join(parts[1:], " ")list.add(item)
    responseBody = "added."
  ...
  return respond(whp.Conversation.ID, responseBody)
}

Di sini, kita mengatur:list := manager.fetch(whp.Conversation.ID). Pada dasarnya, "manager" adalah peta aman bersamaan yang memetakan ID percakapan ke daftar tugas.

Sebuah daftar tugas adalah slice string aman bersamaan. Semua di memori!

Satu hal penting lainnya! Anda dapat mengarsipkan percakapan. Dalam beberapa aplikasi, seperti CRM, penting untuk melacak interaksi tertentu — misalnya, untuk melacak efektivitas karyawan dukungan pelanggan. API Conversations memungkinkan Anda mengarsipkan percakapan untuk "menutup" topik. Jika pengguna/pelanggan mengirim pesan lain, API Conversations akan membuka topik baru secara otomatis.

Juga. Melakukan permintaan PATCH ke https://conversations.messagebird.com/v1/conversations/{id} dengan status yang tepat pada badan memungkinkan Anda mengarsipkan percakapan dengan id itu. Kami melakukan ini dengan perintah "bye":

case "bye":
  archiveConversation(whp.Conversation.ID)
  manager.close(whp.Conversation.ID)
  responseBody = "bye!"

archiveConversation akan melakukan permintaan PATCH dan manager.close(whp.Conversation.ID) akan menghapus percakapan daftar tugas.

Tetapi hei, Programmable Conversations adalah solusi omni-channel. Bagaimana jika Anda ingin menggunakan kembali kode bot untuk platform yang berbeda, seperti WeChat? Pendekatan multi-channel ini adalah bagian dari strategi mengarahkan pertanyaan ke saluran biaya lebih rendah. Bagaimana Anda akan melakukannya?

Cukup buat webhook baru untuk menargetkan saluran itu! Sebuah webhook yang mengirim permintaan ke url https://todobot.eu.ngrok.io/create-hook yang sama yang kami gunakan untuk WhatsApp!

Ini akan bekerja karena kode handler selalu menggunakan conversationID dari payload webhook untuk menjawab pesan, bukan channelID hardcoded. API Conversations MessageBird akan secara otomatis menentukan saluran untuk percakapan untuk mengirimkan pesan Anda.

Anda ingin membangun bot Anda sendiri? Lihat kode lengkapnya di Github: https://github.com/marcelcorso/wabot, minta akses awal ke WhatsApp dengan mengunjungi halaman WhatsApp dan mengklik tombol Hubungi Penjualan untuk mengisi formulirnya. Selamat membuat bot!

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat beradaptasi dengan pertumbuhan bisnis Anda.

Product

Solusi

Sumber Daya

Company

Pengaturan privasi

Segera hadir

Sosial

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Daftar

© 2025 Bird

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat beradaptasi dengan pertumbuhan bisnis Anda.

Product

Solusi

Sumber Daya

Company

Pengaturan privasi

Sosial

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Daftar

© 2025 Bird