Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

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-baru ini meluncurkan Programmable Conversations. Ini memungkinkan perusahaan untuk menggabungkan platform komunikasi seperti WhatsApp, Messenger, dan SMS ke dalam sistem mereka — menggunakan satu API.

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

Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung mulai membangun. Jika Anda mencoba ini, Anda perlu meminta akses awal. Tapi setelah Anda siap dengan saluran WhatsApp, Anda bisa masuk ke Dashboard di situs web MessageBird dan mulai.

Hal pertama yang saya lakukan adalah membaca dokumen. Saya belajar bahwa, untuk menerima pesan dari bot, saya harus menggunakan webhook. Ini berarti bot saya perlu dapat diakses dari internet. Saat membangun API semacam ini, penting untuk mengikuti praktik terbaik pembaruan versi API untuk keterpeliharaan. Karena saya baru saja mulai mengkodekannya, saya memutuskan untuk menggunakan ngrok. Ini membuat terowongan dari internet publik ke port localhost tercinta Anda, 5007. Ayo 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))
  }
}

Bagus. Sekarang Conversations API akan melakukan permintaan POST ke:

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

Beginilah 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"
}

Kita ingin menjawab pesan-pesan tersebut. Mari mulai dengan memantulkannya, 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 dia. Ini semua yang Anda butuhkan untuk membuat bot yang bertindak seperti manusia berusia 5 tahun.

Sekarang, mari kita dorong menuju pembuatan seluruh to-do list. Pertama, modifikasi fungsi createHookHandler sedikit sehingga memanggil fungsi baru handleMessage sebagai gantinya.

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

handle akan secara sederhana mengurai pesan, melakukan beberapa pekerjaan, dan memilih respon. Mari 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 untuk konkurensi yang memetakan ID percakapan ke to-do list.

To-do list adalah irisan string aman untuk konkurensi. Semua dalam memori!

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

Juga. Melakukan permintaan PATCH ke https://conversations.messagebird.com/v1/conversations/{id} dengan status yang tepat pada tubuh memungkinkan Anda 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 to-do list.

Tapi 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 memindahkan pertanyaan ke saluran biaya lebih rendah. Bagaimana Anda melakukannya?

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

Ini akan berhasil karena kode handler selalu menggunakan conversationID dari payload webhook untuk menjawab pesan alih-alih channelID yang sudah di-hardcode. Conversations API dari MessageBird akan secara otomatis menentukan saluran untuk percakapan untuk mengirimkan pesan Anda.

Apakah Anda ingin membuat bot Anda sendiri? Lihat kode lengkapnya di Github: https://github.com/marcelcorso/wabot, minta akses awal ke WhatsApp melalui tautan ini dan mulai membangun langsung. Selamat botting!

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

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

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

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

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

R

Reach

G

Grow

M

Manage

A

Automate

Perusahaan

Newsletter

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