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

¿Se puede usar este flujo de trabajo para crear automáticamente una cuenta para un nuevo usuario y agregarlo a un grupo específico de Discourse?

El caso de uso aquí es que alguien compra un producto de capacitación; quiero agregarlo automáticamente al subforo relevante de Discourse para ese producto.

Puedo obtener los datos del nuevo cliente en Zapier, pero el zap regular de Discourse no tiene capacidades para crear cuentas. Solo me pregunto si puedo hacer esto a través de la API y el enlace de webhook como describes en este ejemplo.

¡Gracias!

2 Me gusta

El enfoque más sencillo sería enviar un correo de invitación a la persona después de que realice la compra. Puedes configurar la invitación para que el usuario se añada automáticamente a un grupo de Discourse cuando acepte la invitación. Consulta Automate sending Discourse invite emails with Zapier para obtener más detalles.

Si enviar invitaciones no es una opción para ti, debería ser posible utilizar un webhook de Zapier para crear un usuario en Discourse. La documentación en Discourse API Docs proporciona detalles sobre la solicitud para crear un usuario.

8 Me gusta

Gracias @simon, probaré la invitación por correo electrónico. Sin duda, algunas personas no la recibirán/la encontrarán/la abrirán, pero es definitivamente la opción más sencilla.

¡También agradezco la rápida respuesta!

A menudo es más fácil que quien vende el producto realice directamente las llamadas a la API de Discourse.

1 me gusta

¿Hay alguna razón por la cual esto funciona para mí cuando lo hago en Zapier, pero obtengo una respuesta vacía cuando intento hacer mi propia solicitud fetch?

Estoy usando ObservableHQ, pero la idea es la misma. ¿No debería funcionar esto?:

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"
})

¿Puedes hacer que cualquier solicitud a la API de Discourse funcione con llamadas en ese formato desde ObservableHQ? Parece que debe haber algo incorrecto en el formato de la solicitud.

También puedes verificar las solicitudes realizando llamadas con curl desde tu terminal o utilizando Postman.

1 me gusta

¡Vale, ya he descubierto lo que tenía que hacer:

  1. Instalar cors-anywhere localmente y ejecutar el servidor.
  2. Modificar la solicitud para incluir el proxy inverso antes del punto final de la API y llamar al método json en el objeto Fetch Response:
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