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

Möchten Sie IFTTT nutzen, um neue Themen, Beiträge und persönliche Nachrichten zu erstellen? Legen wir los!

Mithilfe der Maker Webhooks des IFTTT-Dienstes können wir Discourse-API-Aufrufe 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 Ihren bevorzugten Auslöser-Dienst. Ich verwende hier beispielsweise den Google Calendar-Dienst.

Als Auslöser wähle ich dann Jedes neue Ereignis hinzufügen.

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

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]

:warning: Wichtig: API-Anmeldeinformationen müssen als HTTP-Header (Api-Key und Api-Username) gesendet 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 – nutzen Sie das Feld Zusätzliche Header, um sie hinzuzufügen.

  • Nachrichtentext (Body):
{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\nOrt: {{Where}}\nUm: {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

Im Nachrichtentext sehen Sie viele Felder mit doppelten Klammern {{ }}. Diese Felder (Inhaltsquellen) variieren je nach Auslöser des jeweiligen Dienstes. Wählen Sie sie über die Schaltfläche Zutat unten aus.

Sie können die Felder title und raw im JSON-Nachrichtentext nach Bedarf mit umgebendem Text bearbeiten. Finden Sie die Kategorie-ID über die URL /site.json Ihrer Site und tragen Sie sie im Kategorien-Feld ein. Klicken Sie nun auf die Schaltfläche 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 Calendar erstellt wird :calendar_spiral:.


Um eine Antwort auf ein bestehendes Thema zu erstellen, anstatt ein neues Thema zu erstellen, muss der Nachrichtentext wie folgt geändert werden (topic_id statt category):

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

Um eine neue persönliche Nachricht zu erstellen:

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

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

22 „Gefällt mir“

Ich frage mich, ob diese Option nicht mehr kostenlos ist und nur noch als Premium-Funktion für Entwickler verfügbar ist?

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.