Haz solicitudes a la API de Discourse con Zapier

Las solicitudes a la API de Discourse pueden automatizarse creando un Zap que utilice un Webhook de Zapier como paso de acción. Este tema describirá cómo realizar solicitudes para las siguientes acciones:

  • agregar un usuario a un grupo
  • otorgar una insignia personalizada

Para averiguar cómo realizar otros tipos de solicitudes de API con Zapier, lea este tema y luego busque en la documentación de la API de Discourse la acción que desea realizar. También puede encontrar cómo crear una solicitud de API para una acción específica leyendo Reverse engineer the Discourse API.

Configurar el paso de activación (trigger)

Cada Zap debe tener un paso de activación y un paso de acción. La activación se utiliza para pasar datos desde una aplicación al paso de acción del Zap. En algunos casos, la activación también puede utilizarse para detener que un Zap complete su paso de acción a menos que sus datos cumplan ciertas condiciones.

Para configurar su paso de acción, vaya a su panel de control de Zapier y haga clic en el botón Crear un Zap (Make a Zap). Se abrirá un formulario de búsqueda que le pedirá que elija una aplicación de activación.

Para los ejemplos en este tema, estoy utilizando el evento Nuevo usuario de WordPress como paso de acción. Esto se debe a que es fácil de configurar para probar las llamadas a la API.

El nodo “Probar este paso” (Test This Step) de su paso de activación le permite seleccionar una muestra de datos de su aplicación de activación que se pasará al paso de acción de su Zap. Estos datos serán útiles para configurar el paso de acción.

Agregar un paso opcional para recuperar detalles de Discourse

Dependiendo de los datos que se pasen desde su aplicación de activación, es posible que necesite recuperar algunos datos de Discourse antes de realizar su solicitud de API final. Por ejemplo, la activación Nuevo usuario de WordPress pasa el nombre de usuario de WordPress y la dirección de correo electrónico del usuario. Sé que la dirección de correo electrónico coincidirá con la del usuario de Discourse, pero para las solicitudes de API en este ejemplo, necesito saber el nombre de usuario de Discourse del usuario.

Para obtener los detalles de un usuario de Discourse a partir de su dirección de correo electrónico, agregue un paso de acción a su Zap. Seleccione “GET” en el menú de acción del webhook.

En el paso de edición de la plantilla del webhook, ingrese la URL base de su sitio de Discourse, seguida de /admin/users/list/all.json en la sección de URL. Por ejemplo, la URL base de mi sitio es https://demo.scossar.com, así que ingreso https://demo.scossar.com/admin/users/list/all.json en el campo de URL.

En la sección Parámetros de la cadena de consulta (Query String Params), ingrese “email” como la clave y luego haga clic en el icono “Insertar un campo” para abrir el menú desplegable. Seleccione el valor que fue pasado por su paso de activación y que contiene la dirección de correo electrónico del usuario.

Autenticar la solicitud

Desplácese hacia abajo en el formulario hasta la sección Encabezados (Headers). Esta sección se utiliza para autenticar la solicitud. Requiere tres pares clave/valor:

  • Api-Username : el nombre de usuario de un administrador en su sitio. En la mayoría de los casos, el usuario ‘system’ será una buena opción para esto.
  • Api-Key : la clave de API asociada con el nombre de usuario que ha utilizado en el primer par clave/valor
  • Content-Type : multipart/form-data

La sección de Encabezados completada debería verse similar a esta, pero con la clave de API de su usuario:

Haga clic en el botón Continuar para ver los datos que se recuperan de Discourse para esta solicitud.

Agregar el paso de acción final

Una vez que su activación y el paso opcional para recuperar datos de Discourse estén configurados, haga clic en el enlace “Agregar un paso” y seleccione “Webhooks by Zapier” en el menú de acción. Luego se le pedirá que elija qué método de solicitud desea utilizar en su solicitud de API a Discourse.

Estos son los tipos de solicitud requeridos para los ejemplos utilizados en este tema:

  • agregar un usuario a un grupo: PUT
  • otorgar una insignia personalizada: POST

Para configurar solicitudes de API diferentes a los ejemplos de este tema, consulte la documentación de la API de Discourse para ver si hay un ejemplo de la solicitud que desea realizar. Si no encuentra un ejemplo allí, lea Cómo ingeniería inversa de la API de Discourse para aprender a encontrar la URL y el método de solicitud para la acción que desea realizar. Una vez que haya encontrado el método de solicitud, selecciónelo en el menú de acción.

Nota: si su solicitud utiliza el método DELETE, seleccione “Solicitud personalizada” (Custom Request) en el menú de acción.

Configurar el paso de acción final

La sección de Encabezados de la acción se puede configurar de la misma manera para todas las solicitudes de API. Consulte la sección ‘Autenticar la solicitud’ de este tema para obtener detalles. Si ha agregado el paso opcional para recuperar detalles de Discourse, puede configurar la sección de Encabezados de la acción final exactamente de la misma manera que lo hizo para ese paso.

Una vez que se hayan agregado los pares clave/valor del encabezado, deberá rellenar los campos URL y Datos del formulario para su solicitud de API.

Agregar un usuario a un grupo

Para agregar un usuario a un grupo, se realiza una solicitud PUT a /groups/<group_id>/members.json. La forma más fácil de encontrar el ID de un grupo es visitar la página del grupo a través de la interfaz de usuario de Discourse y luego ingresar .json en la URL de la barra de direcciones de su navegador. Por ejemplo, mi sitio tiene un grupo “soporte” en https://demo.scossar.com/g/support. Al ir a https://demo.scossar.com/g/support.json puedo ver que el ID del grupo es 41. La URL base de mi foro es https://demo.scossar.com. La URL en mi paso de acción final para agregar usuarios a un grupo se establece en https://demo.scossar.com/groups/41/members.json.

La solicitud para agregar usuarios a un grupo requiere un parámetro: una lista de nombres de usuario separados por comas. En la sección Datos del formulario, ingrese “usernames” como la clave. Luego haga clic en el icono “Insertar un campo” para buscar la propiedad de nombre de usuario que ha sido pasada desde la activación o el paso de acción GET opcional.

En mi caso, quiero el nombre de usuario que fue recuperado por el paso GET, así que extiendo el menú “GET” y selecciono Nombre de usuario (Username) en el menú desplegable.

Todas las demás secciones del formulario pueden dejarse con sus valores predeterminados.

Haga clic en el botón Continuar y luego pruebe su paso. Si el usuario que ha pasado a través de los pasos anteriores existe en su sitio de Discourse y aún no es miembro del grupo que ha seleccionado, debería ser agregado al grupo cuando pruebe el paso.

Si todo funciona como se espera, active su Zap.

Otorgar una insignia personalizada

Para otorgar una insignia personalizada a un usuario, se realiza una solicitud POST a la URL base de su foro + /user_badges. Para mi sitio, la URL para otorgar insignias es https://demo.scossar.com/user_badges. El campo de URL completado en Zapier se ve así:

La sección Datos del formulario requiere dos pares clave/valor. Agregue una clave “username” y configúrela en el campo que devuelve el nombre de usuario del usuario. Agregue una clave “badge_id” y configúrela en el ID de la insignia que desea otorgar. Puede encontrar el ID de la insignia yendo a su página Admin / Insignias y seleccionando la insignia en el menú lateral izquierdo. Verá el ID de la insignia como el último valor de la URL en la barra de direcciones de su navegador.

La insignia que estoy otorgando tiene un ID de 105, así que mi sección de Datos completada se ve así:

Asegúrese de haber configurado la sección de Encabezados del formulario, luego haga clic en Continuar. Luego haga clic en el botón Enviar prueba (Send Test) para probar su Zap. El usuario que ha pasado a través de los pasos anteriores debería recibir la insignia.

Si todo funciona correctamente, active el Zap.

15 Me gusta

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 Me gusta

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 Me gusta

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 me gusta

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 me gusta

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 Me gusta

Solo voy a dejar esto aquí, podría valer la pena echarle un vistazo:

2 Me gusta

Hola @simon, gracias por esta guía. Estoy configurando esto en Zapier, pero mi foro no tiene esta URL para otorgar insignias.

Me pregunto, ¿no es esta una URL estándar para todas las instalaciones de Discourse, o es posible que la URL haya cambiado en una actualización reciente?

Debería tenerla. Sin embargo, no es una URL a la que se pueda acceder a través de la interfaz de usuario de Discourse. Acabo de verificar la ruta en mi sitio siguiendo los pasos descritos aquí: Cómo hacer ingeniería inversa de la API de Discourse. Según eso, parece que los detalles proporcionados en el tema siguen vigentes.

2 Me gusta

No fue ninguna sorpresa, fue mi propio error.

1 me gusta