Exemples complets de l'API REST de Discourse

Il existe plusieurs guides couvrant divers usages ou explications de l’API.

Celui-ci fournit des exemples pratiques et complets sur la façon de l’utiliser.

:warning: Tous les exemples de code dans ce guide ne visent pas à présenter les bonnes pratiques ni à être utilisés tels quels.
Beaucoup de vérifications, de gestion d’erreurs, etc. sont volontairement ignorées ou omises pour se concentrer uniquement sur l’utilisation de l’API.

À quoi sert l’API ?

La plupart de vos actions sur Discourse (publication, like, modification d’un paramètre, etc.) sont effectuées via l’API en envoyant des requêtes vers un endpoint[1].

Par exemple, lorsque vous créez un sujet sur meta, une requête POST est envoyée vers https://meta.discourse.org/posts.json. La requête contient, entre autres, l’auteur, le titre, la catégorie, les tags et le contenu de votre message.

L’utilisation personnalisée de l’API est généralement réalisée pour automatiser des tâches et souvent en conjonction avec d’autres services, tels que les webhooks, des scripts, des logiciels tiers et d’autres API.

Pour utiliser l’API, il est obligatoire de posséder des identifiants API. Cela peut être fait en quelques clics en suivant ce guide : Create and configure an API key

N’attendez plus, passons à un premier exemple d’utilisation de l’API. :technologist:

Créer un sujet mensuel

Dans cet exemple, nous utiliserons curl et cron pour créer un sujet mensuel de “discussion libre” sur votre forum. Une pratique populaire dans les communautés en ligne :slight_smile:

Créer la clé API

Suivez le guide de création de clé API. Définissez le Niveau utilisateur sur Utilisateur unique.
L’utilisateur choisi sera l’auteur du sujet mensuel.
Ensuite, vous pouvez choisir une portée Globale ou Granulaire, dans ce cas, elle devra avoir au moins l’accès SujetsÉcrire.
Notez votre clé API générée. :writing_hand:

Créer une commande curl

Depuis la ligne de commande de votre serveur, exécutez cette commande pour vérifier si cela fonctionne et si un sujet est correctement créé en utilisant curl et l’API REST de Discourse avec votre clé API :

curl -X POST "https://votre-discourse.com/posts.json" -H "Content-Type: application/json" -H "Api-Key: VOTRE_CLE_API" -H "Api-Username: VOTRE_NOM_UTILISATEUR" -d "{\"title\": \"Test de création de sujet avec l'API\", \"raw\": \"Et voici le contenu du sujet\", \"category\": ID_CATEGORIE }"

Remplacez :

  • votre-discourse.com par le domaine de votre forum
  • VOTRE_CLE_API par votre clé API
  • VOTRE_NOM_UTILISATEUR par le nom d’utilisateur choisi pour la clé API
  • ID_CATEGORIE par l’ID de la catégorie dans laquelle vous souhaitez publier votre sujet.

Si tout est correctement configuré, un nouveau sujet de test devrait être créé sur votre forum, comme ceci :

La majeure partie du travail est faite à cette étape ! Nous devons maintenant changer le titre et le contenu du sujet pour quelque chose de plus approprié et configurer la récurrence de la création du sujet.

Commencez par changer le titre du sujet de :
Test de création de sujet avec l'API
en :
Discussion libre du mois - $(date +\%B).

Faisons de même pour le contenu, en passant de :
Test de création de sujet avec l'API
à :
Qu'avez-vous le plus et le moins apprécié au cours de $(date +\%B -d 'last month') ?\nN'hésitez pas à partager vos impressions et à proposer des idées. 🙂

:information_source: J’utilise la commande Unix date pour insérer le nom du mois en cours dans le titre et le nom du mois précédent dans le contenu.

:information_source: \n dans le contenu crée une nouvelle ligne.

Vous pouvez utiliser la ligne de commande et exécuter la requête curl mise à jour. Elle devrait avoir créé un nouveau sujet comme ceci sur votre forum :

Configurer l’événement récurrent

Nous allons créer une tâche cron qui exécutera la commande curl le premier jour de chaque mois. :calendar:

Éditez le fichier cron avec la commande suivante :

crontab -e

Insérez cette ligne à la fin du fichier (remplacez le contenu de la requête si nécessaire) et enregistrez la modification.

0 0 1 * * curl -X POST "https://votre-discourse.com/posts.json" -H "Content-Type: application/json" -H "Api-Key: VOTRE_CLE_API" -H "Api-Username: VOTRE_NOM_UTILISATEUR" -d "{\"title\": \"Discussion libre du mois - $(date +\%B)\", \"raw\": \"Qu'avez-vous le plus et le moins apprécié au cours de $(date +\%B -d 'last month') ?\nN'hésitez pas à partager vos impressions et à proposer des idées. 🙂\", \"category\": 4 }"

:information_source: La partie 0 0 1 * * définit l’intervalle auquel la commande sera exécutée. Vous pouvez en savoir plus sur la syntaxe ici : https://crontab.guru

C’est fait ! Votre serveur créera maintenant un nouveau sujet de “discussion libre” le premier jour de chaque mois, en utilisant l’API REST de Discourse, une requête curl et une tâche cron. :partying_face:

Changer automatiquement le schéma de couleurs d’un thème

Faisons en sorte que notre thème par défaut utilise un schéma de couleurs correspondant à la saison actuelle :snowflake: :hibiscus: :sunny: :fallen_leaf:

Nous utiliserons Ruby pour gérer les vérifications des mois et une tâche cron pour exécuter le script.

Nous pourrions utiliser bien d’autres méthodes que Ruby et cron, mais ce guide vise également à montrer comment utiliser l’API avec divers outils.

Préparer le thème et les schémas de couleurs

Choisissez le thème dont vous souhaitez changer le schéma de couleurs et récupérez son ID. Vous trouverez l’ID dans l’URL du thème. Par exemple, l’ID de ce thème est 1 :

Créez 4 palettes de couleurs et notez également leurs ID.
Ici, l’ID de la palette d’automne est 17 :

Créer le script

Installez Ruby sur votre serveur.

Créez un fichier seasons.rb. Pour cet exemple, je considérerai qu’il se trouve dans ~/scripts/.

Mettez le contenu suivant dans ce fichier. Nous ferons une requête PUT vers notre endpoint de thème et enverrons un payload contenant l’ID du schéma de couleurs :

require 'net/http'
require 'json'
require 'date'

current_month = Date.today.month
color_scheme_id = case current_month
                  when 1..3 then 18 # Hiver
                  when 4..6 then 15 # Printemps
                  when 7..9 then 16 # Été
                  else           17 # Automne
                  end

uri = URI('https://votre-discourse.com/admin/themes/ID_THEME.json')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Put.new(uri, {
  'Api-Key' => 'VOTRE_CLE_API',
  'Api-Username' => 'VOTRE_NOM_UTILISATEUR',
  'Content-Type' => 'application/json'
})

request.body = JSON.generate({
  "theme" => {
    "color_scheme_id" => color_scheme_id
  }
})

response = http.request(request)

Remplacez :

  • votre-discourse.com par le domaine de votre forum
  • VOTRE_CLE_API par votre clé API
  • VOTRE_NOM_UTILISATEUR par le nom d’utilisateur choisi pour la clé API
  • ID_THEME par l’ID de votre thème. Vous pouvez le trouver à la fin de l’URL de la page de paramètres du thème.
    Par exemple, dans https://votre-discourse.com/admin/customize/themes/38, l’ID du thème est 38.

Essayons manuellement votre script.
D’abord, définissez-le sur un schéma de couleurs non saisonnier dans l’interface de Discourse si ce n’est pas déjà le cas.

Ensuite, exécutez le script avec la commande suivante :

ruby ~/scripts/seasons.rb

Actualisez votre navigateur. Le schéma de couleurs utilisé par votre thème devrait avoir changé. :slight_smile:

La dernière chose à faire est de créer la tâche cron qui exécutera ce script le premier jour du mois à chaque changement de saison.

Reportez-vous à le premier exemple si vous ne vous souvenez pas comment créer une tâche cron.

0 0 1 1,4,7,10 * ruby ~/scripts/seasons.rb

C’est fait ! Votre forum portera maintenant de nouvelles couleurs au début de chaque nouvelle saison ! :sunny: :partying_face:

Recevoir une requête web sur un serveur web et utiliser ses données pour mettre à jour un sujet Discourse

Celui-ci est plus complexe ! :technologist:

Notre outil sera PHP, ce qui signifie que nous supposerons que vous avez un serveur web fonctionnel quelque part avec PHP installé.

Dans cet exemple, nous recevrons une charge utile de webhook Ko-Fi (un service de dons) sur une page PHP, qui utilisera ensuite les données reçues pour utiliser l’API de Discourse et mettre à jour le titre et le contenu d’un sujet.

Plus précisément, elle mettra à jour le titre du sujet avec le montant du don et la date, et ajoutera une nouvelle ligne au tableau listant les dons précédents (elle fera même remonter automatiquement le sujet :shushing_face:) :

À chaque fois qu’un utilisateur fait un don, Ko-Fi[2] enverra une requête à notre script PHP.

Configurer Ko-Fi

J’ai configuré la configuration sur la page des webhooks de Ko-Fi en ajoutant simplement l’URL de mon fichier PHP et en notant le token de vérification caché dans la section Avancée.

Pour un don unique, Ko-Fi enverra une charge utile comme celle-ci à notre script PHP :

data = {
  "verification_token": "d8546b84-c698-4df5-9811-39d35813e2ff",
  "message_id": "a499df4c-7bbb-4061-b4a6-8b9d969da689",
  "timestamp": "2023-10-19T13:35:06Z",
  "type": "Donation",
  "is_public": true,
  "from_name": "Jo Example",
  "message": "Bonne chance pour l'intégration !",
  "amount": "3.00",
  "url": "https://ko-fi.com/Home/CoffeeShop?txid=00000000-1111-2222-3333-444444444444",
  "email": "jo.example@example.com",
  "currency": "USD",
  "is_subscription_payment": false,
  "is_first_subscription_payment": false,
  "kofi_transaction_id": "00000000-1111-2222-3333-444444444444",
  "shop_items": null,
  "tier_name": null,
  "shipping": null
}

Nous recevrons cette charge utile, puis extrairons les deux informations dont nous avons besoin :

  • Le montant (3.00), que nous arrondirons à un entier.

  • L’horodatage (2023-10-19T13:35:06Z), que nous formaterons en une date plus jolie.

Recevoir la charge utile de Ko-Fi

D’abord, nous mettons le code suivant dans notre page PHP pour recevoir la requête de Ko-Fi, où nous nous assurons d’avoir reçu une requête POST et que la valeur du token correspond à celle donnée sur la page des webhooks de Ko-Fi. Nous formatons également le montant et la date comme indiqué précédemment.

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $jsonData = json_decode($_POST['data'], true);

    if ($jsonData['verification_token'] === 'VOTRE_TOKEN_VERIFICATION') {
        $amount = floor(floatval($jsonData['amount']));
        $date = (new DateTime($jsonData['timestamp']))->format('d/m/Y');
    }
}

Remplacez :

  • VOTRE_TOKEN_VERIFICATION par le token fourni par Ko-Fi

Mettre à jour le titre du sujet

L’étape suivante consiste à mettre à jour le titre de notre sujet. Nous utiliserons curl dans notre script PHP pour effectuer une requête PUT vers le bon endpoint.

        $putData = json_encode(['title' => '🥳 Nouveau don : ' . $amount . '€ le ' . $date]);
        $ch = curl_init('https://votre-discourse.com/t/test-nouveau-sujet/ID_SUJET');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $putData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($putData),
            'Api-Key: VOTRE_CLE_API',
            'Api-Username: VOTRE_NOM_UTILISATEUR'
        ]);
        curl_exec($ch);

Remplacez :

  • votre-discourse.com par le domaine de votre forum
  • ID_SUJET par l’ID correct du sujet
  • VOTRE_CLE_API par votre clé API
  • VOTRE_NOM_UTILISATEUR par le nom d’utilisateur choisi pour la clé API

Mettre à jour le contenu du message

Pour pouvoir ajouter du nouveau contenu au premier message du sujet, nous devons d’abord récupérer son contenu actuel avec une requête GET.

        $ch_get = curl_init('https://votre-discourse.com/posts/ID_MESSAGE.json');
        curl_setopt($ch_get, CURLOPT_RETURNTRANSFER, true);
        $currentContent = json_decode(curl_exec($ch_get), true)['raw'];

Remplacez :

  • ID_MESSAGE par l’ID correct du message[3]

Enfin, nous devons mettre à jour le contenu du message en ajoutant une nouvelle ligne au tableau avec le montant et la date. Nous ferons cela avec une requête PUT.

        $updatedContent = $currentContent . "\n| " . $amount . "€ | " . $date . " |";
        $putPostData = json_encode(['post' => ['raw' => $updatedContent]]);
        $ch_put = curl_init('https://votre-discourse.com/posts/ID_MESSAGE');
        curl_setopt($ch_put, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch_put, CURLOPT_POSTFIELDS, $putPostData);
        curl_setopt($ch_put, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($putPostData),
            'Api-Key: VOTRE_CLE_API',
            'Api-Username: VOTRE_NOM_UTILISATEUR'
        ]);
        curl_exec($ch_put);

Remplacez :

  • votre-discourse.com par le domaine de votre forum
  • ID_MESSAGE par l’ID correct du message
  • VOTRE_CLE_API par votre clé API
  • VOTRE_NOM_UTILISATEUR par le nom d’utilisateur choisi pour la clé API

Le code final ressemble à ceci :

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $jsonData = json_decode($_POST['data'], true);

    if ($jsonData['verification_token'] === 'VOTRE_TOKEN_VERIFICATION') {
        $amount = floor(floatval($jsonData['amount']));
        $date = (new DateTime($jsonData['timestamp']))->format('d/m/Y');

        $putData = json_encode(['title' => '🥳 Nouveau don : ' . $amount . '€ le ' . $date]);
        $ch = curl_init('https://votre-discourse.com/t/test-nouveau-sujet/ID_SUJET');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $putData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($putData),
            'Api-Key: VOTRE_CLE_API',
            'Api-Username: VOTRE_NOM_UTILISATEUR'
        ]);
        curl_exec($ch);

        $ch_get = curl_init('https://votre-discourse.com/posts/ID_MESSAGE.json');
        curl_setopt($ch_get, CURLOPT_RETURNTRANSFER, true);
        $currentContent = json_decode(curl_exec($ch_get), true)['raw'];

        $updatedContent = $currentContent . "\n| " . $amount . "€ | " . $date . " |";
        $putPostData = json_encode(['post' => ['raw' => $updatedContent]]);
        $ch_put = curl_init('https://votre-discourse.com/posts/ID_MESSAGE');
        curl_setopt($ch_put, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch_put, CURLOPT_POSTFIELDS, $putPostData);
        curl_setopt($ch_put, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($putPostData),
            'Api-Key: VOTRE_CLE_API',
            'Api-Username: VOTRE_NOM_UTILISATEUR'
        ]);
        curl_exec($ch_put);

        curl_close($ch);
        curl_close($ch_get);
        curl_close($ch_put);
    } else {
        http_response_code(403);
        echo "Token de vérification invalide.";
    }
} else {
    http_response_code(405);
    echo "Seules les requêtes POST sont autorisées.";
}
?>

Je tiens à souligner à nouveau l’avertissement au début de ce guide :stuck_out_tongue:

:warning: Tous les exemples de code dans ce guide ne visent pas à présenter les bonnes pratiques ni à être utilisés tels quels.
Beaucoup de vérifications, de gestion d’erreurs, etc. sont volontairement ignorées ou omises pour se concentrer uniquement sur l’utilisation de l’API.

Nous pouvons maintenant déclencher une requête de test depuis Ko-Fi et voir comment elle met à jour notre sujet, tant le titre que le contenu. :slight_smile:

C’est tout !
Vous avez maintenant un sujet qui sera mis à jour et remonté à chaque fois que quelqu’un fait un don sur Ko-Fi ! :partying_face:


:information_source: Ce sujet est un wiki. N’hésitez pas à corriger toute erreur que vous voyez et à discuter de la façon dont ce guide pourrait être amélioré.


  1. Une URL spécifique, dans ce contexte. Par exemple, https://votre-discourse.com/posts.json ↩︎

  2. Un peu d’infos sur leur API : https://help.ko-fi.com/hc/en-us/articles/360004162298-Does-Ko-fi-Have-an-API-or-Webhook- ↩︎

  3. L’ID du message peut être trouvé dans le code HTML. C’est un élément <article> avec l’attribut suivant : data-post-id="ID_MESSAGE" ↩︎

10 « J'aime »

C’est génial @Canapin et très nécessaire je pense. Je cherchais quelque chose comme ça il y a quelque temps. Merci ! :slight_smile:

3 « J'aime »

Comment spécifier un sous-thème ?
Si j’ai jBASE avec un sous-thème AutoDoc, dois-je combiner les deux en un thème avec un délimiteur (jBASE>AutoDoc) ou existe-t-il une balise de catégorie ?

J’ai trouvé. Lorsque vous êtes sur la page de catégorie ou de sous-catégorie, l’URL affiche le # au lieu du nom de la catégorie. Comme les sous-catégories ont leurs propres numéros, vous n’avez pas à mélanger quoi que ce soit.

Comment remplacer un article par des informations mises à jour ?

Actuellement, j’obtiens
{“action”:“create_post”,“errors”:[“Le titre a déjà été utilisé”]}
au lieu d’une mise à jour réussie.

N’y a-t-il pas une action différente pour mettre à jour les publications ?

C’est le texte de réponse. Le curl demandeur ne spécifie pas d’action.

curl -X POST “http://LOCATION.local/posts.json” -H “Content-Type:
application/json” -H “Api-Key: APIKEY” -H “Api-Username: BOB” -d “{"title": "PL AUTO.DOC.FUN SCS
-TEST Autodoc", "raw": " …”

Et si vous utilisiez le point de terminaison pour mettre à jour un sujet ?

Ou peut-être mettre à jour un message :

Je n’avais pas vu ça. Bien vu. Je vais essayer. Merci.

Mise à jour : Il me manque toujours quelque chose. On dirait que la seule différence est l’ajout d’un edit_reason. J’ai essayé et ça n’a rien changé.

Voici le curl complet :

curl -X POST “http://localhost.local/posts.json” -H “Content-Type:
application/json” -H “Api-Key: API KEY” -H “Api-Username: BOB” -d “{"title": "Title of the Article","raw": "The quick brown fox jumped over the lazy dog.2023-12-26.","edit_reason": "auto","category": 66}”

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1927 0 65 100 1862 1177 33729 --:–:-- --:–:-- --:–:-- 34481

{“action”:“create_post”,“errors”:[“Title has already been used”]}

1 « J'aime »

Pour mettre à jour un sujet ou un message, vous devez utiliser la méthode PUT !

Comme Firepup l’a souligné, si vous souhaitez mettre à jour le contenu d’un message, vous pouvez utiliser l’API suivante : Discourse API Docs

Le problème est que PUT nécessite l’ID# et je ne les ai pas.
Lorsque je POST un nouveau sujet, je récupère le # mais ce numéro ne semble pas fonctionner.
Lorsque j’utilise un navigateur pour regarder un sujet, il affiche un # différent mais ce numéro ne semble pas fonctionner.

Par exemple : J’ai généré un sujet et l’événement POST renvoie {“id”:3244,…}
L’URL pour y accéder dit …test-pl-auto-doc-fun/2803

Donc, j’envoie ce PUT :
curl -X PUT “http://LOCATION.local/posts.json/3244” -H “Content-Type: application/json” -H “Api-Key: KEY” -H “Api-Username: system” -d
“{"title": "Autodoc SCS-TEST PL AUTO.DOC.FUN","raw": "…","edit_reason": "auto","category": 66}”

Et je reçois en retour le HTML pour la page non trouvée.

Devrait être /posts/3244.json.

L’id que vous obtenez de cette requête POST est l’ID du post (du premier post) ; il est unique pour tous les posts.

Les deux vidéos du guide semblent renvoyer une erreur 404.

1 « J'aime »

L’API peut-elle être utilisée pour appeler l’assistant IA ?

Je ne pense pas, car docs.discourse.org n’en fait pas mention. Je pourrais me tromper, cependant.

Pourquoi l’assistant IA doit-il être utilisé via une API :thinking:

pour créer un bot connecté à mon site web qui est connecté à mon forum avec sept ans de connaissances pour répondre aux questions.

ou pour créer un bot qui peut répondre aux e-mails et qui est connecté à mon forum avec sept ans de connaissances pour répondre aux questions.

Alors probablement ai-bot est plus ce que vous recherchez. ai-helper est celui qui aide à la lecture et à la rédaction des publications.

Comme le note le dit, ce n’est pas une liste complète.

Note : Pour tous les points d’accès non répertoriés, vous pouvez suivre le guide reverse engineer the Discourse API pour découvrir comment utiliser un point d’accès API.

2 « J'aime »

Vous pouvez faire tout ce que vous pouvez faire depuis l’UX avec l’API. Ingénierie inverse de l’API Discourse

Des choses sont ajoutées et modifiées dans l’API tout le temps. Je trouve plus facile de toujours voir ce qui se passe réellement dans le navigateur.

5 « J'aime »

excellente idée merci !