Effectuez des requêtes vers l'API Discourse avec Zapier

Les requêtes vers l’API Discourse peuvent être automatisées en créant un Zap qui utilise un webhook Zapier comme étape d’action. Ce sujet décrit comment effectuer des requêtes pour les actions suivantes :

  • ajouter un utilisateur à un groupe
  • attribuer un badge personnalisé

Pour savoir comment effectuer d’autres types de requêtes API avec Zapier, lisez ce sujet, puis consultez la documentation de l’API Discourse pour l’action que vous souhaitez réaliser. Vous pouvez également découvrir comment créer une requête API pour une action spécifique en lisant Reverse engineer the Discourse API.

Configurer l’étape de déclenchement

Chaque Zap doit comporter une étape de déclenchement et une étape d’action. Le déclenchement permet de transmettre des données d’une application vers l’étape d’action du Zap. Dans certains cas, le déclenchement peut également empêcher le Zap d’exécuter son étape d’action à moins que les données ne répondent à certaines conditions.

Pour configurer votre étape d’action, rendez-vous sur votre tableau de bord Zapier et cliquez sur le bouton Créer un Zap. Un formulaire de recherche s’ouvrira pour vous demander de choisir une application de déclenchement.

Pour les exemples de ce sujet, j’utilise l’événement Nouveau utilisateur de WordPress comme étape d’action. Cela s’explique par le fait qu’il est facile à configurer pour tester les appels API.

Le nœud « Tester cette étape » de votre étape de déclenchement vous permet de sélectionner un échantillon de données provenant de votre application de déclenchement, qui sera transmis à l’étape d’action de votre Zap. Ces données seront utiles pour configurer l’étape d’action.

Ajouter une étape facultative pour récupérer des détails depuis Discourse

Selon les données transmises par votre application de déclenchement, vous devrez peut-être récupérer certaines données depuis Discourse avant de pouvoir effectuer votre requête API finale. Par exemple, le déclenchement Nouveau utilisateur de WordPress transmet le nom d’utilisateur WordPress et l’adresse e-mail de l’utilisateur. Je sais que l’adresse e-mail correspondra à celle de l’utilisateur Discourse, mais pour les requêtes API de cet exemple, j’ai besoin de connaître le nom d’utilisateur Discourse de l’utilisateur.

Pour obtenir les détails d’un utilisateur Discourse à partir de son adresse e-mail, ajoutez une étape d’action à votre Zap. Sélectionnez « GET » dans le menu d’action du webhook.

Dans l’étape d’édition du modèle du webhook, entrez l’URL de base de votre site Discourse, suivie de /admin/users/list/all.json, dans la section URL. Par exemple, l’URL de base de mon site est https://demo.scossar.com, j’entre donc https://demo.scossar.com/admin/users/list/all.json dans le champ URL.

Dans la section Paramètres de la chaîne de requête, entrez « email » comme clé, puis cliquez sur l’icône « Insérer un champ » pour ouvrir le menu déroulant. Sélectionnez la valeur transmise par votre étape de déclenchement qui contient l’adresse e-mail de l’utilisateur.

Authentifier la requête

Faites défiler le formulaire jusqu’à sa section En-têtes. Cette section sert à authentifier la requête. Elle nécessite trois paires clé/valeur :

  • Api-Username : le nom d’utilisateur d’un administrateur sur votre site. Dans la plupart des cas, l’utilisateur « system » est un bon choix.
  • Api-Key : la clé API associée au nom d’utilisateur utilisé dans la première paire clé/valeur.
  • Content-Type : multipart/form-data

La section En-têtes complétée devrait ressembler à ceci, mais avec la clé API de votre utilisateur :

Cliquez sur le bouton Continuer pour voir les données récupérées depuis Discourse pour cette requête.

Ajouter l’étape d’action finale

Une fois votre déclenchement et l’étape facultative de récupération de données depuis Discourse configurés, cliquez sur le lien « Ajouter une étape » et sélectionnez « Webhooks by Zapier » dans le menu d’action. On vous demandera ensuite de choisir la méthode de requête que vous souhaitez utiliser dans votre requête API vers Discourse.

Voici les types de requêtes requis pour les exemples utilisés dans ce sujet :

  • ajouter un utilisateur à un groupe : PUT
  • attribuer un badge personnalisé : POST

Pour configurer des requêtes API autres que les exemples de ce sujet, consultez la documentation de l’API Discourse pour voir s’il existe un exemple de la requête que vous souhaitez effectuer. Si vous ne trouvez pas d’exemple, lisez Comment déduire le fonctionnement de l’API Discourse pour apprendre à trouver l’URL et la méthode de requête pour l’action que vous souhaitez réaliser. Une fois la méthode de requête trouvée, sélectionnez-la dans le menu d’action.

Remarque : si votre requête utilise la méthode DELETE, sélectionnez « Requête personnalisée » dans le menu d’action.

Configurer l’étape d’action finale

La section En-têtes de l’action peut être configurée de la même manière pour toutes les requêtes API. Consultez la section « Authentifier la requête » de ce sujet pour plus de détails. Si vous avez ajouté l’étape facultative pour récupérer des détails depuis Discourse, vous pouvez configurer la section En-têtes de l’action finale exactement de la même manière que pour cette étape.

Une fois les paires clé/valeur d’en-tête ajoutées, vous devrez remplir les champs URL et Données du formulaire pour votre requête API.

Ajouter un utilisateur à un groupe

Pour ajouter un utilisateur à un groupe, une requête PUT est envoyée vers /groups/<group_id>/members.json. Le moyen le plus simple de trouver l’ID d’un groupe est de visiter la page du groupe via l’interface utilisateur de Discourse, puis d’ajouter .json à la fin de l’URL dans la barre d’adresse de votre navigateur. Par exemple, mon site possède un groupe « support » à l’adresse https://demo.scossar.com/g/support. En accédant à https://demo.scossar.com/g/support.json, je peux voir que l’ID du groupe est 41. L’URL de base de mon forum est https://demo.scossar.com. L’URL de mon étape d’action finale pour ajouter des utilisateurs à un groupe est donc définie sur https://demo.scossar.com/groups/41/members.json.

La requête pour ajouter des utilisateurs à un groupe nécessite un paramètre : une liste de noms d’utilisateur séparés par des virgules. Dans la section Données du formulaire, entrez « usernames » comme clé. Cliquez ensuite sur l’icône « Insérer un champ » pour rechercher la propriété nom d’utilisateur transmise soit par le déclenchement, soit par l’étape d’action GET facultative.

Dans mon cas, je souhaite le nom d’utilisateur récupéré par l’étape GET, j’élargis donc le menu « GET » et sélectionne Nom d’utilisateur dans le menu déroulant.

Toutes les autres sections du formulaire peuvent rester avec leurs valeurs par défaut.

Cliquez sur le bouton Continuer, puis testez votre étape. Si l’utilisateur que vous avez transmis via les étapes précédentes existe sur votre site Discourse et qu’il n’est pas déjà membre du groupe que vous avez sélectionné, il devrait être ajouté au groupe lors du test de l’étape.

Si tout fonctionne comme prévu, activez votre Zap.

Attribuer un badge personnalisé

Pour attribuer un badge personnalisé à un utilisateur, une requête POST est envoyée vers l’URL de base de votre forum + /user_badges. Pour mon site, l’URL pour attribuer des badges est https://demo.scossar.com/user_badges. Le champ URL complété dans Zapier ressemble à ceci :

La section Données du formulaire nécessite deux paires clé/valeur. Ajoutez une clé « username » et définissez-la sur le champ qui retourne le nom d’utilisateur de l’utilisateur. Ajoutez une clé « badge_id » et définissez-la sur l’ID du badge que vous souhaitez attribuer. Vous pouvez trouver l’ID du badge en accédant à votre page Admin / Badges et en sélectionnant le badge dans le menu de gauche. Vous verrez l’ID du badge comme la dernière valeur de l’URL dans la barre d’adresse de votre navigateur.

Le badge que j’attribue a un ID de 105, ma section Données complétée ressemble donc à ceci :

Assurez-vous d’avoir configuré la section En-têtes du formulaire, puis cliquez sur Continuer. Cliquez ensuite sur le bouton Envoyer le test pour tester votre Zap. L’utilisateur que vous avez transmis via les étapes précédentes devrait se voir attribuer le badge.

Si tout fonctionne correctement, activez le Zap.

15 « J'aime »

Can this workflow be used to automatically create an account for a new user and add them to a specific discourse group?

The use case here is someone buys a training product, I want to automatically then add them to the relevant discourse sub forum for that product.

I can get the new customer data into Zapier but the regular discourse zap doesn’t have create account capabilities - just wondering if I can do this via the API and webhook link as you describe in this example.

Thanks!

2 « J'aime »

The easiest approach would be to send an invite email to the person after they make a purchase. You can setup the invite so that the user is automatically added to a Discourse group when they accept the invitation. See Automate sending Discourse invite emails with Zapier for details.

If sending invites is not an option for you, it should be possible to use a Zapier webhook to create a Discourse user. The Discourse API Docs give details about the request to create a user.

8 « J'aime »

Thanks @simon I’ll try the email invite. No doubt some people won’t get it/find it/open it but it’s the easier option for sure.

Appreciate the speedy response too!

It’s often easier to have whatever is selling the thing make the discourse api calls directly.

1 « J'aime »

Is there a reason why this works for me when I do it in Zapier, but I get an empty response when I try to do my own fetch request?

I’m using ObservableHQ, but the idea is the same. Shouldn’t this work?:

fetch("https://mycommunity.com/g.json", {
  headers: {
    "Content-Type": "multipart/form-data",
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
  method: "GET",
  mode: "no-cors"
})

Are you able to get any API requests to Discourse working with calls in that format with ObservableHQ? It seems that there must be something wrong with the format of the request.

You can also double check requests by making curl calls from your terminal, or by using Postman.

1 « J'aime »

OK, I figured out what I needed to do:

  1. Install cors-anywhere locally and run the server
  2. Modify the request to include the reverse proxy before the API endpoint and call the json method in the Fetch Response object:
await (fetch("http://localhost:8080/mycommunity.com/g.json", {
  headers: {
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
})).json()
2 « J'aime »

Je vais juste laisser ça ici, ça vaut peut-être le coup d’être vérifié :

2 « J'aime »

Bonjour @simon, merci pour ce tutoriel. Je configure cela dans Zapier, mais mon forum ne possède pas cette URL pour attribuer des badges.

Je me demande si ce n’est pas une URL standard pour toutes les installations de Discourse, ou si l’URL a peut-être changé lors d’une mise à jour récente ?

Il devrait l’avoir. Cependant, ce n’est pas une URL accessible via l’interface utilisateur de Discourse. Je viens de vérifier la route sur mon site en suivant les étapes décrites ici : Comment faire de l’ingénierie inverse de l’API Discourse. D’après cela, il semble que les détails fournis dans le sujet soient toujours à jour.

2 « J'aime »

Ce n’était pas une surprise, c’était ma propre erreur.

1 « J'aime »