Effettua richieste all'API Discourse con Zapier

Le richieste all’API di Discourse possono essere automatizzate creando uno Zap che utilizza un Webhook di Zapier come passaggio di azione. Questo argomento descrive come eseguire richieste per le seguenti azioni:

  • aggiungere un utente a un gruppo
  • assegnare un badge personalizzato

Per capire come eseguire altri tipi di richieste API con Zapier, leggi questo argomento e poi cerca nella documentazione dell’API di Discourse l’azione che desideri eseguire. Puoi anche scoprire come creare una richiesta API per un’azione specifica leggendo Reverse engineer the Discourse API.

Configurare il passaggio di attivazione (trigger)

Ogni Zap deve avere un passaggio di attivazione (trigger) e un passaggio di azione. Il trigger viene utilizzato per trasferire dati da un’applicazione al passaggio di azione dello Zap. In alcuni casi, il trigger può anche essere utilizzato per impedire allo Zap di completare il passaggio di azione a meno che i dati non soddisfino determinate condizioni.

Per configurare il passaggio di azione, vai alla tua Dashboard di Zapier e clicca sul pulsante “Crea uno Zap”. Si aprirà un modulo di ricerca che ti chiederà di scegliere un’app di attivazione.

Per gli esempi in questo argomento, sto utilizzando l’evento “Nuovo utente” di WordPress come passaggio di attivazione. Questo perché è facile da configurare per testare le chiamate API.

Il nodo “Testa questo passaggio” del tuo passaggio di attivazione ti consente di selezionare un campione di dati dalla tua applicazione di attivazione che verrà trasferito al passaggio di azione dello Zap. Questi dati saranno utili per configurare il passaggio di azione.

Aggiungere un passaggio opzionale per recuperare i dettagli da Discourse

A seconda dei dati trasferiti dalla tua app di attivazione, potresti aver bisogno di recuperare alcuni dati da Discourse prima di effettuare la richiesta API finale. Ad esempio, il trigger “Nuovo utente” di WordPress trasferisce il nome utente WordPress e l’indirizzo email dell’utente. So che l’indirizzo email corrisponderà all’email dell’utente su Discourse, ma per le richieste API in questo esempio, ho bisogno di conoscere il nome utente Discourse dell’utente.

Per ottenere i dettagli di un utente su Discourse dal suo indirizzo email, aggiungi un passaggio di azione al tuo Zap. Seleziona “GET” dal menu delle azioni del webhook.

Nel passaggio di modifica del modello del webhook, inserisci l’URL di base del tuo sito Discourse, seguito da /admin/users/list/all.json nella sezione URL. Ad esempio, l’URL di base del mio sito è https://demo.scossar.com, quindi inserisco https://demo.scossar.com/admin/users/list/all.json nel campo URL.

Nella sezione Parametri della stringa di query, inserisci “email” come Chiave e quindi clicca sull’icona “Inserisci un campo” per aprire il menu a discesa. Seleziona il valore trasferito dal tuo passaggio di attivazione che contiene l’indirizzo email dell’utente.

Autenticare la richiesta

Scorri verso il basso nel modulo fino alla sezione Intestazioni (Headers). Questa sezione viene utilizzata per autenticare la richiesta. Richiede tre coppie chiave/valore:

  • Api-Username: il nome utente di un amministratore sul tuo sito. Nella maggior parte dei casi, l’utente ‘system’ sarà una buona scelta.
  • Api-Key: la chiave API associata al nome utente utilizzato nella prima coppia chiave/valore
  • Content-Type: multipart/form-data

La sezione Intestazioni completata dovrebbe assomigliare a questa, ma con la tua chiave API:

Clicca sul pulsante Continua per visualizzare i dati recuperati da Discourse per questa richiesta.

Aggiungere il passaggio di azione finale

Una volta configurati il trigger e il passaggio opzionale per recuperare i dati da Discourse, clicca sul link “Aggiungi un passaggio” e seleziona “Webhooks by Zapier” dal menu delle azioni. Ti verrà quindi chiesto di scegliere quale metodo di richiesta utilizzare nella tua richiesta API a Discourse.

Ecco i tipi di richiesta necessari per gli esempi utilizzati in questo argomento:

  • aggiungere un utente a un gruppo: PUT
  • assegnare un badge personalizzato: POST

Per configurare richieste API diverse dagli esempi di questo argomento, consulta la documentazione dell’API di Discourse per vedere se esiste un esempio della richiesta che desideri effettuare. Se non trovi un esempio lì, leggi Come fare reverse engineering dell’API di Discourse per imparare a trovare l’URL e il metodo di richiesta per l’azione che desideri eseguire. Una volta trovato il metodo di richiesta, selezionalo dal menu delle azioni.

Nota: se la tua richiesta utilizza il metodo DELETE, seleziona “Richiesta personalizzata” dal menu delle azioni.

Configurare il passaggio di azione finale

La sezione Intestazioni dell’azione può essere configurata nello stesso modo per tutte le richieste API. Consulta la sezione ‘Autenticare la richiesta’ di questo argomento per i dettagli. Se hai aggiunto il passaggio opzionale per recuperare i dettagli da Discourse, puoi configurare la sezione Intestazioni dell’azione finale esattamente nello stesso modo in cui hai fatto per quel passaggio.

Una volta aggiunte le coppie chiave/valore delle intestazioni, dovrai compilare i campi URL e Dati del modulo per la tua richiesta API.

Aggiungere un utente a un gruppo

Per aggiungere un utente a un gruppo, viene effettuata una richiesta PUT a /groups/<group_id>/members.json. Il modo più semplice per trovare l’ID di un gruppo è visitare la pagina del gruppo tramite l’interfaccia utente di Discourse e quindi inserire .json nell’URL nella barra degli indirizzi del browser. Ad esempio, il mio sito ha un gruppo “supporto” all’indirizzo https://demo.scossar.com/g/support. Andando su https://demo.scossar.com/g/support.json posso vedere che l’ID del gruppo è 41. L’URL di base del mio forum è https://demo.scossar.com. L’URL nel mio passaggio di azione finale per aggiungere utenti a un gruppo viene impostato su https://demo.scossar.com/groups/41/members.json.

La richiesta per aggiungere utenti a un gruppo richiede un parametro: un elenco di nomi utente separati da virgole. Nella sezione Dati del modulo, inserisci “usernames” come chiave. Quindi clicca sull’icona “Inserisci un campo” per cercare la proprietà del nome utente che è stata trasferita dal trigger o dal passaggio di azione GET opzionale.

Nel mio caso, voglio il nome utente recuperato dal passaggio GET, quindi espando il menu “GET” e seleziono Username dal menu a discesa.

Tutte le altre sezioni del modulo possono essere lasciate con i valori predefiniti.

Clicca sul pulsante Continua e poi testa il tuo passaggio. Se l’utente che hai trasferito attraverso i passaggi precedenti esiste sul tuo sito Discourse e non è già membro del gruppo selezionato, dovrebbe essere aggiunto al gruppo quando testi il passaggio.

Se tutto funziona come previsto, attiva il tuo Zap.

Assegnare un badge personalizzato

Per assegnare un badge personalizzato a un utente, viene effettuata una richiesta POST all’URL di base del tuo forum + /user_badges. Per il mio sito, l’URL per l’assegnazione dei badge è https://demo.scossar.com/user_badges. Il campo URL completato su Zapier appare così:

La sezione Dati del modulo richiede due coppie chiave/valore. Aggiungi una chiave “username” e impostala sul campo che restituisce il nome utente dell’utente. Aggiungi una chiave “badge_id” e impostala sull’ID del badge che desideri assegnare. Puoi trovare l’ID del badge andando alla pagina Amministratore / Badge e selezionando il badge dal menu a sinistra. Vedrai l’ID del badge come ultimo valore dell’URL nella barra degli indirizzi del browser.

Il badge che sto assegnando ha un ID di 105, quindi la mia sezione Dati completata appare così:

Assicurati di aver configurato la sezione Intestazioni del modulo, quindi clicca su Continua. Quindi clicca sul pulsante Invia test per testare il tuo Zap. L’utente che hai trasferito attraverso i passaggi precedenti dovrebbe ricevere il badge.

Se tutto funziona correttamente, attiva lo Zap.

15 Mi Piace

Can this workflow be used to automatically create an account for a new user and add them to a specific discourse group?

The use case here is someone buys a training product, I want to automatically then add them to the relevant discourse sub forum for that product.

I can get the new customer data into Zapier but the regular discourse zap doesn’t have create account capabilities - just wondering if I can do this via the API and webhook link as you describe in this example.

Thanks!

2 Mi Piace

The easiest approach would be to send an invite email to the person after they make a purchase. You can setup the invite so that the user is automatically added to a Discourse group when they accept the invitation. See Automate sending Discourse invite emails with Zapier for details.

If sending invites is not an option for you, it should be possible to use a Zapier webhook to create a Discourse user. The Discourse API Docs give details about the request to create a user.

8 Mi Piace

Thanks @simon I’ll try the email invite. No doubt some people won’t get it/find it/open it but it’s the easier option for sure.

Appreciate the speedy response too!

It’s often easier to have whatever is selling the thing make the discourse api calls directly.

1 Mi Piace

Is there a reason why this works for me when I do it in Zapier, but I get an empty response when I try to do my own fetch request?

I’m using ObservableHQ, but the idea is the same. Shouldn’t this work?:

fetch("https://mycommunity.com/g.json", {
  headers: {
    "Content-Type": "multipart/form-data",
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
  method: "GET",
  mode: "no-cors"
})

Are you able to get any API requests to Discourse working with calls in that format with ObservableHQ? It seems that there must be something wrong with the format of the request.

You can also double check requests by making curl calls from your terminal, or by using Postman.

1 Mi Piace

OK, I figured out what I needed to do:

  1. Install cors-anywhere locally and run the server
  2. Modify the request to include the reverse proxy before the API endpoint and call the json method in the Fetch Response object:
await (fetch("http://localhost:8080/mycommunity.com/g.json", {
  headers: {
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
})).json()
2 Mi Piace

Just going to leave this here, might be worth checking out:

2 Mi Piace

Hi @simon, thanks for this how to. I’m setting this up in Zapier using but my forum doesn’t have this URL for granting badges.

I’m wondering, is this not a standard URL for all Discourse installs, or has the URL possibly changed in a recent update?

It should have. It is not a URL that can be visited through the Discourse user interface though. I just double checked the route on my site by following the steps outlined here: How to reverse engineer the Discourse API. Based on that, it looks like the details given in the topic are still up to date.

2 Mi Piace

It was, no surprise, my own error.

1 Mi Piace