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

Mi chiedo se questa opzione non sia più gratuita e disponibile solo come premium per gli sviluppatori?

1 Mi Piace

In base alla documentazione dell’API Discourse, Api_username e Api_key devono essere inviati negli header della richiesta HTTP. Inviarli come parametri GET non funziona.

Ho provato e ho fallito. Di conseguenza, non sono stato in grado di utilizzare IFTTT come indicato qui…

Tuttavia, alla fine ho scritto un semplice script PHP personalizzato che funge da relay hook, permettendo l’invio dei dati a Discourse con la configurazione corretta.

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

// Assicurati che sia una richiesta POST.
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Il metodo della richiesta deve essere POST!'));
}

// Assicurati che il tipo di contenuto della richiesta POST sia impostato su application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Il tipo di contenuto deve essere: application/json'));
}

// Ricevi i dati RAW della richiesta POST.
$content = trim(file_get_contents("php://input"));

// Prova a decodificare i dati RAW in arrivo da JSON.
$payload = json_decode($content, true);

// Se json_decode fallisce, il JSON non è valido.
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Il contenuto ricevuto contiene un JSON non valido!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'L'endpoint di Discourse deve essere fornito nel corpo JSON!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'La chiave API di Discourse deve essere fornita nel corpo JSON!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'L'utente API di Discourse deve essere fornito nel corpo 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;
?>

Puoi leggere di più qui: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC 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.