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.

Minha receita de almoço gostoso e prático

🍳 Minha receita infalível de almoço gostoso e prático, pro #almocodedomingo de hoje, é na airfryer.

Deixa pré-aquecendo enquanto pega e tempera os ingredientes, aí reúne:
- legumes picados (temperados com shoyo, manteiga ou azeite)
- um bife (com sal e pimenta do reino)
- um punhado de batatas fritas congeladas.

Coloca tudo junto, conta 7 minutos, aí desliga a airfryer sem abrir e aguarda mais 2 minutos.

🍽️ Só servir!

Se usar uma marmitinha de papel alumínio fica ainda mais fácil limpar! (mas menos sustentável)

Trocando o Spotify por um pen drive

Uma coisa legal que eu fiz nesta semana foi pegar um pen drive antigo (4GB) que estava largado pela casa, formatar, colocar nele músicas que eu já tinha, e levar pro carro – pra voltar a ouvir música nos deslocamentos, mas agora sem depender de conexão e streaming.

O pen drive é igual ao da foto, tem vários anos de estrada, e minha ideia é usá-lo pra voltar a ouvir os álbuns completos e na ordem.

Comecei com 2 coletâneas (Madonna e The Clash), e agora para a segunda semana abri uma enquete com 4 candidatos no Mastodon para ver quais seriam os próximos 2 álbuns a serem ouvidos, e o vencedor (por larga margem) foi “The Offspring - Greatest Hits” – mas também já vou carregar o segundo colocado, que foi “Paramore - Riot!”.

Aliás, você sabia da pesquisa por "vtwin88cube" em sites de torrents?

Ela pode ser mais rápida do que ripar os CDs físicos originais que você já tem na sua coleção, porque retorna literalmente centenas de torrents repletos de seeds, com coletâneas e discografias, principalmente de artistas que já estiveram na parada de rock dos EUA.

Leia também o post anterior: Reduzindo em 78% o gasto mensal com assinaturas de serviços on-line, edição 2024.

Os punks de boutique, cantados pelo The Clash

Uma coisa que eu acho super simbólica é que já no comecinho da carreira (e antes da explosão do seu sucesso nos EUA e internacional) o The Clash já tinha perdido completamente a ilusão de efetividade da imagem de rebelião trazida pela crescente cena punk:

Punk rockers in the UK
They won't notice anyway
They're all too busy fighting
For a good place under the lighting

The new groups are not concerned
With what there is to be learned
They got Burton suits, ha you think it's funny
Turning rebellion into money

O explícito verso que diz que as novas bandas não estão nem aí e só querem transformar rebeldia em dinheiro veio já em 1978, na letra do single “White man in Hammersmith Palais”.

13ft, o sucessor do 12ft para pular paywalls de sites

Se você usava o 12ft pra inspecionar o conteúdo de sites com paywall antes de decidir se valia a pena pagar, e sofreu quando ele parou de funcionar direito, o 13ft é uma alternativa que tem funcionado bem nos meus testes.

Ele se apresenta como o robô de indexação do Google, e aí os sites exibem o conteúdo completo, que ele redireciona para o seu navegador transparentemente.

É open source e fácil de instalar no Mac, Windows e Linux, mas se você preferir (ou não dominar o empacotamento de blambers em flearows), pode acessar em algum site público, como o Killwall.

As pessoas desapareciam - pra sempre!

Uma coisa que as pessoas da minha geração esquecem, e que as gerações atuais não conseguem visualizar, é que até a metade dos anos 90 os seus amigões eram praticamente um subconjunto dos colegas de aula, vizinhos, familiares, e dos colegas e vizinhos deles.

E quando algum amigão (colega de escola ou vizinho) mudava de cidade, ele sumia da sua vida pra sempre, de uma vez só, e imediatamente. Era raro se mudar sabendo qual seria seu novo telefone, que demorava semanas ou meses (com sorte!) pra ser instalado, e escrever cartas pessoais já tinha saído de moda lá pelos anos 50.

Isso está entre as coisas que a internet revolucionou: agora é possível ter amigos e contatos com continuidade geográfica.

E sim, estou falando sobre a experiência de amizades de crianças e adolescentes, mas a de adultos não era muito diferente.

“Self hosted em casa” é bom pra quem já tem e pra quem curte, mas não é um caminho suave

Mais uma vez lembrando que se você ainda não tem um servidor rodando estavelmente na sua casa, a afirmação "vou instalar um servidor na minha casa pra resolver minha demanda X" raramente é uma boa solução para essa demanda X.

Além disso:

🫰🏻 Tende a não ser uma solução econômica

📆 Tende a não ser uma solução duradoura, e

⏱️ Tende a não ser uma solução rápida.

As afirmações acima nem sempre se aplicam a quem já tem um servidor estável rodando em casa, entretanto. Nem a quem tem dois projetos separados e independentes: “implantar um servidor em casa” e “resolver minha demanda X”.

A indecisão idiomática nos naipes dos baralhos no Brasil

Uma coisa interessante dos baralhos comuns do Brasil é que a gente usa os naipes franceses mas chama eles pelos nomes dos naipes espanhóis/portugueses.

Foi assim que o naipe dos corações vermelhos ♥️ ganhou por aqui o nome de "copas" - nos baralhos espanhóis, esse naipe é representado por taças (copas, literalmente - como a "copa do mundo").

Da mesma forma, o naipe dos losangos, que representam diamantes ♦️ no baralho francês, virou "ouros" aqui, porque no baralho espanhol são moedas de ouro.

Como um poeta e um vulcão se uniram para inspirar Frankenstein

Há exatos 208 anos, em junho de 1816, o poeta inglês Lord Byron tinha convidados em sua casa de veraneio na Suiça.

O tempo estava ruim para veranear: o ano de 1816 ficou conhecido mundialmente como “o ano sem verão”, devido às anomalias climáticas causadas pelas cinzas da violenta erupção do vulcão Tambora, na Indonésia, no ano anterior.

A ausência do costumeiro tempo ensolarado prejudicou os planos normais da temporada, e Byron aproveitou o clima sombrio para ler com os convidados trechos assustadores da obra Fantasmagoriana, o que acabou o levando a desafiar todos eles a escreverem suas próprias histórias de terror.

Mary Shelley, que veraneava numa casa próxima, era uma das convidadas de Byron, e ali nasceu ideia de Frankenstein, que ela publicou 2 anos depois.

Melhorando as segundas-feiras com um ajuste simples no Todoist

Uma configuração simples que eu fiz no Todoist e que me traz algum ganho de paz é que quando eu uso o botão de reagendar pra semana seguinte, ele reagenda pra terça, e não pra segunda.

Já temos coisas demais nas segundas, não precisamos aumentar a lista com as que procrastinamos na semana passada.