Asigna una insignia personalizada a través de la API

Las insignias personalizadas que hayas creado en tu foro se pueden otorgar a través de la API. Esta es una excelente manera de conceder insignias sin necesidad de usar SQL personalizado para insignias.

Para otorgar una insignia mediante la API, necesitas conocer el nombre de usuario del usuario al que deseas otorgarla, así como el ID (o el nombre) de la insignia que deseas conceder. También debes asegurarte de haber generado una clave API en la sección Admin > API > Keys de tu sitio (/admin/api/keys).

Encontrar el ID de la insignia

Puedes obtener el ID de la insignia desde la URL de la misma. Ve a la sección Admin/Insignias y haz clic en la insignia que deseas otorgar. La URL se verá algo así: https://forum.example.com/admin/badges/102. El último número en la URL es el ID de la insignia.

Realizar la llamada a la API

Para probar una llamada a la API, puedes intentar otorgar una insignia usando curl o Postman. Así es como otorgo una insignia desde la terminal de mi computadora con curl.

Primero, para facilitar las cosas, establece una variable api_key:

api_key=tu_api_key

Luego, para otorgar una insignia con el ID 102 al usuario bobby:

curl -X POST "https://forum.example.com/user_badges" \
-H "Api-Key: $api_key" \
-H "Api-Username: system" \
-F "username=bobby" \
-F "badge_id=102" \
-F "reason=https://forum.example.com/t/whats-the-best-photo-youve-ever-taken/160/2"

En lugar de badge_id, también puedes usar badge_name para identificar la insignia por su nombre:

-F "badge_name=Mi Insignia Personalizada"

El parámetro reason es opcional. Si lo proporcionas, debe establecerse en la URL de un tema o de una publicación en tu sitio.

Deberías recibir una respuesta JSON con detalles sobre la insignia y cuándo se otorgó.

27 Me gusta

Has anybody added a badge (or flair) via Zapier to Discourse API like outlined here?

Also, seems like a great candidate for an action via the official integration, @HAWK.

3 Me gusta

Ver también Create a custom badge with an image through the API, que muestra cómo subir y también tiene otro ejemplo de cómo otorgar la insignia (en python).

1 me gusta

¿Cuál es la razón por la que este método no se describe en la documentación de la API en https://docs.discourse.org/?

No pude encontrar esto allí.

2 Me gusta

Porque no parece ser trabajo de nadie mantener esa documentación completa o actualizada y algún alma caritativa publicó estas instrucciones aquí. Generalmente, la documentación de la API es Ingeniería inversa de la API de Discourse y mirar el código fuente.

7 Me gusta

Genial, ¿entonces no hay forma de automatizar la concesión de insignias a través de la API?

Por ejemplo, a alguien que recibe 5.000 me gusta en sus respuestas se le otorga una insignia.

1 me gusta

Si está autoalojado o en Enterprise, querrá Habilitar SQL de insignias.

2 Me gusta

Si no puedes habilitar la insignia SQL, sería técnicamente posible automatizar esto, pero sería un proceso de dos pasos. Primero, haz una solicitud a la API para ejecutar una consulta del Explorador de Datos que devuelva los nombres de usuario de los usuarios que cumplen tus criterios y que aún no han recibido la insignia: Ejecuta consultas del Explorador de Datos con la API de Discourse. Luego, usa los nombres de usuario devueltos por esa consulta para otorgar la insignia a través de la API.

Sin embargo, esto parece un poco ineficiente. Por lo que puedo decir, no hay una ruta que se pueda usar para otorgar una insignia a varios usuarios con una sola llamada a la API, por lo que dependiendo de cuántos usuarios califiquen para la insignia, podrías terminar haciendo muchas solicitudes a la API.

En última instancia, esto parece el tipo de cosa que podría ser manejada por el plugin de Automatización. Podría haber un disparador recurrente que ejecute una consulta del Explorador de Datos con un ID de consulta dado. Basándose en los campos devueltos por la consulta, los resultados podrían usarse para disparar varios scripts. Por ejemplo, si se devolviera un campo username por la consulta, podría usarse para ejecutar scripts que otorgaran insignias, añadieran usuarios a grupos, etc.

2 Me gusta

¿No tendrá los mismos problemas que provocaron la deshabilitación del SQL de la insignia en primer lugar?

1 me gusta

No lo creo. Las consultas de Data Explorer se ejecutan en un bloque de transacciones que expira después de 10 segundos. Creo que el propósito de eso es evitar el tipo de problema que pueden desencadenar las consultas de insignias. Si las cosas no estuvieran configuradas de esa manera, una consulta ineficiente de Data Explorer podría bloquear el sitio.

Pensando en eso ahora, me pregunto si el SQL de insignias personalizadas podría tener el mismo tipo de salvaguarda.

4 Me gusta