lucidiot's cybrecluster

Ma configuration txtnish

Lucidiot Informatique 2020-12-06
Pour tweeter de n'importe où via twtxt, et sans oublier Mastodon.


Comme je le racontais dans mon précédent article introduisant à twtxt, j'utilise txtnish comme client twtxt. La principale raison est que son système de configuration le rend très facile à étendre pourvu qu'on sache écrire des scripts shell, parce que j'avais des besoins assez particuliers.

Je veux pouvoir tweeter depuis tous mes ordinateurs et mon téléphone, sans avoir besoin de penser à me connecter en SSH à tilde.town, puisque mon fichier twtxt public est sur tilde.town. Je veux aussi pouvoir tooter automatiquement à chaque tweet, pour que ce que je poste soit aussi envoyé sur Mastodon et que mes contacts entendent parler de moi ; je n'ai pas installé d'application pour accéder à Mastodon sur mon téléphone, donc je n'ai jamais de notifications s'ils me contactent, et j'essaie de limiter mes visites, donc ces posts automatiques serviront à au moins donner signe de vie.

Pour faire tout ça, on va juste écrire des choses dans ~/.config/txtnish/config, le fichier de configuration de txtnish qui n'est rien d'autre qu'un script shell chargé au démarrage du programme.

Pour commencer, mes options de base :

# C'est moi !
nick=lucidiot

# Attendre au plus 5 secondes pour charger les tweets de quelqu'un
timeout=5

# Ajouter des métadonnées sous forme de commentaires dans twtxt.txt
# pour indiquer mon nom, mon URL et les personnes que je suis,
# pour aider la découverte
add_metadata=1

# Ajouter mon nom et mon URL dans l'en-tête HTTP User-Agent
# pour me rendre visible aux autres
disclose_identity=1

Poster depuis n'importe où

txtnish a déjà des options intégrées pour gérer le support SSH : à chaque fois qu'on veut poster, il peut récupérer le fichier twtxt.txt par HTTP sur son URL publique, ajoute le ou les nouveau(x) tweet(s) et renvoie à nouveau le fichier par SSH.

On commence par configurer la première phase, qui va récupérer le fichier avant de poster :

# L'URL où txtnish ira récupérer le fichier distant
twturl=https://tilde.town/~lucidiot/twtxt.txt

# Là où il doit l'enregistrer
twtfile=~/.config/txtnish/twtxt.txt

Avec ça, txtnish ne fera encore rien, parce qu'il est conçu pour, par défaut, considérer que le fichier twtxt.txt est disponible en local. Les deux variables au-dessus ne changeront pas ce comportement et il faut donc dire explicitement au client de télécharger le fichier. Pour cela, on appelle la fonction existante sync_twtfile avant de commencer à écrire chaque tweet, en utilisant pre_tweet_hook, une fonction appelée avant de tweeter :

pre_tweet_hook () {
    sync_twtfile
}

Maintenant, txtnish récupérera le fichier distant, mais il n'est pas encore capable de le renvoyer. Pour cette partie-là, c'est plus simple : il faut juste configurer scp :

# Nom d'utilisateur utilisé pour se connecter à tilde.town
scp_user=lucidiot

# Nom d'hôte de tilde.town; j'ai défini dans mon .ssh/config
# des clauses pour 'Host town' qui vont au bon endroit avec
# la bonne clé SSH.
scp_host=town

# Le véritable chemin du fichier twtxt.txt sur tilde.town
scp_remote_name=~/public_html/twtxt.txt

Quand ces variables sont définies, txtnish comprend cette fois qu'il doit envoyer le fichier par SSH, et il le fait donc tout seul. Voilà, je peux maintenant tweeter depuis n'importe quel appareil alors que mon fichier est sur un autre serveur.

Crossposter

Le crossposting, c'est l'art de poster de façon automatique sur un réseau à partir d'un autre réseau. Ça a été souvent utilisé entre Twitter et Mastodon, que ce soit pour des gens qui ont décidé de quitter Twitter, ou qui ont quitté Mastodon et sont revenus sur Twitter ! Les crossposts de Twitter vers Mastodon sont cependant peu appréciés.

Dans mon cas, je vais crossposter de twtxt à Mastodon en sens unique, et je ne vais indiquer nulle part explicitement que ça vient de twtxt pour éviter de déranger les gens avec le concept du crosspost.

On va d'abord ajouter de quoi réussir à tooter depuis la ligne de commande, avec toot. Les instructions d'installation vous diront comment l'obtenir pour votre système. Une fois installé, lancez toot login pour lancer la procédure d'authentification à Mastodon. Ensuite, retournons dans le fichier de configuration.

txtnish ne nous donne hélas pas la possibilité de savoir exactement quels sont les nouveaux tweets envoyés, et il est possible d'envoyer plus d'un tweet en une seule fois, donc on va devoir bricoler notre propre façon de savoir quels sont les nouveaux tweets. Je vais utiliser pour cela les timestamps des tweets, et considérer qu'il est impossible qu'un nouveau tweet précède un tweet déjà existant ; pas de tweets dans le futur !

# Le timestamp du dernier tweet tooté sera stocké ici
last_toot_timestamp_file="$config_dir/last_toot_timestamp"

update_last_toot_timestamp () {
    grep '^[0-9]' "$twtfile" | sort -r | head -n1 | cut -f1 > "$last_toot_timestamp_file"
}

pre_tweet_hook () {
    sync_twtfile  # Pour le support SSH de tout à l'heure
    update_last_toot_timestamp
}

Il y a probablement des manières plus simples de faire, mais celle-là fonctionne très bien pour moi.

Je commence par utiliser grep pour filtrer le fichier et ignorer les commentaires ou les lignes vides. Ensuite, je profite du format ISO 8601, qui peut être trié facilement, et je trie donc dans l'ordre décroissant. La première ligne devient donc le tweet le plus récent, donc je prends ce tweet seulement avec head, et prends tout le texte qui précède la première tabulation, c'est-à-dire la date, avec cut. Enfin, tout va dans un fichier texte qui ne contiendra rien d'autre que le timestamp du dernier tweet.

Maintenant qu'on est en mesure d'écrire notre timestamp, on va pouvoir l'utiliser pour récupérer et tooter tous les nouveaux tweets, en utilisant le post_tweet_hook, qui s'exécute après avoir tweeté. Le code va être un peu plus compliqué :

# Nom du compte avec lequel tooter; toot prend en charge le multi-compte
toot_user="lucidiot@tilde.zone"

# Visibilité à appliquer sur les toots
# public, unlisted, private, direct
toot_visibility=private

post_tweet_hook () {
        # Ne pas crossposter si on n'a pas configuré les options de toot
        ([ -z "$toot_user" ] || [ -z "$toot_visibility" ]) && return

        # Récupérer le timestamp du dernier tweet
        last_toot_timestamp=""
        read last_toot_timestamp <"$last_toot_timestamp_file"

        # Lister les tweets, ne prendre que ceux qui se sont produits
        # après le dernier tweet connu, et ne prendre que leur texte
        grep '^[0-9]' "$twtfile" \
        | awk "{ if (\$1 > \"$last_toot_timestamp\") {print} }" \
        | cut -f2- \
        | while read content; do
            # Pouet !
            toot post -u "$toot_user" -v "$toot_visibility" "$content"
        done
}

La partie de filtrage est assez étrange et utilise un court script awk, parce que c'est ce qu'utilise txtnish dans une bonne partie de son code et que c'est aussi la méthode la plus simple que j'aie trouvé pour filtrer par date : grâce aux propriétés des dates ISO 8601, je peux les comparer comme des chaînes de caractères. Donc si leur date est supérieure à celle du dernier tweet connu, c'est un nouveau tweet, et je le garde, sinon je l'ignore.

On notera que ce code est vulnérable à certains bugs, notamment de l'injection de code dans le script awk si on écrit des bêtises là où devrait se trouver un timestamp valide de tweet. Je me base sur le fait de faire confiance à moi-même !

Avec tout ça, je peux donc continuer à utiliser tout à fait normalement txtnish, et à chaque tweet, tout part sur Mastodon sans que je n'aie rien à faire. En bonus, vu que j'ai installé et configuré toot, je peux aussi utiliser Mastodon sans passer par un navigateur et de façon moins distrayante.

Conclusion

Ce fichier de configuration n'a pas été fait par magie et du premier coup ; il m'a fallu faire pas mal d'évolutions, et il y a eu des moments où mon crossposteur s'est mis à envoyer à Mastodon l'intégralité de mes tweets, causant bien du bazar pour mes followers. J'ai pensé à encore quelques amélirations potentielles :

J'espère en tous cas qu'en le publiant comme ça, je pourrai m'encourager moi-même à utiliser twtxt plus souvent, et peut-être à m'investir plus dans ce réseau globalement. J'ai quelques projets qui pourraient bénéficier de twtxt…


Commentaires

Il n'y a pour l'instant aucun commentaire. Soyez le premier !