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.

Bird baru-baru ini 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 membangun bot WhatsApp daftar tugas, karena siapa yang tidak membutuhkan daftar tugas otomatis untuk membantu mengatur hari mereka? Mungkin terdengar rumit, tapi sebenarnya mudah, dan saya ingin menceritakan semuanya kepada Anda.

Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung 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 bahwa bot saya harus dapat diakses dari internet. Saat membangun API seperti ini, penting untuk mengikuti praktik terbaik versi API untuk pemeliharaan. Karena saya baru mulai mengkodekannya, saya memutuskan untuk menggunakan ngrok. Ini membuat terowongan dari internet publik ke port localhost 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 tampilannya 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))
  }
}

Baiklah. 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.

Ini adalah tampilan 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 tersebut. Mari kita mulai dengan menggemakannya, 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 usia 5 tahun.

Sekarang, mari kita dorong untuk membangun seluruh daftar tugas. Pertama, modifikasi sedikit fungsi createHookHandler sehingga memanggil fungsi handleMessage yang baru daripada merespons.

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

Handle secara sederhana akan mem-parsiskan pesan, melakukan beberapa pekerjaan, dan memilih responsnya. 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, kami mengatur:list := manager.fetch(whp.Conversation.ID). Dasarnya adalah, “manager” adalah peta aman kolaborasi yang memetakan ID percakapan ke daftar tugas.

Sebuah daftar tugas adalah irisan string aman kolaborasi. Semua ada dalam memori!

Satu hal penting lainnya! Anda dapat mengarsipkan percakapan. Dalam beberapa aplikasi, seperti CRM, penting untuk melacak interaksi tertentu — untuk melacak efektivitas dukungan pelanggan, misalnya. 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 tubuh memungkinkan Anda untuk mengarsipkan percakapan dengan id tersebut. 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 omnichannel. Bagaimana jika Anda ingin menggunakan kembali kode bot untuk platform lain, seperti WeChat? Pendekatan multi-channel ini adalah bagian dari strategi mengalihkan pertanyaan ke saluran yang lebih rendah biayanya. Bagaimana Anda melakukannya?

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

Ini akan berhasil karena kode pengendali selalu menggunakan conversationID dari payload webhook untuk menjawab pesan alih-alih channelID yang tertanam. API Conversations dari MessageBird akan secara otomatis menentukan saluran untuk percakapan yang akan mengirim pesan Anda.

Apakah Anda ingin membangun bot Anda sendiri? Lihat kode lengkapnya di Github: Wabot on Github, minta akses awal ke WhatsApp dengan mengunjungi halaman WhatsApp dan klik tombol Hubungi Penjualan untuk mengisi formulir. Selamat membuat bot!

Berita lainnya

Baca lebih lanjut dari kategori ini

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

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

© 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.

© 2025 Bird