Automatize as interações do Mastodon com Python
Acompanhe enquanto eu brinco com a API do Mastodon para criar um novo aplicativo.
A rede social federada Mastodon tornou-se muito popular ultimamente. É divertido postar nas redes sociais, mas também é divertido automatizar suas interações. Há alguma documentação da API voltada para o cliente, mas é um pouco leve nos exemplos. Este artigo pretende ajudar com isso.
Você deve estar bastante confiante com Python antes de tentar prosseguir com este artigo. Se você ainda não se sente confortável com Python, confira o artigo Introdução ao Python de Seth Kenlon e meu artigo Programar um jogo simples.
Crie um aplicativo
O primeiro passo é ir em Preferências no Mastodon e selecionar a categoria Desenvolvimento. No painel Desenvolvimento, clique no botão Novos Aplicativos.
Após criar um aplicativo, copie o token de acesso. Tenha cuidado com isso. Esta é a sua autorização para postar em sua conta Mastodon.
Existem alguns módulos Python que podem ajudar.
- O módulo httpx é útil, visto que é uma API web.
- O módulo
getpass
permite colar o token na sessão com segurança. - O Mastodon usa HTML como conteúdo de postagem, portanto, uma boa maneira de exibir HTML embutido é útil.
- A comunicação tem tudo a ver com tempo, e os módulos
dateutil
ezoneinfo
ajudarão a lidar com isso.
Esta é a aparência da minha lista de importação típica:
import httpx
import getpass
from IPython.core import display
from dateutil import parser
import zoneinfo
Cole o token na entrada getpass
:
token=getpass.getpass()
Crie o httpx.Client
:
client = httpx.Client(headers=dict(Authorization=f"Bearer {token}"))
O método verify_credentials existe para verificar se o token funciona. É um bom teste e fornece metadados úteis sobre sua conta:
res = client.get("https://mastodon.social/api/v1/accounts/verify_credentials")
Você pode consultar sua identidade do Mastodon:
res.raise_for_status()
result = res.json()
result["id"], result["username"]
>>> ('27639', 'moshez')
Sua milhagem pode variar, mas você receberá seu ID interno e nome de usuário em resposta. O ID pode ser útil mais tarde.
Por enquanto, abstraia o raise_for_status e analise a saída JSON:
def parse(result):
result.raise_for_status()
return result.json()
Veja como isso pode ser útil. Agora você pode verificar os dados da sua conta por ID. Esta é uma ótima maneira de verificar a consistência:
result = parse(client.get("https://mastodon.social/api/v1/accounts/27639"))
result["username"]
>>> 'moshez'
Mas o interessante, claro, é saber a sua linha do tempo. Felizmente, existe uma API para isso:
statuses = parse(client.get("https://mastodon.social/api/v1/timelines/home"))
len(statuses)
>>> 20
É apenas uma contagem de postagens, mas por enquanto é o suficiente. Não há necessidade de lidar com paginação ainda. A questão é: o que você pode fazer com uma lista de suas postagens? Bem, você pode consultá-lo em busca de todos os tipos de dados interessantes. Por exemplo, quem postou o quarto status?
some_status = statuses[3]
some_status["account"]["username"]
>>> 'donwatkins'
Maravilhoso, um tweet do colega correspondente do Opensource.com, Don Watkins! Sempre ótimo conteúdo. Vou dar uma olhada:
display.HTML(some_status["content"])
<p>Just finished installed <span class="h-card"><a href="https://fosstodon.org/@fedora" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>fedora</span></a></span> <a href="https://fosstodon.org/tags/Silverblue" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Silverblue</span></a> 37 on <span class="h-card"><a href="https://fosstodon.org/@system76" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>system76</span></a></span> <a href="https://fosstodon.org/tags/DarterPro" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>DarterPro</span></a></p>
"Apenas" terminou? Espere, quando esse tweet foi postado? Eu moro na Califórnia, então quero o horário na minha zona local:
california = zoneinfo.ZoneInfo("US/Pacific")
when = parser.isoparse(some_status["created_at"])
print(when.astimezone(california))
>>> 2022-12-29 13:56:56-08:00
Hoje (no momento da redação deste artigo), um pouco antes das 14h. Fale sobre pontualidade.
Quer ver a postagem você mesmo? Aqui está o URL:
some_status["url"]
>>> 'https://fosstodon.org/@donwatkins/109599196234639478'
Aproveite o tooting, agora com 20% mais API!