Vous avez publié un feed avec skyfeed.app mais vous ne savez pas comment le supprimer ? 📌
Suivez ce tuto : Comment supprimer un custom feed ?
Une contribution de @leandraa.fr
Comment épingler un post dans un Feed ? c’est par ici 📌
Nouveau : comment utiliser les mots de passe d’application (app passwords) avec les différents outils et applications pour Bluesky ? c’est par ici 📌
Une contribution de @mwyann.fr
Création du feed de La Chute, comment cuisiner un Feed avec une liste approuvée, une liste pour les trolls et des mots clefs pour le public ? c’est par ici 📍📌
Comment créer un Custom Feed combiné ? c-a-d, contenant des posts du réseaux avec mot-clef et en même temps des posts d’un compte spécifique basé sur un critère, ici un nom de domaine ? lien vers le tutoriel.
Avec les conseils aimables de @leandraa.fr et @mwyann.fr
Comment utiliser son propre nom de domaine sur Bluesky? Video 📌
Ce soir, 19h (heure 🇧🇪) on se fait un petit question & réponses à propos de Bluesky, en direct sur la chaîne youtube de @rmendes.net 📹
Lien du direct
il n’y a pas de questions bêtes
c’est format tranquille en mode test
[Tech] comment déployer son propre “générateur de feed” sur son propre domaine, sans dépendre de @skyfeed.app ou de @goodfeeds.co ?
Une des approches est très bien détaillée ici
Vous commencez par créer un nouveau custom feed sur skyfeed.app, à côté de ça, dans le bloc Input vous choisissez Single User et vous cliquez Select Yourself
Puis vous ajoutez un regex bloc avec la requête
📌
ou 📍
De là, vous publiez votre custom feed et chaque post (ou repost) où vous utilisez le emoji 📍 ou 📌 dans cet example, vous allez le retrouver dans votre custom feed.
Si votre émoji est précédé comme ceci : ^📌 ou comme cela 📍$
ça va faire le filtre, le match en fonction du fait que l’émoji est au debut du post ou à la fin du post.
tandis que 📌 ou📍tou simple, précise que l’émoji est n’importe où dans le post.
Ne prenez pas tout, choisissez un cas de figure et ensuite utiliser ce format lorsque vous composez vos post et que vous voulez le garder en signet.
Perso j’utilise 📌 pour les tutos et j’utilise 📍 dans le bloc regex pour les astuces, résultat j’ai deux custom feed qui stock ces deux types de posts et je n’ai plus à y penser, j’ai facile à retrouver mes posts de l’un ou l’autre format/type de signet.
crédit à @mwyann.fr pour cette astuce !
Évidemment, cette idée peut être appliquée pour n’importe quoi d’autre en changeant les émojis filtres au besoin.
ps: en activant le cas sur les reposts, ça vous permet de simplement reposter le post d’un ami, en ajoutant 📌 ou📍pour que son post soit rangé dans vos signets.
Pour l’exercice, on va déployer un newsbot https://disclose.ngo/ C’est un média d’investigation.
Pas besoin d’un gros serveurs, il suffit d’avoir un ordinateur, évidemment si vous le débranché, le bot s’éteint aussi, donc, c’est plus pratique de mettre ça en ligne, sur un petit vps, même un serveur à 5€ par mois fera tout à fait l’affaire.
Et sinon, votre machine, que ce soit sur Windows, Linux ou macOS, tout est bon !
le site Disclose.ngo est un site sur mesure, mais il propose 2 flux RSS
Pour trouver le flux RSS d’un site source, l’extension Feedbro est très utile on pourrait faire tout un article sur cette question, mais en général, il y a toujours moyen de récupérer le flux RSS d’un site, même s’il est bien caché !
bsky.rss est un petit bijou de code qu’on peut trouver ici :
Je suis sur Linux Ubuntu, donc l’approche ici part de ce principe :
git clone github.com/milanmdev/bsky.rss disclosengo
cd disclosengo
ls disclosengo
cp docker-compose.example.yml docker-compose.yml
cp data/config.example.json data/config.json
Voici à quoi doit ressembler votre fichier docker-compose.yml une fois configuré
version: "3"
services:
bsky-rss:
restart: always # le conteneur se lance au démarrage
image: ghcr.io/milanmdev/bsky.rss
container_name: bsky-rss-disclosengo # le nom du container une fois qu'il tourne
mem_limit: "256m" #mémoire limitée à
mem_reservation: "128m" #mémoire réservée
environment:
- APP_PASSWORD=votre-app-password
- INSTANCE_URL=https://bsky.social
- FETCH_URL=https://disclose.ngo/feed?lang=en
- IDENTIFIER=disclosengo.bsky.social
volumes:
- ./data:/build/data # le fameux dossier data dans le dépôt ? il sera utilisé comme volume d'écriture
Prendre la dernière version ici donc à l’heure où j’écris ces lignes c’est : ghcr.io/milanmdev/bsky.rss:queue-4adef77 on va utiliser cette image docker à la place de l’image de base, donc on va remplacer l’entrée image ci dessous.
version: "3"
services:
bsky-rss:
restart: always # le conteneur se lance au démarrage
image: ghcr.io/milanmdev/bsky.rss:queue-4adef77
container_name: bsky-rss-disclosengo # le nom du container une fois qu'il tourne
mem_limit: "256m" #mémoire limitée à
mem_reservation: "128m" #mémoire réservée
environment:
- APP_PASSWORD=votre-app-password
- INSTANCE_URL=https://bsky.social
- FETCH_URL=https://disclose.ngo/feed?lang=en
- IDENTIFIER=disclosengo.bsky.social
volumes:
- ./data:/build/data # le fameux dossier data dans le dépôt ? il sera utilisé comme volume d'écriture
Une fois ce changement fait, il suffit de sauver le fichier après avoir remplis les différents champs de la zone environnement, app password, instance url, fetch url (le rss feed) et l’identifiant.
Si vous utilisez un domaine ça serait par exemple skyfleet.blue au lieu de hande.bsky.social si vous avez besoin de faire tourner plusieurs flux RSS pour le même bot, il suffit de faire la mise ne place ici pour un flux et puis dupliquer tout le répertoire et changer uniquement le flux RSS.
{
"string": "$title", # post le titre
"publishEmbed": true, # créer une carte intégrée en utilisant l'OpenGraph
"languages": ["en"], # la langue de votre flux RSS
"truncate": true, # coupe la description pour ne pas dépasser 300 caractères
"runInterval": 60,
"dateField": ""
}
Quand le “publishEmbed” est en “True”, il n’est pas nécéssaire d’ajouter la variable $link dans le champ string, qui correspond à ce qui va être posté, en effet la génération de la carte Embed, va se baser sur les meta OpenGraph du lien, l’image, la description et le titre qui y sont associés.
{
"string": "$title - $link $description", # en général le titre suffit
"publishEmbed": true, # false déconseillé de mettre en false sauf si pas de lien
"languages": ["en"], # fr, de, es, etc...
"truncate": true, #false
"runInterval": 60, # 120 absent de la branch main
"imageField": "enclosure", # a changer par le nom de votre balise image pour l'imposer au besoin
"ogUserAgent": "", # permet d'imposer un autre user-agent pour se faire passer pour un browser
"forceDescriptionEmbed": "false", # true permet de forcer l'utilisation du champ description du RSS
"descriptionClearHTML": "true", # true va nettoyer le texte de la description de balises html
"dateField": "" # par défaut, il cherche pubDate sauf si le flux RSS n'est pas standard
}
docker-compose up
:/home/bsky-bot/disclosengo# docker-compose up
[+] Running 1/1
⠿ Container bsky-rss-disclosengo Created 0.2s
Attaching to bsky-rss-disclosengo
bsky-rss-disclosengo | yarn run v1.22.19
bsky-rss-disclosengo | $ tsx ./app/index.ts
bsky-rss-disclosengo | [Mon, 14 Aug 2023 11:29:24 GMT] - [bsky.rss APP] Started RSS reader. Fetching from https://www.inoreader.com/stream/user/1005343511/tag/Disclosengo every 5 minutes.
[bsky.rss QUEUE] Starting queue handler. Running every 60 seconds
[bsky.rss QUEUE] Queuing item (Revealed: Perenco’s damaging oil spills in Gabon)
[bsky.rss QUEUE] Queuing item (Lützerath: French banks finance the extension of one of Europe’s largest coal mines )
À ce stade, le bot se déploie et vous devriez voir un retour dans votre terminal, si tout va bien, il va checker que le flux RSS et publier ce qu’il trouve à publier, ensuite le bot écrit dans un fichier txt (data/last.txt) la dernière fois qu’il a checker le flux RSS et va utiliser cette date pour comparer s’il y a du nouveau dans le flux RSS et ce toutes les 5 minutes.
[bsky.rss POST] Posting new item (Revealed: Perenco’s damaging oil spills in Gabon)
[bsky.rss POST] Posting new item (Lützerath: French banks finance the extension of one of Europe’s largest coal mines )
[bsky.rss QUEUE] Finished running queue. Next run in 60 seconds
[bsky.rss QUEUE] Running queue with 20 items
[bsky.rss QUEUE] Finished running queue. Next run in 60 seconds
[bsky.rss QUEUE] Running queue with 0 items
Vous pouvez interrompre le bot avec CTRL+C, changer la config, changer le flux RSS, bref fignoler les détails et quand vous êtes content du résultat, vous lancez le bot avec
docker-compose up -d
Cela va lancer le bot comme un processus de tâche de fond.
ceci dans le fichier docker-compose.yml
image: ghcr.io/milanmdev/bsky.rss:queue-4adef77
redevient :
image: ghcr.io/milanmdev/bsky.rss
on sauve le fichier et on fait :
docker-compose pull
on vérifie bien que le fichier config.json est bien adapté à la version du code
{
"string": "$title", #vérifier la zone qui va construire le text du post
"publishEmbed": true, #intégration des liens/images
"languages": ["en"], #la,gues
"truncate": true, # couper la description si trop longue
"runInterval": 60, # si pas dans la branche queue
"dateField": "" # champ date spécifique pour flux RSS non-standard
}
Bien faire attention que la dernière ligne de configuration du fichier config.json, ne doit pas comporter de virgule, mais toutes celles qui la précèdent bien !!
On lance la sauce :
docker-compose up -d
vérifier l’état du bot sur laydocker ou docker logs -f nom-de-votre-container
lazydocker
et voilà, vous êtes en train de faire tourner la version stable du bot !
L’idée avec ce tuto, c’est de démontrer une mise en place d’utilisation des customs feeds sur Bluesky basé sur un News Bot qui va générer le contenu, ce qui va nous permettre de segmenter l’activité du newsbot en différents customs feeds auxquels les utilisateurs vont pouvoir s’abonner.
Il y a donc 12 processus de veille RSS qui tournent, un par catégorie maitresse sur le site LeMonde
J’avais besoin d’une ancre stable sur lequel me baser pour chaque catégorie et je ne pouvais pas prévoir tous les mots utilisés dans un titre ou la description pour segmenter les articles en différent flux thématique, du coup, en éditant mon fichier config.json, je peux segmenter avant même la publication, et ce, de manière stable :
{
"string": "Actu: $title",
"publishEmbed": true,
"languages": ["fr"],
"truncate": true,
"runInterval": 60,
"dateField": ""
}
{
"string": "Culture: $title",
"publishEmbed": true,
"languages": ["fr"],
"truncate": true,
"runInterval": 60,
"dateField": ""
}
Etc.. etc..ce qui me permet de prendre le dossier/catégorie culture, actu, sports, france etc… et d’avoir une segmentation simple sans devoir passer par des tas de requête regex qui ne donneraient pas une segmentation aussi simple et efficace.
Vue de la mise en place d’un custom feed avec skyfeed.app
Pour régler les problèmes de doublons, c’est-à-dire, un article qui apparaît dans 2 ou 3 flux, j’ai déjà viré les flux à la Une, vu qu’ils reprennent le contenu des catégories, ensuite grâce à Inoreader, je vire les doublons d’une même catégorie en faisant un tri sur les articles qui ont le même titre, mais qui sont publiées à plusieurs endroits et enfin, on utilise le flux de sortir du dossier (culture, actu, sports etc..) comme input d’entrée du bot qui veille à l’arrivée de nouvelles publications et qui s’en charge de les publier.
Vu qu’il y avait encore des doublons, tout a été reconstruit, c’est à dire que l’agrégation de l’ensemble des flux cités ci plus haut sont rassemblé dans un seul dossier, sur lequel le check de duplicatas se fait, ainsi ça vire les doublons d’une manière transversale, sur l’ensemble de la veille.
Ensuite pour faire la segmentation, au lieu de la faire sur des préfix qui annonce de quel catégorie vient l’article, on se base sur la structure des articles chez LeMonde pour segmenter l’information en plusieurs custom feeds : dont /internatonal/ ou /economie/ ou /culture/ dans l’URL deviennent les repères sur lesquels se fait la segmentation, résultat, plus de doublons et des customs feeds par catégories;
Tout de même certain choix ont dû être fait, par exemple la catégorie Idées du journal ont été mise dans le segment Actualités.
Je n’ai pas encore fait des customs feeds segmenté par langues sur mes news bots bilingues, mais imaginons que vous avez envie de vous farcir @Sciences mais qu’en français pour l’exercice de ce tuto !
La recette est plutôt simple, voici les ingrédients :
À ce moment-là, le contenu sur la colonne de preview à droite n’affiche que des posts en français. On peut sauver notre Feed à ce stade en le publiant.
Ceci est juste un exemple de ce qui peut être fait en termes de custom feed sur un compte, vous pourriez bien rajouter un champ regex en mentionnant uniquement vouloir recevoir des actus sur Mars ou sur le James Webb Telescope, ou uniquement les posts contenant 10 likes etc…
Ce custom feed peut être actualisé en éditant simplement le feed et en republiant ce dernier les changements sont immédiats.
L’avantage des customs feeds sur lesquels vous avez la main, c’est que vous pouvez les changer les améliorer etc..contrairement au custom feed sur le compte des autres.
Ex: @EUwatch est tri lingues, mais si vous n’avez pas l’espagnol, et l’anglais activé sur votre compte, vous ne verrez que l’actualité en Français sur ce compte.
L’avantage d’un custom feed segmenté, c’est que vous pouvez ne pas suivre le compte si le volume est trop important et recevoir uniquement ce qui vous intéresse, que ce soit par choix de langue ou mots clefs.