Wie man einen WhatsApp-Bot für To-Do-Listen mit der Programmable Conversations API von Bird erstellt
Vogel
05.02.2020
1 min read

Wichtige Erkenntnisse
Bird’s Programmable Conversations API vereint WhatsApp, Messenger und SMS zu einer einzigen Kommunikationsschicht und vereinfacht die Entwicklung von Multi-Channel-Bots.
Sie können schnell einen WhatsApp-To-do-Listen-Bot mit Webhooks und einfachen POST-Anfragen prototypisieren.
Tools wie ngrok ermöglichen es Ihnen, Ihren lokalen Server für Webhook-Tests ohne komplexe Hosting-Einrichtung zu veröffentlichen.
Die API verwaltet Konversationen über mehrere Kanäle, sodass eine einzige Logikbasis für WhatsApp, WeChat und andere Apps genutzt werden kann.
Verwenden Sie den archiveConversation-Endpunkt, um Konversationen zu schließen oder „Themen“ zu archivieren, ideal für Support- oder Workflow-Tracking.
Die Bot-Logik kann gleichzeitige Konversationen sicher im Speicher mit einer einfachen Datenstruktur verwalten.
Der gleiche Webhook-Handler funktioniert kanalübergreifend—Bird leitet Antworten automatisch basierend auf der ursprünglichen Konversations-ID weiter.
Q&A Highlights
Wie schwer ist es, einen WhatsApp-Bot mit der Bird API zu bauen?
Es ist überraschend einfach. Mit einem Webhook und ein paar API-Aufrufen können Sie innerhalb von Minuten einen funktionierenden Bot erstellen, der Nachrichten liest und darauf antwortet.
Brauche ich eine spezielle Einrichtung, um Nachrichten zu empfangen?
Ja — der Bot muss aus dem Internet erreichbar sein. Tools wie ngrok helfen, einen sicheren Tunnel von Ihrem lokalen Rechner zu erstellen.
Kann ich denselben Codebase für verschiedene Messaging-Apps verwenden?
Absolut. Die Conversations API abstrahiert Kanäle, sodass Ihr Bot auf WhatsApp, WeChat oder Messenger mit identischer Logik laufen kann.
Wie schließe oder setze ich einen Chat-Thread zurück?
Senden Sie eine PATCH-Anfrage an den Endpunkt des Gesprächs mit dem richtigen Status, um es zu archivieren. Jede neue Nachricht öffnet automatisch ein neues Gespräch.
Wo kann ich Beispielcode finden?
A: Die vollständige funktionierende Demo — Wabot auf GitHub — zeigt die Implementierung der Nachrichtenverarbeitung, Gleichzeitigkeit und Archivierung.
Bird hat kürzlich Programmable Conversations eingeführt. Es ermöglicht Unternehmen, Kommunikationsplattformen wie WhatsApp, Messenger und SMS in ihre Systeme zu integrieren — mit einer einzigen API.
Ich wollte es ausprobieren, also habe ich eine WhatsApp-Bot-To-Do-Liste erstellt, denn wer braucht nicht eine automatisierte To-Do-Liste, um seinen Tag zu organisieren? Es mag kompliziert klingen, aber es war tatsächlich einfach, und ich möchte Ihnen alles darüber erzählen.
Nun, ich arbeite bei MessageBird, also konnte ich einfach loslegen und anfangen zu bauen. Wenn Sie dies ausprobieren möchten, müssen Sie einen frühzeitigen Zugriff anfordern. Aber sobald Sie einen WhatsApp-Kanal eingerichtet haben, können Sie sich auf dem Dashboard auf der MessageBird-Website anmelden und loslegen.
Bird hat kürzlich Programmable Conversations eingeführt. Es ermöglicht Unternehmen, Kommunikationsplattformen wie WhatsApp, Messenger und SMS in ihre Systeme zu integrieren — mit einer einzigen API.
Ich wollte es ausprobieren, also habe ich eine WhatsApp-Bot-To-Do-Liste erstellt, denn wer braucht nicht eine automatisierte To-Do-Liste, um seinen Tag zu organisieren? Es mag kompliziert klingen, aber es war tatsächlich einfach, und ich möchte Ihnen alles darüber erzählen.
Nun, ich arbeite bei MessageBird, also konnte ich einfach loslegen und anfangen zu bauen. Wenn Sie dies ausprobieren möchten, müssen Sie einen frühzeitigen Zugriff anfordern. Aber sobald Sie einen WhatsApp-Kanal eingerichtet haben, können Sie sich auf dem Dashboard auf der MessageBird-Website anmelden und loslegen.
Bird hat kürzlich Programmable Conversations eingeführt. Es ermöglicht Unternehmen, Kommunikationsplattformen wie WhatsApp, Messenger und SMS in ihre Systeme zu integrieren — mit einer einzigen API.
Ich wollte es ausprobieren, also habe ich eine WhatsApp-Bot-To-Do-Liste erstellt, denn wer braucht nicht eine automatisierte To-Do-Liste, um seinen Tag zu organisieren? Es mag kompliziert klingen, aber es war tatsächlich einfach, und ich möchte Ihnen alles darüber erzählen.
Nun, ich arbeite bei MessageBird, also konnte ich einfach loslegen und anfangen zu bauen. Wenn Sie dies ausprobieren möchten, müssen Sie einen frühzeitigen Zugriff anfordern. Aber sobald Sie einen WhatsApp-Kanal eingerichtet haben, können Sie sich auf dem Dashboard auf der MessageBird-Website anmelden und loslegen.
Einrichtung Ihrer WhatsApp-Bot-Umgebung
Das erste, was ich getan habe, war, die Dokumentation zu lesen. Ich erfuhr, dass ich, um Nachrichten vom Bot zu erhalten, einen Webhook verwenden müsste. Das bedeutete, dass mein Bot vom Internet aus zugänglich sein müsste. Beim Erstellen von APIs wie dieser ist es wichtig, Best Practices für API-Versionierung für die Wartbarkeit zu befolgen. Da ich gerade angefangen hatte, zu programmieren, entschied ich mich, ngrok zu verwenden. Es erstellt einen Tunnel vom öffentlichen Internet zu Ihrem lokalen Host-Port 5007. Engage!
ngrok http 5007 -region eu -subdomain todobot
Das erste, was ich getan habe, war, die Dokumentation zu lesen. Ich erfuhr, dass ich, um Nachrichten vom Bot zu erhalten, einen Webhook verwenden müsste. Das bedeutete, dass mein Bot vom Internet aus zugänglich sein müsste. Beim Erstellen von APIs wie dieser ist es wichtig, Best Practices für API-Versionierung für die Wartbarkeit zu befolgen. Da ich gerade angefangen hatte, zu programmieren, entschied ich mich, ngrok zu verwenden. Es erstellt einen Tunnel vom öffentlichen Internet zu Ihrem lokalen Host-Port 5007. Engage!
ngrok http 5007 -region eu -subdomain todobot
Das erste, was ich getan habe, war, die Dokumentation zu lesen. Ich erfuhr, dass ich, um Nachrichten vom Bot zu erhalten, einen Webhook verwenden müsste. Das bedeutete, dass mein Bot vom Internet aus zugänglich sein müsste. Beim Erstellen von APIs wie dieser ist es wichtig, Best Practices für API-Versionierung für die Wartbarkeit zu befolgen. Da ich gerade angefangen hatte, zu programmieren, entschied ich mich, ngrok zu verwenden. Es erstellt einen Tunnel vom öffentlichen Internet zu Ihrem lokalen Host-Port 5007. Engage!
ngrok http 5007 -region eu -subdomain todobot
Erstellen Ihres Webhooks und Verbinden von Bird
Als nächstes musste ich einen Aufruf an die Programmable Conversations API machen, um den Webhook zu erstellen. Es ist ein POST an https://conversations.messagebird.com/v1/webhooks und es sieht ungefähr so aus:
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)) } }
Super. Nun wird die Conversations API eine POST-Anfrage an folgende URL senden:
https://todobot.eu.ngrok.io/create-hook wann immer eine neue Nachricht im zuvor eingerichteten WhatsApp-Kanal erstellt wird.
So sieht eine Webhook-Nutzlast aus:
{ "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" }
Wir wollen auf diese Nachrichten antworten. Lassen Sie uns damit anfangen, sie zu wiederholen, was meinen Sie?
// 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") }
Als nächstes musste ich einen Aufruf an die Programmable Conversations API machen, um den Webhook zu erstellen. Es ist ein POST an https://conversations.messagebird.com/v1/webhooks und es sieht ungefähr so aus:
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)) } }
Super. Nun wird die Conversations API eine POST-Anfrage an folgende URL senden:
https://todobot.eu.ngrok.io/create-hook wann immer eine neue Nachricht im zuvor eingerichteten WhatsApp-Kanal erstellt wird.
So sieht eine Webhook-Nutzlast aus:
{ "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" }
Wir wollen auf diese Nachrichten antworten. Lassen Sie uns damit anfangen, sie zu wiederholen, was meinen Sie?
// 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") }
Als nächstes musste ich einen Aufruf an die Programmable Conversations API machen, um den Webhook zu erstellen. Es ist ein POST an https://conversations.messagebird.com/v1/webhooks und es sieht ungefähr so aus:
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)) } }
Super. Nun wird die Conversations API eine POST-Anfrage an folgende URL senden:
https://todobot.eu.ngrok.io/create-hook wann immer eine neue Nachricht im zuvor eingerichteten WhatsApp-Kanal erstellt wird.
So sieht eine Webhook-Nutzlast aus:
{ "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" }
Wir wollen auf diese Nachrichten antworten. Lassen Sie uns damit anfangen, sie zu wiederholen, was meinen Sie?
// 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") }
Antworten senden und Nachrichten verwalten
Nun, für den interessanten Teil. Führen Sie eine POST-Anfrage an:
https://conversations.messagebird.com/v1/conversations/<conversationID>/messages aus, um die Anfrage zu beantworten.
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 }
Da. Das ist alles, was Sie brauchen, um einen Bot zu erstellen, der wie ein 5-jähriger Mensch agiert.
Hier ist der Grund, warum die Verwendung der Bird Conversations API die WhatsApp-Bot-Entwicklung schnell und skalierbar macht:
Funktion | Was es löst |
|---|---|
Einheitliche Konversations-ID | Halten Sie einen einzigen Thread über Apps wie WhatsApp, WeChat, Messenger |
Eine einzige API für alle Kanäle | Verwenden Sie die Bot-Logik ohne Neuschreiben für jede Plattform wieder |
Webhook-gesteuerte Automatisierung | Schnelle Reaktionssteuerung ohne Abfragen |
Themen archivieren + wieder öffnen | Organisieren Sie Support-Historie und Workflows |
Concurrency-sichere Struktur | Gleichzeitige Handhabung mehrerer Chats zuverlässig |
Nun, lasst uns einen Schritt Richtung komplette Aufgabenliste machen. Ändern Sie zuerst die createHookHandler-Funktion ein wenig, sodass sie statt respond die neue handleMessage-Funktion aufruft.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle wird die Nachrichten einfach analysieren, etwas Arbeit leisten und die Antwort auswählen. Schauen wir uns den “add”-Befehl an:
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) }
Hier richten wir ein: list := manager.fetch(whp.Conversation.ID). Grundsätzlich ist "manager" eine nebenläufigkeits-sichere Karte, die Konversations-IDs den Aufgabenlisten zuordnet.
Eine Aufgabenliste ist ein nebenläufigkeitssicherer String-Slice. Alles im Speicher!
Nun, für den interessanten Teil. Führen Sie eine POST-Anfrage an:
https://conversations.messagebird.com/v1/conversations/<conversationID>/messages aus, um die Anfrage zu beantworten.
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 }
Da. Das ist alles, was Sie brauchen, um einen Bot zu erstellen, der wie ein 5-jähriger Mensch agiert.
Hier ist der Grund, warum die Verwendung der Bird Conversations API die WhatsApp-Bot-Entwicklung schnell und skalierbar macht:
Funktion | Was es löst |
|---|---|
Einheitliche Konversations-ID | Halten Sie einen einzigen Thread über Apps wie WhatsApp, WeChat, Messenger |
Eine einzige API für alle Kanäle | Verwenden Sie die Bot-Logik ohne Neuschreiben für jede Plattform wieder |
Webhook-gesteuerte Automatisierung | Schnelle Reaktionssteuerung ohne Abfragen |
Themen archivieren + wieder öffnen | Organisieren Sie Support-Historie und Workflows |
Concurrency-sichere Struktur | Gleichzeitige Handhabung mehrerer Chats zuverlässig |
Nun, lasst uns einen Schritt Richtung komplette Aufgabenliste machen. Ändern Sie zuerst die createHookHandler-Funktion ein wenig, sodass sie statt respond die neue handleMessage-Funktion aufruft.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle wird die Nachrichten einfach analysieren, etwas Arbeit leisten und die Antwort auswählen. Schauen wir uns den “add”-Befehl an:
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) }
Hier richten wir ein: list := manager.fetch(whp.Conversation.ID). Grundsätzlich ist "manager" eine nebenläufigkeits-sichere Karte, die Konversations-IDs den Aufgabenlisten zuordnet.
Eine Aufgabenliste ist ein nebenläufigkeitssicherer String-Slice. Alles im Speicher!
Nun, für den interessanten Teil. Führen Sie eine POST-Anfrage an:
https://conversations.messagebird.com/v1/conversations/<conversationID>/messages aus, um die Anfrage zu beantworten.
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 }
Da. Das ist alles, was Sie brauchen, um einen Bot zu erstellen, der wie ein 5-jähriger Mensch agiert.
Hier ist der Grund, warum die Verwendung der Bird Conversations API die WhatsApp-Bot-Entwicklung schnell und skalierbar macht:
Funktion | Was es löst |
|---|---|
Einheitliche Konversations-ID | Halten Sie einen einzigen Thread über Apps wie WhatsApp, WeChat, Messenger |
Eine einzige API für alle Kanäle | Verwenden Sie die Bot-Logik ohne Neuschreiben für jede Plattform wieder |
Webhook-gesteuerte Automatisierung | Schnelle Reaktionssteuerung ohne Abfragen |
Themen archivieren + wieder öffnen | Organisieren Sie Support-Historie und Workflows |
Concurrency-sichere Struktur | Gleichzeitige Handhabung mehrerer Chats zuverlässig |
Nun, lasst uns einen Schritt Richtung komplette Aufgabenliste machen. Ändern Sie zuerst die createHookHandler-Funktion ein wenig, sodass sie statt respond die neue handleMessage-Funktion aufruft.
func createHookHandler(w http.ResponseWriter, r *http.Request) { ... err = handleMessage(whp) ... }
handle wird die Nachrichten einfach analysieren, etwas Arbeit leisten und die Antwort auswählen. Schauen wir uns den “add”-Befehl an:
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) }
Hier richten wir ein: list := manager.fetch(whp.Conversation.ID). Grundsätzlich ist "manager" eine nebenläufigkeits-sichere Karte, die Konversations-IDs den Aufgabenlisten zuordnet.
Eine Aufgabenliste ist ein nebenläufigkeitssicherer String-Slice. Alles im Speicher!
Archivierung von Gesprächen und Skalierung Ihres Bots
Ein weiterer wichtiger Punkt! Sie können Unterhaltungen archivieren. In einigen Anwendungen, wie CRMs, ist es wichtig, bestimmte Interaktionen zu verfolgen — um beispielsweise die Effektivität der Kundenmitarbeiter zu überprüfen. Die Conversations API ermöglicht es Ihnen, eine Unterhaltung zu archivieren, um das Thema zu „schließen“. Wenn der Nutzer/Kunde eine weitere Nachricht sendet, wird die Conversations API automatisch ein neues Thema eröffnen.
Verwalten des Gesprächsverlaufs
Ebenso. Ein PATCH-Request an https://conversations.messagebird.com/v1/conversations/{id} mit dem richtigen Status im Body ermöglicht es Ihnen, die Unterhaltung mit dieser ID zu archivieren. Wir tun dies mit dem „bye“-Befehl:
case "bye": archiveConversation(whp.Conversation.ID) manager.close(whp.Conversation.ID) responseBody = "bye!"
archiveConversation führt den PATCH-Request aus und manager.close(whp.Conversation.ID) entfernt die To-Do-Listen-Konversation.
Aber hey, Programmable Conversations ist eine omni-channel-Lösung. Was, wenn Sie den Code des Bots für eine andere Plattform, wie WeChat, wiederverwenden möchten? Dieser Multi-Channel-Ansatz ist Teil der Strategie, Anfragen auf kostengünstigere Kanäle zu lenken. Wie würden Sie es angehen?
Erstellen Sie einfach einen neuen Webhook, um diesen Kanal zu adressieren! Ein Webhook, der Anfragen an die gleiche https://todobot.eu.ngrok.io/create-hook URL sendet, die wir für WhatsApp verwendet haben!
Dies wird funktionieren, weil der Handler-Code immer die conversationID aus der Webhook-Nutzlast verwendet, um die Nachrichten zu beantworten, anstatt eine fest codierte channelID zu verwenden. Die Conversations API von MessageBird wird automatisch den Kanal für die Unterhaltung bestimmen, über die Ihre Nachricht gesendet wird.
Möchten Sie Ihren eigenen Bot erstellen? Schauen Sie sich den vollständigen Code auf Github an: Wabot auf Github, beantragen Sie frühen Zugang zu WhatsApp, indem Sie die WhatsApp-Seite besuchen und auf die Schaltfläche „Kontakt Vertrieb“ klicken, um das Formular auszufüllen. Viel Spaß beim Botten!
Ein weiterer wichtiger Punkt! Sie können Unterhaltungen archivieren. In einigen Anwendungen, wie CRMs, ist es wichtig, bestimmte Interaktionen zu verfolgen — um beispielsweise die Effektivität der Kundenmitarbeiter zu überprüfen. Die Conversations API ermöglicht es Ihnen, eine Unterhaltung zu archivieren, um das Thema zu „schließen“. Wenn der Nutzer/Kunde eine weitere Nachricht sendet, wird die Conversations API automatisch ein neues Thema eröffnen.
Verwalten des Gesprächsverlaufs
Ebenso. Ein PATCH-Request an https://conversations.messagebird.com/v1/conversations/{id} mit dem richtigen Status im Body ermöglicht es Ihnen, die Unterhaltung mit dieser ID zu archivieren. Wir tun dies mit dem „bye“-Befehl:
case "bye": archiveConversation(whp.Conversation.ID) manager.close(whp.Conversation.ID) responseBody = "bye!"
archiveConversation führt den PATCH-Request aus und manager.close(whp.Conversation.ID) entfernt die To-Do-Listen-Konversation.
Aber hey, Programmable Conversations ist eine omni-channel-Lösung. Was, wenn Sie den Code des Bots für eine andere Plattform, wie WeChat, wiederverwenden möchten? Dieser Multi-Channel-Ansatz ist Teil der Strategie, Anfragen auf kostengünstigere Kanäle zu lenken. Wie würden Sie es angehen?
Erstellen Sie einfach einen neuen Webhook, um diesen Kanal zu adressieren! Ein Webhook, der Anfragen an die gleiche https://todobot.eu.ngrok.io/create-hook URL sendet, die wir für WhatsApp verwendet haben!
Dies wird funktionieren, weil der Handler-Code immer die conversationID aus der Webhook-Nutzlast verwendet, um die Nachrichten zu beantworten, anstatt eine fest codierte channelID zu verwenden. Die Conversations API von MessageBird wird automatisch den Kanal für die Unterhaltung bestimmen, über die Ihre Nachricht gesendet wird.
Möchten Sie Ihren eigenen Bot erstellen? Schauen Sie sich den vollständigen Code auf Github an: Wabot auf Github, beantragen Sie frühen Zugang zu WhatsApp, indem Sie die WhatsApp-Seite besuchen und auf die Schaltfläche „Kontakt Vertrieb“ klicken, um das Formular auszufüllen. Viel Spaß beim Botten!
Ein weiterer wichtiger Punkt! Sie können Unterhaltungen archivieren. In einigen Anwendungen, wie CRMs, ist es wichtig, bestimmte Interaktionen zu verfolgen — um beispielsweise die Effektivität der Kundenmitarbeiter zu überprüfen. Die Conversations API ermöglicht es Ihnen, eine Unterhaltung zu archivieren, um das Thema zu „schließen“. Wenn der Nutzer/Kunde eine weitere Nachricht sendet, wird die Conversations API automatisch ein neues Thema eröffnen.
Verwalten des Gesprächsverlaufs
Ebenso. Ein PATCH-Request an https://conversations.messagebird.com/v1/conversations/{id} mit dem richtigen Status im Body ermöglicht es Ihnen, die Unterhaltung mit dieser ID zu archivieren. Wir tun dies mit dem „bye“-Befehl:
case "bye": archiveConversation(whp.Conversation.ID) manager.close(whp.Conversation.ID) responseBody = "bye!"
archiveConversation führt den PATCH-Request aus und manager.close(whp.Conversation.ID) entfernt die To-Do-Listen-Konversation.
Aber hey, Programmable Conversations ist eine omni-channel-Lösung. Was, wenn Sie den Code des Bots für eine andere Plattform, wie WeChat, wiederverwenden möchten? Dieser Multi-Channel-Ansatz ist Teil der Strategie, Anfragen auf kostengünstigere Kanäle zu lenken. Wie würden Sie es angehen?
Erstellen Sie einfach einen neuen Webhook, um diesen Kanal zu adressieren! Ein Webhook, der Anfragen an die gleiche https://todobot.eu.ngrok.io/create-hook URL sendet, die wir für WhatsApp verwendet haben!
Dies wird funktionieren, weil der Handler-Code immer die conversationID aus der Webhook-Nutzlast verwendet, um die Nachrichten zu beantworten, anstatt eine fest codierte channelID zu verwenden. Die Conversations API von MessageBird wird automatisch den Kanal für die Unterhaltung bestimmen, über die Ihre Nachricht gesendet wird.
Möchten Sie Ihren eigenen Bot erstellen? Schauen Sie sich den vollständigen Code auf Github an: Wabot auf Github, beantragen Sie frühen Zugang zu WhatsApp, indem Sie die WhatsApp-Seite besuchen und auf die Schaltfläche „Kontakt Vertrieb“ klicken, um das Formular auszufüllen. Viel Spaß beim Botten!



