Neue Themen, Beiträge und PN über IFTTT erstellen

Möchten Sie IFTTT nutzen, um neue Themen, Beiträge und private Nachrichten zu erstellen? Dann legen wir los!

Mithilfe von Maker Webhooks des IFTTT-Dienstes können wir Aufrufe der Discourse-API tätigen. Dafür müssen wir zunächst API-Schlüssel generieren. Sie können API-Schlüssel im Admin-Bereich unter /admin/api/keys erstellen.

Außerdem können wir benutzerspezifische API-Schlüssel über die Benutzer-Admin-Seiten generieren.

Erstellen Sie nun eine neue Applet auf IFTTT und wählen Sie anschließend Ihren bevorzugten Trigger-Dienst. In diesem Beispiel verwende ich den Dienst Google Calendar.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/3/4/341b41d93de97b271496b99dcc53d21df4089ac4.png" width="591" height="409"\u003e

Als Trigger wähle ich Jedes neue hinzugefügte Ereignis.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/a/9/a92552c97474e03de602f8f5b134e4d3929bc76b.png" width="690" height="330"\u003e

Um Ihren Trigger mit Discourse zu verbinden, wählen Sie als Aktionsdienst Maker Webhooks und als Aktion Webanfrage stellen.

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/c/9/c9522a31c798594cadafc8f3962b0eb4cccc6a13.png" width="681" height="500"\u003e

Füllen Sie nun die Aktionsfelder wie folgt aus:

  • URL (erforderlich): https://discourse.example.com/posts.json

  • Methode (erforderlich): POST

  • Inhaltstyp: application/json

  • Zusätzliche Header:

Api-Key: [YOUR_API_KEY]
Api-Username: [API_USERNAME]

\u003e :warning: Wichtig: API-Anmeldedaten müssen als HTTP-Header (Api-Key und Api-Username) übermittelt werden, nicht als URL-Abfrageparameter. Discourse akzeptiert keine API-Schlüssel-Authentifizierung über Abfrageparameter bei POST-Anfragen. Der IFTTT-Maker-Webhooks-Dienst unterstützt benutzerdefinierte Header – verwenden Sie das Feld Zusätzliche Header, um diese hinzuzufügen.

  • Nachrichtenkörper:
{
 "title": "{{Title}}",
 "raw": "{{Description}}\\n\\nOrt: {{Where}}\\nZeit: {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/7/7/77365735ed9f95d460f2de4c16bcb13dbfda9ea0.png" width="194" height="500"\u003e

Im Nachrichtenkörper sehen Sie viele Felder mit doppelten Klammern {{ }}. Diese Felder (Inhaltsquellen) variieren je nach Trigger des jeweiligen Dienstes. Wählen Sie sie über den Button Zutat unten aus.

Sie können die Felder title und raw im JSON-Körper nach Bedarf anpassen, einschließlich umgebender Texte. Ermitteln Sie die Kategorie-ID über die URL /site.json Ihrer Seite und tragen Sie sie im Feld Kategorie ein. Klicken Sie nun auf den Button Aktion erstellen, um das Applet zu erstellen. Nach der Erstellung des Applets kann es einige Zeit dauern, bis es aktiv ist.

Fertig :sunglasses:. Nun wird automatisch ein neues Thema erstellt, sobald ein neues Ereignis in Ihrem Google-Kalender erstellt wird :calendar_spiral:.


Um eine Antwort auf ein bestehendes Thema zu erstellen, anstatt ein neues Thema zu erstellen, muss der Nachrichtenkörper wie folgt geändert werden (topic_id anstelle von category):

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

Um eine neue private Nachricht zu erstellen:

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

Auf die gleiche Weise können Sie Discourse-API-Anfragen über andere IFTTT-Aktionsdienste stellen.

22 „Gefällt mir“

I wonder if this option is no longer free and only available as a premium for developers ?

1 „Gefällt mir“

Laut der Discourse-API-Dokumentation müssen Api_username und Api_key über HTTP-Request-Header gesendet werden. Das Senden als GET-Parameter funktioniert nicht.

Ich habe es versucht, aber es ist fehlgeschlagen. Daher konnte ich IFTTT nicht wie hier beschrieben verwenden…

Ich habe jedoch ein einfaches benutzerdefiniertes PHP-Skript geschrieben, das als Relay-Hook fungiert und es ermöglicht, Daten mit der korrekten Konfiguration an Discourse zu senden.

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

// Stellen Sie sicher, dass es sich um eine POST-Anfrage handelt.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Die Anfragemethode muss POST sein!'));
}

// Stellen Sie sicher, dass der Content-Type der POST-Anfrage auf application/json gesetzt wurde.
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Der Content-Type muss sein: application/json'));
}

// Empfangen Sie die RAW-POST-Daten.
$content = trim(file_get_contents("php://input"));

// Versuchen Sie, die eingehenden RAW-POST-Daten aus JSON zu decodieren.
$payload = json_decode($content, true);

// Wenn json_decode fehlschlägt, ist das JSON ungültig.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Der empfangene Inhalt enthält ungültiges JSON!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Der Discourse-Endpunkt muss im JSON-Body angegeben werden!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'Der Discourse-API-Schlüssel muss im JSON-Body angegeben werden!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'Der Discourse-API-Benutzer muss im JSON-Body angegeben werden!'));
    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;
?>

Weitere Informationen finden Sie hier: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC Community Forum

2 „Gefällt mir“

Ich bin hier im selben Boot und versuche, ein IFTTT-Applet einzurichten, um Elemente zu posten, die mit einem bestimmten Tag in Pinboard markiert sind (ich habe andere Applets, die nach Mastodon posten, wo ich ein Token als Header-Element anstelle von GET-Parametern übergeben kann).\n\nMeine mittelmäßigen PHP-Kenntnisse sehen vollkommen, wie Ihr Code funktioniert. Meine Frage, da ich den Discourse-Server weniger gut kenne, ist, wo ich das Skript platzieren kann? Muss es auf demselben Server sein, um CORS-Probleme zu vermeiden?\n\nOder sollte ich mir eine andere Integrationsplattform als IFTTT ansehen?

Es muss lediglich auf einem Server gehostet werden, der die Anfrage von IFTTT akzeptieren und über die Curl-Funktionen mit Ihrer Discourse-Instanz kommunizieren kann. Es initiiert lediglich dieselbe Art von Anfrage, die die Discourse-Weboberfläche auch machen würde. :slight_smile:

1 „Gefällt mir“

Danke. Sieht so aus, als hätte ich Zugriff auf Zapier, das bessere Integrationen bietet.