Grant a custom badge through the 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 (or name) of the badge you wish to grant. You also need to make sure you have generated an API key from your site’s Admin > API > Keys section (/admin/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=yourapikey

Then to grant a badge with the ID of 102 to the user 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"

Instead of badge_id, you can also use badge_name to identify the badge by its name:

-F "badge_name=My Custom Badge"

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.

27 лайков

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 лайка

См. также Create a custom badge with an image through the API, где показано, как загрузить изображение, а также приведён ещё один пример выдачи значка (на Python).

1 лайк

Почему этот метод не описан в документации API по адресу https://docs.discourse.org/?

Я не смог найти его там.

2 лайка

Потому что, похоже, никто не отвечает за то, чтобы эта документация была полной и актуальной, а кто-то добрый человек разместил эти инструкции здесь. В целом, документация по API представляет собой реверс-инжиниринг API Discourse и изучение исходного кода.

7 лайков

Отлично, значит, нет способа автоматизировать выдачу таких бейджей через API?

Например, пользователь, получивший 5000 лайков на своих ответах, автоматически получает бейдж.

1 лайк

Если вы используете самохостинг или версию Enterprise, вам нужно включить SQL для значков.

2 лайка

Если вы не можете включить SQL для значков, технически возможно автоматизировать этот процесс, но он будет состоять из двух шагов. Сначала отправьте запрос к API для выполнения запроса Data Explorer, который вернёт имена пользователей, соответствующих вашим критериям и ещё не получивших значок: Запуск запросов Data Explorer через API Discourse. Затем используйте имена пользователей, возвращённые этим запросом, чтобы присвоить значок через API.

Однако это кажется неэффективным. Насколько я понимаю, не существует маршрута, позволяющего присвоить значок нескольким пользователям одним вызовом API. Поэтому, в зависимости от количества пользователей, соответствующих критериям, вам может потребоваться выполнить множество запросов к API.

В конечном счёте, это похоже на задачу, которую можно решить с помощью плагина Automation. Можно настроить периодический триггер, который будет запускать запрос Data Explorer с указанным идентификатором запроса. На основе полей, возвращаемых запросом, результаты могут использоваться для запуска различных скриптов. Например, если запрос возвращает поле username, его можно использовать для запуска скриптов, присваивающих значки, добавляющих пользователей в группы и так далее.

2 лайка

Разве это не приведёт к тем же проблемам, из-за которых в первую очередь был отключен SQL-запрос для бейджей?

1 лайк

Я так не думаю. Запросы в Data Explorer выполняются в блоке транзакции, который истекает через 10 секунд. Думаю, цель этого — избежать проблем, которые могут вызывать запросы на получение значков. Если бы система была настроена иначе, неэффективный запрос в Data Explorer мог бы привести к падению сайта.

Размышляя об этом сейчас, я задаюсь вопросом, можно ли внедрить аналогичные меры безопасности для пользовательских SQL-запросов значков.

4 лайка