Programando bots para o Mastodon: obtendo dados via API

O Mastodon tem uma API rica e fácil de operar, e desenvolver clientes ou robôs para interagir com ela está ao seu alcance em várias linguagens.

Desenvolver interfaces ou clientes para o Mastodon tem uma escala de complexidade a ser vencida, como em tudo na vida, mas não há razão para começar já tentando operações difíceis, autenticadas e envolvendo múltiplas instâncias: o ideal é começar com operações simples, envolvendo apenas um endpoint de API por vez, e com acesso a dados públicos, até pegar o jeito e alçar voos mais altos.

O artigo de hoje é introdutório a esse tipo de aplicação para quem já programa e está familiarizado com APIs web. Usaremos um script shell para listar as hashtags em destaque na lista de Trending de uma instância, como as deste exemplo - mas obtendo-as via endpoint da API, e não via scraping da interface web do Mastodon.

A API do Mastodon é bem documentada, e desde já recomendo os capítulos "Getting Started with the API", "Playing with public data" e "trends API methods" para entendimento aprofundado do que apresentarei com bem menos detalhes a seguir.

Para rodar os exemplos abaixo, você precisa ter uma shell Bash ou compatível, com o curl e o gron (para facilitar o consumo das respostas em formato JSON) instalados em um sistema compatível com o Posix (como a maior parte das distribuições Linux, o Mac e Unix em geral).

API do Mastodon: consultando e recebendo a resposta

Em primeiro lugar, perceba que a API do Mastodon é acessada pela web, enviando consultas ou comandos (eventualmente com detalhamento – por exemplo, via campos de formulário ou parâmetros da URL de acesso), e recebendo respostas em formato JSON.

Para o nosso exemplo de hoje, usaremos o endpoint "View trending tags" da API do Mastodon, que pode ser acessado – em instâncias abertas – por meio de uma URL como esta: https://social.br-linux.org/api/v1/trends/tags

Acesse a URL acima em um navegador, e você terá como resposta uma longa linha de texto, em formato JSON, listando as hashtags que aquela instância visualiza como estando em destaque naquele momento, e para cada uma delas expondo alguns atributos, como o número de contas que a mencionou, e quantas vezes ela foi mencionada, entre outros.

Trabalhando com a resposta da API

Ao fazer o acesso acima no navegador, você já usou a API da mesma forma que outros recursos mais avançados fariam, porém recebeu a resposta em um formato inconveniente para operar - ao contrário do que aconteceria quando acessamos por meio de bibliotecas mais avançadas, como a Mastodon.py e várias outras bibliotecas Mastodon para várias linguagens.

Vamos conhecer e destrinchar a resposta da API de trending tags, item por item.

Hoje não veremos o uso dessas bibliotecas, mas sim destrincharemos a resposta da API nesse endpoint - escolhido como exemplo por ser simples – para fixar melhor o funcionamento.

Em primeiro lugar, acesse o endpoint a partir da shell, usando os já mencionados curl e gron, para ver uma versão formatada da resposta da API. Para isso, digite:

curl -s "https://social.br-linux.org/api/v1/trends/tags" | gron

Observe que a resposta traz uma série de tags, e para cada uma delas são apresentadas as estatísticas diárias, como no trecho do exemplo:

(...)
json[7].history[0] = {};
json[7].history[0].accounts = "22";
json[7].history[0].day = "1720483200";
json[7].history[0].uses = "29";
(...)
json[7].name = "introductions";
json[7].url = "https://social.br-linux.org/tags/introductions";
(...)

Veja que destaquei duas linhas, por serem justamente as que nos interessam para esse exemplo: a visão da instância sobre o número de contas diferentes que usaram a tag hoje (history[0].accounts) e o nome da tag (name).

A partir dessa percepção, e com uso de expressões regulares para selecionar linhas como as duas destacadas acima, chegamos ao script a seguir:

#!/usr/bin/env bash
#
# bot_exemplo.sh - exibe as hashtags em destaque em uma instância do Mastodon
#
# Copyright (c) 2024,  Augusto Campos (http://augustocampos.net/).
# Licensed under the Apache License, Version 2.0.
#

instancia="https://social.br-linux.org"

curl -s "$instancia/api/v1/trends/tags" | gron | awk '

/0].accounts/ { gsub(/(.* = |[";])/,""); contas=$0 }
/\.name/      { gsub(/.* = |[";]/,""); print contas, $0 }

' | sort -nr 

Ele faz a consulta à API (curl e gron), filtra com o awk as linhas como as destacadas acima, extraindo delas só os valores (removendo as aspas, os ponto-e-vírgulas e tudo o que vem antes do sinal de igual), e ao final classifica (sort) as tags em ordem das que foram mencionadas por mais contas.

Executá-lo hoje gerou a saída a seguir:

Note que no formato atual, esse script seria mais adequadamente descrito como um cliente do que como um bot. Mesmo assim, a funcionalidade dele é parte integrante do bot que gera os dados para a curadoria do perfil @TrendsBR, e possivelmente outras peças desse mesmo bot (ou de outros que mantenho) voltarão a ilustrar artigos futuros aprofundando os conceitos que hoje começamos a ver.