Cara membangun bot WhatsApp untuk daftar tugas menggunakan API Percakapan Terprogram Bird
Burung
5 Feb 2020
1 min read

Intisari Utama
Bird’s Programmable Conversations API menyatukan WhatsApp, Messenger, dan SMS menjadi satu lapisan komunikasi, menyederhanakan pengembangan bot multi-channel.
Anda dapat dengan cepat membuat prototipe bot daftar tugas WhatsApp menggunakan webhooks dan simple POST requests.
Alat seperti ngrok memungkinkan Anda mengekspos server lokal Anda untuk pengujian webhook tanpa pengaturan hosting yang rumit.
API menangani percakapan di berbagai saluran, memungkinkan satu basis logika untuk WhatsApp, WeChat, dan aplikasi lainnya.
Gunakan endpoint archiveConversation untuk menutup percakapan atau "topik," yang ideal untuk dukungan atau pelacakan alur kerja.
Logika bot dapat mengelola percakapan bersamaan dengan aman dalam memori dengan struktur data sederhana.
Handler webhook yang sama bekerja di berbagai saluran—Bird secara otomatis mengarahkan balasan berdasarkan ID percakapan asal.
Sorotan Q&A
Seberapa sulit membangun bot WhatsApp menggunakan Bird’s API?
Ini sangat mudah mengejutkan. Dengan webhook dan beberapa panggilan API, Anda dapat membangun bot fungsional yang membaca dan membalas pesan dalam hitungan menit.
Apakah saya perlu pengaturan khusus untuk menerima pesan?
Ya — bot harus dapat dijangkau dari internet. Alat seperti ngrok membantu membuat terowongan aman dari mesin lokal Anda.
Dapatkah I menggunakan kode yang sama untuk aplikasi pesan yang berbeda?
Tentu saja. API Percakapan mengabstraksi saluran, sehingga bot Anda dapat berjalan di WhatsApp, WeChat, atau Messenger menggunakan logika yang sama.
Bagaimana cara saya menutup atau mereset chat thread?
Kirim permintaan PATCH ke endpoint percakapan dengan status yang tepat untuk mengarsipkannya. Pesan baru secara otomatis membuka percakapan baru.
Di mana saya dapat menemukan contoh kode?
A: Demo lengkap yang berfungsi — Wabot on GitHub — menunjukkan implementasi penanganan pesan, konkruensi, dan pengarsipan.
Bird baru-baru ini meluncurkan Programmable Conversations. Ini memungkinkan perusahaan untuk memadukan platform komunikasi seperti WhatsApp, Messenger, dan SMS ke dalam sistem mereka — menggunakan satu API.
Saya ingin mencobanya, jadi saya membuat bot daftar tugas WhatsApp, karena siapa yang tidak memerlukan daftar tugas otomatis untuk membantu mengatur hari mereka? Mungkin terdengar rumit, tetapi sebenarnya mudah, dan saya ingin memberi tahu Anda semua tentang itu.
Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung mulai membangun. Jika Anda mencoba ini, Anda perlu meminta akses awal. Tetapi setelah Anda disiapkan dengan saluran WhatsApp, Anda dapat masuk ke Dashboard di situs web MessageBird dan memulai.
Bird baru-baru ini meluncurkan Programmable Conversations. Ini memungkinkan perusahaan untuk memadukan platform komunikasi seperti WhatsApp, Messenger, dan SMS ke dalam sistem mereka — menggunakan satu API.
Saya ingin mencobanya, jadi saya membuat bot daftar tugas WhatsApp, karena siapa yang tidak memerlukan daftar tugas otomatis untuk membantu mengatur hari mereka? Mungkin terdengar rumit, tetapi sebenarnya mudah, dan saya ingin memberi tahu Anda semua tentang itu.
Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung mulai membangun. Jika Anda mencoba ini, Anda perlu meminta akses awal. Tetapi setelah Anda disiapkan dengan saluran WhatsApp, Anda dapat masuk ke Dashboard di situs web MessageBird dan memulai.
Bird baru-baru ini meluncurkan Programmable Conversations. Ini memungkinkan perusahaan untuk memadukan platform komunikasi seperti WhatsApp, Messenger, dan SMS ke dalam sistem mereka — menggunakan satu API.
Saya ingin mencobanya, jadi saya membuat bot daftar tugas WhatsApp, karena siapa yang tidak memerlukan daftar tugas otomatis untuk membantu mengatur hari mereka? Mungkin terdengar rumit, tetapi sebenarnya mudah, dan saya ingin memberi tahu Anda semua tentang itu.
Sekarang, saya bekerja di MessageBird, jadi saya bisa langsung mulai membangun. Jika Anda mencoba ini, Anda perlu meminta akses awal. Tetapi setelah Anda disiapkan dengan saluran WhatsApp, Anda dapat masuk ke Dashboard di situs web MessageBird dan memulai.
Mengatur lingkungan bot WhatsApp Anda
Hal pertama yang saya lakukan adalah membaca docs. Saya belajar bahwa, untuk mendapatkan pesan dari bot, saya harus menggunakan webhook. Ini berarti bahwa bot saya perlu dapat diakses dari internet. Saat membangun API seperti ini, penting untuk mengikuti API versioning best practices untuk pemeliharaan. Karena saya baru mulai mengkodekannya, saya memutuskan untuk menggunakan ngrok. Ini menciptakan terowongan dari internet publik ke port localhost 5007 kesayangan Anda. Engaged!
ngrok http 5007 -region eu -subdomain todobot
Hal pertama yang saya lakukan adalah membaca docs. Saya belajar bahwa, untuk mendapatkan pesan dari bot, saya harus menggunakan webhook. Ini berarti bahwa bot saya perlu dapat diakses dari internet. Saat membangun API seperti ini, penting untuk mengikuti API versioning best practices untuk pemeliharaan. Karena saya baru mulai mengkodekannya, saya memutuskan untuk menggunakan ngrok. Ini menciptakan terowongan dari internet publik ke port localhost 5007 kesayangan Anda. Engaged!
ngrok http 5007 -region eu -subdomain todobot
Hal pertama yang saya lakukan adalah membaca docs. Saya belajar bahwa, untuk mendapatkan pesan dari bot, saya harus menggunakan webhook. Ini berarti bahwa bot saya perlu dapat diakses dari internet. Saat membangun API seperti ini, penting untuk mengikuti API versioning best practices untuk pemeliharaan. Karena saya baru mulai mengkodekannya, saya memutuskan untuk menggunakan ngrok. Ini menciptakan terowongan dari internet publik ke port localhost 5007 kesayangan Anda. Engaged!
ngrok http 5007 -region eu -subdomain todobot
Membuat webhook Anda dan menghubungkan Bird
Selanjutnya, saya perlu melakukan panggilan ke Programmable Conversations API 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)) } }
Manis. 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 atur sebelumnya.
Ini adalah bagaimana muatan webhook terlihat:
{ "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 tersebut. Mari kita mulai dengan menggemakan pesan tersebut, bagaimana menurutmu?
// 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") }
Selanjutnya, saya perlu melakukan panggilan ke Programmable Conversations API 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)) } }
Manis. 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 atur sebelumnya.
Ini adalah bagaimana muatan webhook terlihat:
{ "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 tersebut. Mari kita mulai dengan menggemakan pesan tersebut, bagaimana menurutmu?
// 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") }
Selanjutnya, saya perlu melakukan panggilan ke Programmable Conversations API 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)) } }
Manis. 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 atur sebelumnya.
Ini adalah bagaimana muatan webhook terlihat:
{ "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 tersebut. Mari kita mulai dengan menggemakan pesan tersebut, bagaimana menurutmu?
// 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") }
Mengirim tanggapan dan menangani pesan
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.
Inilah alasan mengapa menggunakan Bird’s Conversations API membuat pengembangan bot WhatsApp cepat dan dapat diskalakan:
Fitur | Apa yang dipecahkan |
|---|---|
ID percakapan yang bersatu | Mempertahankan satu thread di seluruh aplikasi seperti WhatsApp, WeChat, Messenger |
API tunggal untuk semua saluran | Menggunakan kembali logika bot tanpa menulis ulang untuk setiap platform |
Automasi berbasis Webhook | Menangani tanggapan cepat tanpa polling |
Arsip + buka kembali topik | Mengorganisasi riwayat dukungan dan alur kerja |
Struktur yang aman dari konkuren | Menangani beberapa obrolan sekaligus secara andal |
Sekarang, mari kita dorong pembuatan daftar tugas lengkap. Pertama, modifikasi sedikit fungsi createHookHandler sehingga memanggil fungsi handleMessage yang baru alih-alih respond.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle akan secara sederhana memparsing pesan, melakukan beberapa pekerjaan, dan memilih tanggapan. 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 yang aman dari kekonkurensian yang memetakan IDs percakapan ke daftar tugas.
Sebuah daftar tugas adalah irisan string yang aman dari kekonkurensian. Semuanya di dalam memori!
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.
Inilah alasan mengapa menggunakan Bird’s Conversations API membuat pengembangan bot WhatsApp cepat dan dapat diskalakan:
Fitur | Apa yang dipecahkan |
|---|---|
ID percakapan yang bersatu | Mempertahankan satu thread di seluruh aplikasi seperti WhatsApp, WeChat, Messenger |
API tunggal untuk semua saluran | Menggunakan kembali logika bot tanpa menulis ulang untuk setiap platform |
Automasi berbasis Webhook | Menangani tanggapan cepat tanpa polling |
Arsip + buka kembali topik | Mengorganisasi riwayat dukungan dan alur kerja |
Struktur yang aman dari konkuren | Menangani beberapa obrolan sekaligus secara andal |
Sekarang, mari kita dorong pembuatan daftar tugas lengkap. Pertama, modifikasi sedikit fungsi createHookHandler sehingga memanggil fungsi handleMessage yang baru alih-alih respond.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle akan secara sederhana memparsing pesan, melakukan beberapa pekerjaan, dan memilih tanggapan. 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 yang aman dari kekonkurensian yang memetakan IDs percakapan ke daftar tugas.
Sebuah daftar tugas adalah irisan string yang aman dari kekonkurensian. Semuanya di dalam memori!
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.
Inilah alasan mengapa menggunakan Bird’s Conversations API membuat pengembangan bot WhatsApp cepat dan dapat diskalakan:
Fitur | Apa yang dipecahkan |
|---|---|
ID percakapan yang bersatu | Mempertahankan satu thread di seluruh aplikasi seperti WhatsApp, WeChat, Messenger |
API tunggal untuk semua saluran | Menggunakan kembali logika bot tanpa menulis ulang untuk setiap platform |
Automasi berbasis Webhook | Menangani tanggapan cepat tanpa polling |
Arsip + buka kembali topik | Mengorganisasi riwayat dukungan dan alur kerja |
Struktur yang aman dari konkuren | Menangani beberapa obrolan sekaligus secara andal |
Sekarang, mari kita dorong pembuatan daftar tugas lengkap. Pertama, modifikasi sedikit fungsi createHookHandler sehingga memanggil fungsi handleMessage yang baru alih-alih respond.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle akan secara sederhana memparsing pesan, melakukan beberapa pekerjaan, dan memilih tanggapan. 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 yang aman dari kekonkurensian yang memetakan IDs percakapan ke daftar tugas.
Sebuah daftar tugas adalah irisan string yang aman dari kekonkurensian. Semuanya di dalam memori!
Mengarsipkan percakapan dan meningkatkan skala bot Anda
Hal penting lainnya! Anda dapat 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 tersebut. Jika pengguna/pelanggan mengirim pesan lain, Conversations API akan membuka topik baru secara otomatis.
Mengelola siklus hidup percakapan
Selain itu. Melakukan permintaan PATCH ke https://conversations.messagebird.com/v1/conversations/{id} dengan status yang tepat di dalam tubuh memungkinkan Anda untuk mengarsipkan percakapan dengan id tersebut. Kami melakukannya 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.
Tapi hei, Programmable Conversations adalah solusi multi-saluran. Bagaimana jika Anda ingin menggunakan kembali kode bot untuk platform yang berbeda, seperti WeChat? Pendekatan multi-saluran ini adalah bagian dari strategi mengalihkan pertanyaan ke saluran biaya lebih rendah. Bagaimana Anda melakukannya?
Cukup buat webhook baru untuk menargetkan saluran tersebut! Webhook yang mengirim permintaan ke url yang sama https://todobot.eu.ngrok.io/create-hook yang kami gunakan untuk WhatsApp!
Ini akan berhasil karena kode pemroses selalu menggunakan conversationID dari payload webhook untuk menjawab pesan alih-alih channelID yang berada dalam kode tetap. Conversations API dari MessageBird akan secara otomatis menentukan saluran untuk percakapan tersebut untuk mengirim pesan Anda.
Apakah Anda ingin membangun bot Anda sendiri? Lihat kode lengkapnya di Github: Wabot di Github, minta akses awal ke WhatsApp dengan mengunjungi halaman WhatsApp dan mengklik tombol Hubungi Penjualan untuk mengisi formulir. Selamat mencoba membuat bot!
Hal penting lainnya! Anda dapat 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 tersebut. Jika pengguna/pelanggan mengirim pesan lain, Conversations API akan membuka topik baru secara otomatis.
Mengelola siklus hidup percakapan
Selain itu. Melakukan permintaan PATCH ke https://conversations.messagebird.com/v1/conversations/{id} dengan status yang tepat di dalam tubuh memungkinkan Anda untuk mengarsipkan percakapan dengan id tersebut. Kami melakukannya 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.
Tapi hei, Programmable Conversations adalah solusi multi-saluran. Bagaimana jika Anda ingin menggunakan kembali kode bot untuk platform yang berbeda, seperti WeChat? Pendekatan multi-saluran ini adalah bagian dari strategi mengalihkan pertanyaan ke saluran biaya lebih rendah. Bagaimana Anda melakukannya?
Cukup buat webhook baru untuk menargetkan saluran tersebut! Webhook yang mengirim permintaan ke url yang sama https://todobot.eu.ngrok.io/create-hook yang kami gunakan untuk WhatsApp!
Ini akan berhasil karena kode pemroses selalu menggunakan conversationID dari payload webhook untuk menjawab pesan alih-alih channelID yang berada dalam kode tetap. Conversations API dari MessageBird akan secara otomatis menentukan saluran untuk percakapan tersebut untuk mengirim pesan Anda.
Apakah Anda ingin membangun bot Anda sendiri? Lihat kode lengkapnya di Github: Wabot di Github, minta akses awal ke WhatsApp dengan mengunjungi halaman WhatsApp dan mengklik tombol Hubungi Penjualan untuk mengisi formulir. Selamat mencoba membuat bot!
Hal penting lainnya! Anda dapat 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 tersebut. Jika pengguna/pelanggan mengirim pesan lain, Conversations API akan membuka topik baru secara otomatis.
Mengelola siklus hidup percakapan
Selain itu. Melakukan permintaan PATCH ke https://conversations.messagebird.com/v1/conversations/{id} dengan status yang tepat di dalam tubuh memungkinkan Anda untuk mengarsipkan percakapan dengan id tersebut. Kami melakukannya 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.
Tapi hei, Programmable Conversations adalah solusi multi-saluran. Bagaimana jika Anda ingin menggunakan kembali kode bot untuk platform yang berbeda, seperti WeChat? Pendekatan multi-saluran ini adalah bagian dari strategi mengalihkan pertanyaan ke saluran biaya lebih rendah. Bagaimana Anda melakukannya?
Cukup buat webhook baru untuk menargetkan saluran tersebut! Webhook yang mengirim permintaan ke url yang sama https://todobot.eu.ngrok.io/create-hook yang kami gunakan untuk WhatsApp!
Ini akan berhasil karena kode pemroses selalu menggunakan conversationID dari payload webhook untuk menjawab pesan alih-alih channelID yang berada dalam kode tetap. Conversations API dari MessageBird akan secara otomatis menentukan saluran untuk percakapan tersebut untuk mengirim pesan Anda.
Apakah Anda ingin membangun bot Anda sendiri? Lihat kode lengkapnya di Github: Wabot di Github, minta akses awal ke WhatsApp dengan mengunjungi halaman WhatsApp dan mengklik tombol Hubungi Penjualan untuk mengisi formulir. Selamat mencoba membuat bot!



