Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

Guardando relaciones de Mastodon

Publicado: 2026-01-11

Etiquetas: Mastodon, Proyectos, Python


Buenos días, tardes o noches:

Hace un par de semanas me acordé de una cuenta a la que seguía en Mastodon y de la que no había leído nada últimamente. ¿Había abandonado la red como mucha otra gente? Pero no, busqué su cuenta a mano y allí estaba. Seguía publicando cosas a diario. Vi que su perfil tenía un botón de "Seguir". Por alguna razón ya no estaba siguiendo esa cuenta. En Mastodon hay un botón que puedes usar para que alguien deje de seguirte. ¿Me había quitado de seguidor? No le di mucha importancia. No le seguí de nuevo por si tenía alguna razón para haberme quitado.

Esta semana, me ha pasado con otra persona. Alguien que seguía y de repente me doy cuenta de que ya no. Ambas cuentas tienen más de mil seguidores y yo nunca les he escrito ningún comentario que yo recuerde. Como mucho algún "like" o compartir sus publicaciones. Me pareció raro que me hubieran quitado de seguidor. Empecé a pensar que podría ser cosa de la federación. Que los servidores se separan por alguna razón. Recuerdo los splits del IRC en los 90. Me quedé pensando que a lo mejor me ha pasado con más gente y no me había dado cuenta. Sigo a cientos de cuentas y tengo mala memoria así que va a ser imposible saberlo pero puedo hacer algo para detectarlo si vuelve a ocurrir.

Tengo un script con el que periódicamente me descargo mis publicaciones de Mastodon para archivarlas. Se me ocurrió que podía también obtener del servidor la lista de cuentas a las que sigo y así averiguar si en futuro pierdo suscripciones.

En un fichero Python inicié sesión en Mastodon y usando account_following me bajé la lista de cuentas que sigo.

    client = Mastodon(access_token='TOKEN', api_base_url='INSTANCIA')

    me = client.me()
    print('username', me.username)
    print('id', me.id)

    following = client.account_following(id=me.id)
    print(following)

Como me pasó en el script que menciono arriba, la API devuelve como máximo 40 resultados así que tuve que hacer un bucle para bajarme toda la lista por fascículos.

    data = []
    while following:

        print('following', len(following))
        data.extend(map(parseFollowing, following))
        print('total', len(data))

        if not hasattr(following[-1], '_pagination_next'):
            print('No more following')
            break

        time.sleep(1)
        following = client.fetch_next(following[-1]._pagination_next)

    print('total', len(data))
    for following in sorted(data):
        print(following)

Aprendí que, cuando haces una llamada que devuelve resultados parciales como account_following, puedes usar fetch_next para obtener el siguiente trozo. Eso hace muy sencilla la implementación. Cuando escribí el script de descarga de mensajes no lo sabía y llamaba cada vez a account_statuses con diferentes ids.

Los datos de la API incluyen mucha información que no me interesa así que escribí una función para quedarme solo con el id de cuenta y el nombre.

def parseFollower(follower):
    return [
        follower['acct'],
        follower['display_name']
    ]

He guardado la lista resultante de ejecutar este script. Dentro de un mes lo volveré a ejecutar y miraré si alguien ha desaparecido.

El módulo que uso para llamar a la API de Mastodon es Mastodon.py. La empecé a usar a principios de 2024 para un bot y no le he actualizado desde entonces. Estoy usando la versión 1.8.1 y ya van por la 2.1.4. Quizá debería actualizar a la última versión en estos scripts y en el bot pero si funcionan ¿para qué tocarlos?


Artículo siguiente: Retos no, gimnasio
Artículo anterior: Bot Animal Crossing