Comment créer un bot WhatsApp pour les listes de tâches en utilisant l'API des Conversations Programmables de Bird.

Oiseau

5 févr. 2020

WhatsApp

1 min read

Comment créer un bot WhatsApp pour les listes de tâches en utilisant l'API des Conversations Programmables de Bird.

Points Clés

    • Bird’s Programmable Conversations API unifie WhatsApp, Messenger et SMS en une seule couche de communication, simplifiant le développement de bots multi-canaux.

    • Vous pouvez rapidement prototyper un bot de liste de tâches WhatsApp en utilisant des webhooks et des requêtes POST simples.

    • Des outils comme ngrok vous permettent d'exposer votre serveur local pour les tests de webhook sans configuration d'hébergement complexe.

    • L’API gère les conversations sur plusieurs canaux, permettant une base de logique unique pour WhatsApp, WeChat et d'autres applications.

    • Utilisez le point de terminaison archiveConversation pour clôturer les conversations ou « sujets », idéal pour le support ou le suivi des flux de travail.

    • La logique du bot peut gérer des conversations concurrentes en toute sécurité en mémoire avec une structure de données simple.

    • Le même gestionnaire de webhook fonctionne sur tous les canaux — Bird route automatiquement les réponses en fonction de l'ID de la conversation d'origine.

Points forts des Q&A

  • Quelle est la difficulté de créer un bot WhatsApp en utilisant l'API de Bird ?

    C'est étonnamment facile. Avec un webhook et quelques appels d'API, vous pouvez construire un bot fonctionnel qui lit et répond aux messages en quelques minutes.

  • Ai-je besoin d'une configuration spéciale pour recevoir des messages ?

    Oui — le bot doit être accessible depuis Internet. Des outils comme ngrok aident à créer un tunnel sécurisé depuis votre machine locale.

  • Puis-je utiliser la même codebase pour différentes applications de messagerie ?

    Absolument. L'API Conversations abstrait les canaux, de sorte que votre bot peut fonctionner sur WhatsApp, WeChat ou Messenger en utilisant une logique identique.

  • Comment fermer ou réinitialiser un fil de discussion ?

    Envoyez une requête PATCH au point de terminaison de la conversation avec le statut approprié pour l'archiver. Tout nouveau message ouvre automatiquement une nouvelle conversation.

  • Où puis-je trouver un exemple de code ?

    A: La démonstration complète de fonctionnement — Wabot on GitHub — montre l'implémentation de la gestion des messages, de la concurrence et de l'archivage.

Bird a récemment lancé Programmable Conversations. Cela permet aux entreprises d'intégrer des plateformes de communication comme WhatsApp, Messenger et SMS dans leurs systèmes — en utilisant une seule API.

Je voulais essayer, alors j'ai construit un bot WhatsApp pour une liste de tâches, parce que qui n'a pas besoin d'une liste de tâches automatisée pour aider à organiser leur journée ? Cela peut sembler compliqué, mais c'était en fait facile, et j'aimerais tout vous raconter à ce sujet.

Maintenant, je travaille chez MessageBird, donc je pouvais simplement plonger et commencer à construire. Si vous essayez cela, vous devrez demander un accès anticipé. Mais une fois que vous êtes configuré avec un canal WhatsApp, vous pouvez vous connecter au tableau de bord sur le site Web de MessageBird et commencer.

Bird a récemment lancé Programmable Conversations. Cela permet aux entreprises d'intégrer des plateformes de communication comme WhatsApp, Messenger et SMS dans leurs systèmes — en utilisant une seule API.

Je voulais essayer, alors j'ai construit un bot WhatsApp pour une liste de tâches, parce que qui n'a pas besoin d'une liste de tâches automatisée pour aider à organiser leur journée ? Cela peut sembler compliqué, mais c'était en fait facile, et j'aimerais tout vous raconter à ce sujet.

Maintenant, je travaille chez MessageBird, donc je pouvais simplement plonger et commencer à construire. Si vous essayez cela, vous devrez demander un accès anticipé. Mais une fois que vous êtes configuré avec un canal WhatsApp, vous pouvez vous connecter au tableau de bord sur le site Web de MessageBird et commencer.

Bird a récemment lancé Programmable Conversations. Cela permet aux entreprises d'intégrer des plateformes de communication comme WhatsApp, Messenger et SMS dans leurs systèmes — en utilisant une seule API.

Je voulais essayer, alors j'ai construit un bot WhatsApp pour une liste de tâches, parce que qui n'a pas besoin d'une liste de tâches automatisée pour aider à organiser leur journée ? Cela peut sembler compliqué, mais c'était en fait facile, et j'aimerais tout vous raconter à ce sujet.

Maintenant, je travaille chez MessageBird, donc je pouvais simplement plonger et commencer à construire. Si vous essayez cela, vous devrez demander un accès anticipé. Mais une fois que vous êtes configuré avec un canal WhatsApp, vous pouvez vous connecter au tableau de bord sur le site Web de MessageBird et commencer.

Setting up your WhatsApp bot environnement

La première chose que j'ai faite a été de lire les docs. J'ai appris que, pour recevoir des messages du bot, je devrais utiliser un webhook. Cela signifiait que mon bot devrait être accessible depuis Internet. Lors de la création d'APIs comme celle-ci, il est important de suivre les meilleures pratiques de versionnage d'API pour la maintenabilité. Puisque je venais de commencer à le coder, j'ai décidé d'utiliser ngrok. Il crée un tunnel de l'internet public jusqu'à votre précieux localhost sur le port 5007. Engagez !

ngrok http 5007 -region eu -subdomain todobot

La première chose que j'ai faite a été de lire les docs. J'ai appris que, pour recevoir des messages du bot, je devrais utiliser un webhook. Cela signifiait que mon bot devrait être accessible depuis Internet. Lors de la création d'APIs comme celle-ci, il est important de suivre les meilleures pratiques de versionnage d'API pour la maintenabilité. Puisque je venais de commencer à le coder, j'ai décidé d'utiliser ngrok. Il crée un tunnel de l'internet public jusqu'à votre précieux localhost sur le port 5007. Engagez !

ngrok http 5007 -region eu -subdomain todobot

La première chose que j'ai faite a été de lire les docs. J'ai appris que, pour recevoir des messages du bot, je devrais utiliser un webhook. Cela signifiait que mon bot devrait être accessible depuis Internet. Lors de la création d'APIs comme celle-ci, il est important de suivre les meilleures pratiques de versionnage d'API pour la maintenabilité. Puisque je venais de commencer à le coder, j'ai décidé d'utiliser ngrok. Il crée un tunnel de l'internet public jusqu'à votre précieux localhost sur le port 5007. Engagez !

ngrok http 5007 -region eu -subdomain todobot

Créer votre webhook et connecter Bird

Ensuite, j'ai besoin de faire un appel à l'API Programmable Conversations pour créer le webhook. C’est un POST à https://conversations.messagebird.com/v1/webhooks et cela ressemble à ceci :

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))
  }
}


Génial. Maintenant, l'API Conversations va faire une demande POST à :

https://todobot.eu.ngrok.io/create-hook à chaque fois qu'un nouveau message est créé sur le canal WhatsApp que vous avez configuré précédemment.

Voici à quoi ressemble un payload de 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"
}


Nous voulons répondre à ces messages. Commençons par les répercuter, qu'en dites-vous ?

// 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")
}

Ensuite, j'ai besoin de faire un appel à l'API Programmable Conversations pour créer le webhook. C’est un POST à https://conversations.messagebird.com/v1/webhooks et cela ressemble à ceci :

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))
  }
}


Génial. Maintenant, l'API Conversations va faire une demande POST à :

https://todobot.eu.ngrok.io/create-hook à chaque fois qu'un nouveau message est créé sur le canal WhatsApp que vous avez configuré précédemment.

Voici à quoi ressemble un payload de 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"
}


Nous voulons répondre à ces messages. Commençons par les répercuter, qu'en dites-vous ?

// 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")
}

Ensuite, j'ai besoin de faire un appel à l'API Programmable Conversations pour créer le webhook. C’est un POST à https://conversations.messagebird.com/v1/webhooks et cela ressemble à ceci :

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))
  }
}


Génial. Maintenant, l'API Conversations va faire une demande POST à :

https://todobot.eu.ngrok.io/create-hook à chaque fois qu'un nouveau message est créé sur le canal WhatsApp que vous avez configuré précédemment.

Voici à quoi ressemble un payload de 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"
}


Nous voulons répondre à ces messages. Commençons par les répercuter, qu'en dites-vous ?

// 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")
}

Envoi de réponses et gestion des messages

Maintenant, pour la partie intéressante. Faites une requête POST vers :

https://conversations.messagebird.com/v1/conversations/<conversationID>/messages pour répondre à la demande.

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
}

Voilà. C'est tout ce dont vous avez besoin pour créer un bot qui agit comme un humain de 5 ans.


Voici pourquoi l'utilisation de l'API Conversations de Bird rend le développement de bots WhatsApp rapide et évolutif :

Fonctionnalité

Ce que ça résout

ID de conversation unifié

Maintenir un fil unique à travers des applications comme WhatsApp, WeChat, Messenger

API unique pour tous les canaux

Réutiliser la logique du bot sans réécriture pour chaque plateforme

Automatisation pilotée par webhook

Gestion des réponses rapides sans interrogation

Archiver + rouvrir des sujets

Organiser l'historique et les flux de support

Structure sécurisée pour la concurrence

Gérer plusieurs discussions à la fois de manière fiable


Maintenant, poussons vers la construction de toute la liste de tâches. Tout d'abord, modifiez un peu la fonction createHookHandler afin qu'elle appelle la nouvelle fonction handleMessage au lieu de répondre.

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


handle va analyser les messages de manière simpliste, faire un peu de travail, et choisir la réponse. Examinons la commande « 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)
}

Ici, nous configurons : list := manager.fetch(whp.Conversation.ID). Fondamentalement, « manager » est une carte sécurisée pour la concurrence qui associe les ID de conversation aux listes de tâches.

Une liste de tâches est une tranche de chaîne de caractères sécurisée pour la concurrence. Tout en mémoire !

Maintenant, pour la partie intéressante. Faites une requête POST vers :

https://conversations.messagebird.com/v1/conversations/<conversationID>/messages pour répondre à la demande.

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
}

Voilà. C'est tout ce dont vous avez besoin pour créer un bot qui agit comme un humain de 5 ans.


Voici pourquoi l'utilisation de l'API Conversations de Bird rend le développement de bots WhatsApp rapide et évolutif :

Fonctionnalité

Ce que ça résout

ID de conversation unifié

Maintenir un fil unique à travers des applications comme WhatsApp, WeChat, Messenger

API unique pour tous les canaux

Réutiliser la logique du bot sans réécriture pour chaque plateforme

Automatisation pilotée par webhook

Gestion des réponses rapides sans interrogation

Archiver + rouvrir des sujets

Organiser l'historique et les flux de support

Structure sécurisée pour la concurrence

Gérer plusieurs discussions à la fois de manière fiable


Maintenant, poussons vers la construction de toute la liste de tâches. Tout d'abord, modifiez un peu la fonction createHookHandler afin qu'elle appelle la nouvelle fonction handleMessage au lieu de répondre.

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


handle va analyser les messages de manière simpliste, faire un peu de travail, et choisir la réponse. Examinons la commande « 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)
}

Ici, nous configurons : list := manager.fetch(whp.Conversation.ID). Fondamentalement, « manager » est une carte sécurisée pour la concurrence qui associe les ID de conversation aux listes de tâches.

Une liste de tâches est une tranche de chaîne de caractères sécurisée pour la concurrence. Tout en mémoire !

Maintenant, pour la partie intéressante. Faites une requête POST vers :

https://conversations.messagebird.com/v1/conversations/<conversationID>/messages pour répondre à la demande.

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
}

Voilà. C'est tout ce dont vous avez besoin pour créer un bot qui agit comme un humain de 5 ans.


Voici pourquoi l'utilisation de l'API Conversations de Bird rend le développement de bots WhatsApp rapide et évolutif :

Fonctionnalité

Ce que ça résout

ID de conversation unifié

Maintenir un fil unique à travers des applications comme WhatsApp, WeChat, Messenger

API unique pour tous les canaux

Réutiliser la logique du bot sans réécriture pour chaque plateforme

Automatisation pilotée par webhook

Gestion des réponses rapides sans interrogation

Archiver + rouvrir des sujets

Organiser l'historique et les flux de support

Structure sécurisée pour la concurrence

Gérer plusieurs discussions à la fois de manière fiable


Maintenant, poussons vers la construction de toute la liste de tâches. Tout d'abord, modifiez un peu la fonction createHookHandler afin qu'elle appelle la nouvelle fonction handleMessage au lieu de répondre.

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


handle va analyser les messages de manière simpliste, faire un peu de travail, et choisir la réponse. Examinons la commande « 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)
}

Ici, nous configurons : list := manager.fetch(whp.Conversation.ID). Fondamentalement, « manager » est une carte sécurisée pour la concurrence qui associe les ID de conversation aux listes de tâches.

Une liste de tâches est une tranche de chaîne de caractères sécurisée pour la concurrence. Tout en mémoire !

Archivage des conversations et mise à l'échelle de votre bot

Une autre chose importante! Vous pouvez archiver des conversations. Dans certaines applications, comme les CRM, il est important de suivre certaines interactions — pour suivre l'efficacité des employés du service client, par exemple. L'API Conversations vous permet d'archiver une conversation pour « fermer » le sujet. Si l'utilisateur/client envoie un autre message, l'API Conversations ouvrira automatiquement un nouveau sujet.

Gestion du cycle de vie de la conversation

Aussi. Faire une requête PATCH à https://conversations.messagebird.com/v1/conversations/{id} avec le bon statut dans le corps vous permet d'archiver la conversation avec cet identifiant. Nous le faisons avec la commande « bye »:

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

archiveConversation effectuera la requête PATCH et manager.close(whp.Conversation.ID) supprimera la conversation de la liste des tâches à faire.

Mais hey, Programmable Conversations est une solution omni-canale. Et si vous vouliez réutiliser le code du bot pour une plateforme différente, comme WeChat? Cette approche multi-canaux fait partie de la stratégie de déflexion des demandes vers des canaux moins coûteux. Comment vous y prendriez-vous?

Il suffit de créer un nouveau webhook pour cibler ce canal ! Un webhook qui envoie des requêtes à la même URL https://todobot.eu.ngrok.io/create-hook que nous avons utilisée pour WhatsApp!

Cela fonctionnera car le code du gestionnaire utilise toujours le conversationID du payload du webhook pour répondre aux messages au lieu d'un channelID codé en dur. L'API Conversations de MessageBird déterminera automatiquement le canal pour envoyer votre message.

Voulez-vous construire votre propre bot? Regardez le code complet sur Github: Wabot sur Github, demandez un accès anticipé à WhatsApp en visitant la page WhatsApp et en cliquant sur le bouton Contact Sales pour remplir le formulaire. Joyeux botting!

Une autre chose importante! Vous pouvez archiver des conversations. Dans certaines applications, comme les CRM, il est important de suivre certaines interactions — pour suivre l'efficacité des employés du service client, par exemple. L'API Conversations vous permet d'archiver une conversation pour « fermer » le sujet. Si l'utilisateur/client envoie un autre message, l'API Conversations ouvrira automatiquement un nouveau sujet.

Gestion du cycle de vie de la conversation

Aussi. Faire une requête PATCH à https://conversations.messagebird.com/v1/conversations/{id} avec le bon statut dans le corps vous permet d'archiver la conversation avec cet identifiant. Nous le faisons avec la commande « bye »:

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

archiveConversation effectuera la requête PATCH et manager.close(whp.Conversation.ID) supprimera la conversation de la liste des tâches à faire.

Mais hey, Programmable Conversations est une solution omni-canale. Et si vous vouliez réutiliser le code du bot pour une plateforme différente, comme WeChat? Cette approche multi-canaux fait partie de la stratégie de déflexion des demandes vers des canaux moins coûteux. Comment vous y prendriez-vous?

Il suffit de créer un nouveau webhook pour cibler ce canal ! Un webhook qui envoie des requêtes à la même URL https://todobot.eu.ngrok.io/create-hook que nous avons utilisée pour WhatsApp!

Cela fonctionnera car le code du gestionnaire utilise toujours le conversationID du payload du webhook pour répondre aux messages au lieu d'un channelID codé en dur. L'API Conversations de MessageBird déterminera automatiquement le canal pour envoyer votre message.

Voulez-vous construire votre propre bot? Regardez le code complet sur Github: Wabot sur Github, demandez un accès anticipé à WhatsApp en visitant la page WhatsApp et en cliquant sur le bouton Contact Sales pour remplir le formulaire. Joyeux botting!

Une autre chose importante! Vous pouvez archiver des conversations. Dans certaines applications, comme les CRM, il est important de suivre certaines interactions — pour suivre l'efficacité des employés du service client, par exemple. L'API Conversations vous permet d'archiver une conversation pour « fermer » le sujet. Si l'utilisateur/client envoie un autre message, l'API Conversations ouvrira automatiquement un nouveau sujet.

Gestion du cycle de vie de la conversation

Aussi. Faire une requête PATCH à https://conversations.messagebird.com/v1/conversations/{id} avec le bon statut dans le corps vous permet d'archiver la conversation avec cet identifiant. Nous le faisons avec la commande « bye »:

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

archiveConversation effectuera la requête PATCH et manager.close(whp.Conversation.ID) supprimera la conversation de la liste des tâches à faire.

Mais hey, Programmable Conversations est une solution omni-canale. Et si vous vouliez réutiliser le code du bot pour une plateforme différente, comme WeChat? Cette approche multi-canaux fait partie de la stratégie de déflexion des demandes vers des canaux moins coûteux. Comment vous y prendriez-vous?

Il suffit de créer un nouveau webhook pour cibler ce canal ! Un webhook qui envoie des requêtes à la même URL https://todobot.eu.ngrok.io/create-hook que nous avons utilisée pour WhatsApp!

Cela fonctionnera car le code du gestionnaire utilise toujours le conversationID du payload du webhook pour répondre aux messages au lieu d'un channelID codé en dur. L'API Conversations de MessageBird déterminera automatiquement le canal pour envoyer votre message.

Voulez-vous construire votre propre bot? Regardez le code complet sur Github: Wabot sur Github, demandez un accès anticipé à WhatsApp en visitant la page WhatsApp et en cliquant sur le bouton Contact Sales pour remplir le formulaire. Joyeux botting!

Autres news

Lire la suite de cette catégorie

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

La plateforme native AI complète qui évolue avec votre business.

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

La plateforme native AI complète qui évolue avec votre business.