Conceda uma insígnia personalizada através da 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 curtidas

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 curtidas

Veja também Create a custom badge with an image through the API, que mostra como fazer upload e também tem outro exemplo de concessão do distintivo (em python).

1 curtida

Qual é o motivo pelo qual este método não é descrito na documentação da API em https://docs.discourse.org/?

Não consegui encontrar isso lá.

2 curtidas

Porque não parece ser o trabalho de ninguém manter esses docs completos ou atualizados e alguma alma gentil postou estas instruções aqui. Geralmente, a documentação para a API é Engenharia reversa da API do Discourse e olhando o código fonte.

7 curtidas

Legal, então não há como automatizar a concessão de um distintivo via API?

Por exemplo, alguém que recebe 5.000 curtidas em suas respostas ganha um distintivo.

1 curtida

Se você estiver auto-hospedado ou no Enterprise, você vai querer Habilitar SQL de Distintivos.

2 curtidas

Se você não puder ativar o SQL de distintivos, seria tecnicamente possível automatizar isso, mas seria um processo de duas etapas. Primeiro, faça uma solicitação de API para executar uma consulta do Data Explorer que retorne os nomes de usuário dos usuários que atendem aos seus critérios e que ainda não receberam o distintivo: Executar consultas do Data Explorer com a API do Discourse. Em seguida, use os nomes de usuário retornados por essa consulta para conceder o distintivo por meio da API.

No entanto, isso parece meio ineficiente. Pelo que posso dizer, não há uma rota que possa ser usada para conceder um distintivo a vários usuários com uma única chamada de API, portanto, dependendo de quantos usuários se qualificam para o distintivo, você pode acabar fazendo muitas solicitações de API.

Em última análise, isso parece o tipo de coisa que poderia ser tratada pelo plugin de Automação. Poderia haver um gatilho recorrente que execute uma consulta do Data Explorer com um determinado ID de consulta. Com base nos campos retornados pela consulta, os resultados poderiam ser usados para acionar vários scripts. Por exemplo, se um campo username fosse retornado pela consulta, ele poderia ser usado para executar scripts que concederiam distintivos, adicionariam usuários a grupos, etc.

2 curtidas

Isso não terá os mesmos problemas que fizeram o SQL do distintivo ser desabilitado em primeiro lugar?

1 curtida

Não acho. As consultas do Explorador de Dados são executadas em um bloco de transação que expira após 10 segundos. Acho que o objetivo disso é evitar o tipo de problema que as consultas de selos podem acionar. Se as coisas não estivessem configuradas dessa forma, uma consulta ineficiente do Explorador de Dados poderia travar o site.

Pensando nisso agora, me pergunto se o SQL de selos personalizado poderia ter o mesmo tipo de salvaguarda.

4 curtidas