Générer de nouveaux sujets, messages et MP via IFTTT

Vous souhaitez utiliser IFTTT pour créer de nouveaux sujets, des messages et des messages privés ? C’est parti !

En utilisant les Webhooks Maker du service IFTTT, nous pouvons effectuer des appels à l’API Discourse. Pour cela, nous devons d’abord générer des clés API. Vous pouvez créer des clés API depuis le panneau d’administration à l’adresse /admin/api/keys.

Nous pouvons également générer des clés API spécifiques à un utilisateur via les pages d’administration des utilisateurs.

Créez maintenant une nouvelle applet sur IFTTT, puis choisissez le service déclencheur de votre choix. Ici, j’utilise par exemple le service Google Calendar.

Ensuite, je choisis le déclencheur Tout nouvel événement ajouté.

Pour connecter votre déclencheur à Discourse, choisissez Maker Webhooks comme service d’action et Faire une requête web comme action.

Remplissez maintenant les champs de l’action comme suit :

  • URL (requis) : https://discourse.example.com/posts.json
  • Méthode (requis) : POST
  • Type de contenu : application/json
  • En-têtes supplémentaires :
Api-Key: [VOTRE_CLE_API]
Api-Username: [NOM_UTILISATEUR_API]

:warning: Important : Les identifiants API doivent être envoyés dans les en-têtes HTTP (Api-Key et Api-Username), et non en tant que paramètres de requête URL. Discourse n’accepte pas l’authentification par clé API via des paramètres de requête sur les requêtes POST. Le service Maker Webhooks d’IFTTT prend en charge les en-têtes personnalisés — utilisez le champ En-têtes supplémentaires pour les ajouter.

  • Corps :
{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nLieu : {{Where}}\nÀ : {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

Dans le texte du corps, vous verrez de nombreux champs entre doubles crochets {{ }}. Ces champs (sources de contenu) varieront selon les déclencheurs de chaque service. Sélectionnez-les via le bouton Ingrédient ci-dessous.

Vous pouvez modifier les champs title et raw dans le corps JSON selon vos besoins, en incluant du texte autour. Trouvez l’ID de catégorie depuis l’URL /site.json de votre site et placez-le dans le champ catégorie. Cliquez ensuite sur le bouton Créer l’action pour finaliser l’applet. Après sa création, il peut falloir un certain temps avant qu’elle ne soit active.

C’est fait :sunglasses:. Désormais, un nouveau sujet sera créé chaque fois qu’un nouvel événement est ajouté à votre Google Calendar :calendar_spiral:.


Pour créer une réponse à un sujet existant au lieu d’un nouveau sujet, modifiez le corps du texte comme suit (utilisez topic_id à la place de category) :

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nLieu : {{Where}}\nÀ : {{Starts}} - {{Ends}}",
 "topic_id": 4,
 "created_at": "{{CreatedAt}}"
}

Pour créer un nouveau message privé :

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nLieu : {{Where}}\nÀ : {{Starts}} - {{Ends}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{CreatedAt}}"
}

En suivant cette même méthode, vous pouvez effectuer des requêtes à l’API Discourse via n’importe quel autre service d’action IFTTT.

22 « J'aime »

Je me demande si cette option n’est plus gratuite et n’est disponible que sous forme de premium pour les développeurs ?

1 « J'aime »

Selon la documentation de l’API Discourse, les paramètres Api_username et Api_key doivent être envoyés dans les en-têtes de la requête HTTP. Les envoyer en tant que paramètres GET ne fonctionnera pas.

J’ai essayé et cela a échoué. Par conséquent, je n’ai pas pu utiliser IFTTT comme indiqué ici…

Cependant, j’ai fini par écrire un simple script PHP personnalisé qui agit comme un relais permettant d’envoyer des données à Discourse avec la configuration appropriée.

Code
<?php
header('Content-Type: application/json');

// Assurez-vous qu'il s'agit d'une requête POST.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'La méthode de requête doit être POST !'));
}

// Assurez-vous que le type de contenu de la requête POST est défini sur application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Le type de contenu doit être : application/json'));
}

// Recevoir les données brutes de la requête POST.
$content = trim(file_get_contents("php://input"));

// Tenter de décoder les données brutes de la requête POST entrantes au format JSON.
$payload = json_decode($content, true);

// Si json_decode échoue, le JSON est invalide.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Le contenu reçu contient un JSON invalide !'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Le point de terminaison Discourse doit être fourni dans le corps JSON !'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'La clé API Discourse doit être fournie dans le corps JSON !'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'L'utilisateur API Discourse doit être fourni dans le corps JSON !'));
    die();
}

$discourse_endpoint = $payload['discourse_endpoint'];
$api_key = $payload['api_key'];
$api_user = $payload['api_username'];

unset($payload['discourse_endpoint']);
unset($payload['api_key']);
unset($payload['api_username']);

$data_string = json_encode($payload);

$ch = curl_init($discourse_endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    "Api-key: $api_key",
    "Api-username: $api_user",
    'Content-Length: ' . strlen($data_string)
));
$result = curl_exec($ch);

echo $result;
?>

Vous pouvez en savoir plus à ce sujet ici : Generate new topics, posts and PM via Discourse Relay API Script - php - CTC Community Forum

2 « J'aime »

Je suis dans la même situation, j’essaie de configurer un applet IFTTT pour publier les éléments marqués avec un certain tag dans Pinboard (j’ai d’autres applets qui publient sur Mastodon où je peux passer un jeton comme élément d’en-tête plutôt que comme paramètres GET).

Mes compétences médiocres en PHP me font bien comprendre comment votre code fonctionne, ma question, étant moins connaisseur du serveur Discourse, est où puis-je placer le script ? Doit-il être sur le même serveur pour éviter les problèmes CORS ?

Ou devrais-je envisager une autre plateforme intermédiaire d’intégration que IFTTT ?

Il a juste besoin d’être hébergé sur un serveur qui peut accepter la requête d’IFTTT et peut communiquer avec votre instance Discourse via les fonctions curl. Il initie juste le même type de requête que l’interface web de Discourse. :slight_smile:

1 « J'aime »

Merci. Il semble que j’aie accès à Zapier, qui offre de meilleures intégrations.