Genera nuovi argomenti, post e PM tramite IFTTT

Vuoi utilizzare IFTTT per creare nuovi argomenti, post e messaggi personali? 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 creare le chiavi API dal pannello di amministrazione all’indirizzo /admin/api/keys.

Inoltre, è possibile generare chiavi API specifiche per 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.

Quindi scelgo il trigger Ogni nuovo evento aggiunto.

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

Ora compila i campi dell’azione come mostrato 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: [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 Maker Webhooks 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": "{{CreatedAt}}"
}

Nel testo del corpo puoi vedere molti campi con doppie parentesi graffe {{ }}. Questi campi (sorgenti di contenuto) varieranno a seconda dei trigger di ogni servizio. Scegli il campo desiderato cliccando sul pulsante Ingrediente sottostante.

Puoi modificare i campi title e raw nel corpo JSON in base alle tue esigenze, 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 creare l’applet. Dopo la creazione dell’applet, potrebbe volerci del tempo prima che diventi attivo.

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


Per creare una risposta a un argomento esistente invece di crearne uno nuovo, il testo del corpo deve essere modificato come segue (usa topic_id al posto di category)

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

Per creare un nuovo messaggio personale

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

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.