Genera nuovi argomenti, post e messaggi privati tramite IFTTT

Vuoi utilizzare IFTTT per creare nuovi argomenti, post e messaggi privati? Iniziamo!

Utilizzando i Webhook di Maker del servizio IFTTT, possiamo effettuare chiamate all’API di Discourse. Per fare ciò, dobbiamo prima generare le chiavi API. Puoi crearle dal pannello di amministrazione all’indirizzo /admin/api/keys.

Inoltre, è possibile generare chiavi API specifiche per l’utente tramite le pagine di amministrazione degli utenti.

Ora crea un nuovo applet su IFTTT e scegli il servizio trigger preferito. In questo esempio, sto utilizzando il servizio Google Calendar.

Successivamente, scelgo il trigger Qualsiasi nuovo evento aggiunto.

Per collegare il tuo trigger a Discourse, seleziona Webhook di Maker come servizio di azione e l’azione Esegui una richiesta web.

Ora compila i campi dell’azione come indicato di seguito.

  • URL (obbligatorio): https://discourse.example.com/posts.json
  • Metodo (obbligatorio): POST
  • Tipo di contenuto: application/json
  • Intestazioni aggiuntive:
Api-Key: [LA_TUA_CHIAVE_API]
Api-Username: [NOME_UTENTE_API]

:warning: Importante: Le credenziali API devono essere inviate come intestazioni HTTP (Api-Key e Api-Username), non come parametri di query dell’URL. Discourse non accetta l’autenticazione tramite chiave API nei parametri di query per le richieste POST. Il servizio Webhook di Maker di IFTTT supporta intestazioni personalizzate: utilizza il campo Intestazioni aggiuntive per aggiungerle.

  • Corpo:
{
 "title": "{{Titolo}}",
 "raw": "{{Descrizione}}\n\nLuogo: {{Dove}}\nAlle: {{Inizio}} - {{Fine}}",
 "category": 4,
 "created_at": "{{DataCreazione}}"
}

Nel testo del corpo puoi vedere molti campi racchiusi tra doppie parentesi graffe {{ }}. Questi campi (fonti di contenuto) varieranno a seconda dei trigger di ogni servizio. Selezionali utilizzando il pulsante Ingrediente sottostante.

Puoi modificare i campi title e raw nel corpo JSON come necessario, includendo testi circostanti. Trova l’ID della categoria dall’URL /site.json del tuo sito e inseriscilo nel campo categoria. Ora clicca sul pulsante Crea azione per completare l’applet. Dopo la creazione, potrebbe essere necessario un po’ di tempo prima che diventi attiva.

È fatto :sunglasses:. Ora verrà creato un nuovo argomento ogni volta che viene aggiunto un nuovo evento al tuo Google Calendar :calendar_spiral:.


Per creare una risposta a un argomento esistente invece di un nuovo argomento, modifica il testo del corpo come segue (usa topic_id al posto di category):

{
 "title": "{{Titolo}}",
 "raw": "{{Descrizione}}\n\nLuogo: {{Dove}}\nAlle: {{Inizio}} - {{Fine}}",
 "topic_id": 4,
 "created_at": "{{DataCreazione}}"
}

Per creare un nuovo messaggio privato:

{
 "title": "{{Titolo}}",
 "raw": "{{Descrizione}}\n\nLuogo: {{Dove}}\nAlle: {{Inizio}} - {{Fine}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{DataCreazione}}"
}

Con lo stesso metodo puoi effettuare richieste all’API di Discourse utilizzando qualsiasi altro servizio di azione IFTTT.

22 Mi Piace

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

1 Mi Piace

Based on the Discourse API documentation, the Api_username and Api_key must be sent over HTTP request headers. Sending them as a GET params won’t work.

I tried and it failed. Therefore, I had wasn’t able to use IFTTT as it was instructed here…

However, I ended up writing a simple custom PHP script that acts as a relay hook that will allow data to be sent to discourse with the proper configuration.

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

//Make sure that it is a POST request.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Request method must be POST!'));
}

//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Content type must be: application/json'));
}

//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));

//Attempt to decode the incoming RAW post data from JSON.
$payload = json_decode($content, true);

//If json_decode failed, the JSON is invalid.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Received content contained invalid JSON!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Discourse endpoint must be provided in the json body!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'Discourse API Key must be provided in the json body!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'Discourse API User must be provided in the json body!'));
    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;

?>

You can read more about it here: Generate new topics, posts and PM via Discourse Relay API Script - discourse - Jamaican Developers Community Forum

2 Mi Piace

Sono nella stessa barca, sto cercando di configurare un applet IFTTT per pubblicare elementi aggiunti ai segnalibri con un certo tag in Pinboard (ho altri applet che pubblicano su Mastodon dove sono in grado di passare un token come elemento dell’intestazione anziché parametri GET).

Le mie mediocri capacità PHP vedono perfettamente come funziona il tuo codice, la mia domanda, essendo meno esperto del server discourse, è dove posso posizionare lo script? Deve essere sullo stesso server per evitare problemi CORS?

O dovrei considerare una piattaforma intermedia di integrazione diversa da IFTTT?

Deve solo essere ospitato su un server in grado di accettare la richiesta da IFTTT e in grado di comunicare con la tua istanza Discourse tramite le funzioni curl. Inizia semplicemente lo stesso tipo di richiesta che farebbe l’interfaccia web di Discourse. :slight_smile:

1 Mi Piace

Grazie. Sembra che abbia accesso a Zapier, che ha integrazioni migliori.