Otorga una insignia personalizada a través de la API

Custom badges that you have created on your forum can be granted through the API. This is a great way to award badges without having to use custom badge SQL.

To grant a badge through the API, you need to know the username of the user that you wish to grant the badge to, and the ID of the badge you wish to grant. You also need to make sure you have generated an All Users API Key from your site’s Admin/API section.

Finding your API Key

This screenshot is from my local development site. Generally, you need to be very careful about sharing your API keys:

Finding the Badge ID

You can get the Badge ID from the badge’s URL. Go to your Admin/Badges section and then click on the badge that you wish to grant. The URL will look something like this: https://forum.example.com/admin/badges/102. The last number in the URL is the badge ID.

Making the API call

To test an API call, you can try granting a badge using curl or Postman. Here is how I grant a badge from my computer’s terminal with curl.

First, to make things easier, set an api_key variable:

 api_key=yourallusersapikey

Then to grant a badge with the ID of 102 to the user bobby:

curl -X POST "https://forum.example.com/user_badges" \
-H "Content-Type: multipart/form-data;" \
-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"

The reason parameter is optional. If you supply it, it must be set to the URL of a topic or a post on your site.

You should get a JSON response with details about the badge and when it was granted.

26 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