Adrienne Vermorel
n8n RSS vers Notion
Si vous êtes comme moi, vous maintenez probablement des listes de lecture à rallonge, vous ajoutez des articles intéressants à vos favoris et vous essayez de rester à jour avec votre veille.
Mais collecter manuellement du contenu provenant de plusieurs flux RSS, nettoyer les éléments superflus et organiser le tout dans une base de connaissances peut être assez chronophage et parfois un peu décourageant.
Pour lutter contre cette surcharge, j’ai mis au point une solution d’automatisation qui récupère des articles RSS, les nettoie avec ChatGPT et les enregistre sous forme de pages Notion.
Mon workflow est construit avec n8n, un outil d’automatisation de workflows open-source qui vous permet de connecter différents services via des workflows visuels. Imaginez-le comme une alternative auto-hébergée à Zapier ou Make, mais avec plus de flexibilité et sans tarification par tâche. Vous définissez les workflows comme des nœuds connectés par des arêtes, où chaque nœud effectue une opération spécifique—depuis faire des requêtes HTTP jusqu’à transformer des données avec JavaScript.
Nous aborderons aussi brièvement Notion, qui sert à la fois de base de données de configuration (où nous listons les sources RSS) et de repo de contenu (où les articles nettoyés sont stockés). Si vous n’êtes pas familier avec Notion, c’est essentiellement un espace de travail flexible qui combine documents, bases de données et tableaux kanban en un seul outil.
Le Problème que Je Résous
Les flux RSS restent l’un des meilleurs moyens d’agréger du contenu provenant de blogs, newsletters et sites d’actualités. Cependant, ils s’accompagnent de plusieurs défis :
- Fragmentation du contenu : Vous devez consulter plusieurs sources sur différents lecteurs. Il existe bien sûr des lecteurs RSS payants, mais le contenu reste dans l’application et les choses ne sont pas si personnalisables.
- Bruit HTML : Les articles incluent des menus de navigation, des bannières de cookies, des CTA de newsletters, des boutons de partage social et du contenu de pied de page.
- Mauvais formatage : Le contenu RSS brut ne s’affiche souvent pas bien lorsqu’il est enregistré directement.
- Pas de déduplication : Le même article peut apparaître plusieurs fois si vous actualisez les flux.
- Effort manuel : Sauvegarder des articles intéressants pour plus tard nécessite des workflows manuels de copier-coller.
Ce workflow résout tous ces problèmes grâce à l’automatisation, créant un système de « sauvegarde pour plus tard » qui fonctionne en pilote automatique.
Vue d’Ensemble de l’Architecture
Le workflow se compose de 14 nœuds organisés en quatre étapes principales :
- Configuration des sources et déclenchement (Nœuds 1-2)
- Récupération des flux RSS et déduplication (Nœuds 3-8)
- Extraction et nettoyage du contenu (Nœuds 9-13)
- Création de pages Notion (Nœud 14)
Voici le flux général :
Déclencheur → Récupérer Sources RSS → Obtenir Flux RSS → Parser XML → Séparer Items ↓Filtrer Articles Existants (Merge) → Créer Pages Notion → Extraire IDs Pages ↓Récupérer Contenu Article (Jina) → Préparer Prompt ChatGPT → Nettoyer avec LLM ↓Convertir Markdown en Blocs Notion → Ajouter à Page NotionExaminons chaque étape en détail.
Étape 1 : Déclenchement du Workflow
Le workflow peut être déclenché de deux manières :
Déclencheur Manuel
Le nœud When clicking 'Execute workflow' vous permet d’exécuter le workflow à la demande. C’est utile pour :
- Tester les modifications du workflow
- Faire un import initial en masse d’articles
- Forcer la récupération de nouveau contenu en dehors du planning
Déclencheur Programmé
Le nœud Schedule Trigger exécute le workflow automatiquement tous les jours à 5h00 du matin. Ce timing est utile :
- La plupart des blogs et sites d’actualités publient du contenu pendant les heures de bureau
- L’exécution tôt le matin capture le contenu de la veille avant que je commence ma journée de travail
- Cela évite les heures de pointe d’utilisation des API pour certains services externes
Le déclencheur programmé utilise une syntaxe de type cron : triggerAtHour: 5 signifie « exécuter une fois par jour à 5h du matin dans votre fuseau horaire configuré ».
Étape 2 : Gestion des Sources RSS et Déduplication
Récupération des Sources RSS depuis Notion
Le nœud Get many sources from monitoring interroge une base de données Notion qui sert de configuration pour vos sources RSS. C’est pratique car :
- Les sources RSS sont stockées dans une base de données que je peux facilement modifier
- Je peux ajouter des métadonnées aux sources (catégories, priorité, etc.)
- La requête filtre par
type = "RSS", ce qui signifie que je pourrais stocker d’autres types de contenu (podcasts, newsletters) dans la même base de données
La configuration du nœud montre qu’il interroge une URL de base de données spécifique et retourne tous les enregistrements où la propriété type est égale à “RSS”. Chaque enregistrement doit inclure une propriété appelée rss_link contenant l’URL du flux.
Récupération du Flux RSS
Le nœud Fetch RSS Feed effectue une requête HTTP GET vers chaque URL de flux RSS. Notez les en-têtes importants :
"User-Agent": "Mozilla/5.0""Accept": "application/rss+xml, application/xml;q=0.9, */*;q=0.8"Ces en-têtes sont nécessaires car :
- Certains serveurs bloquent les requêtes sans User-Agent (ils supposent que c’est un bot)
- L’en-tête Accept demande explicitement le format RSS/XML, bien que la plupart des flux le retournent de toute façon
Le format de réponse est défini sur text car nous avons besoin du XML brut avant l’analyse.
Conversion XML vers JSON
Le nœud XML to JSON convertit le XML du flux RSS en une structure JSON plus facile à manipuler dans les nœuds suivants. Les flux RSS ont généralement une structure comme :
<rss> <channel> <item> <title>Titre de l'Article</title> <link><https://example.com/article></link> <description>Description de l'article</description> <pubDate>Thu, 14 Nov 2024 10:00:00 GMT</pubDate> <dc:creator>Nom de l'Auteur</dc:creator> </item> </channel></rss>Après l’analyse XML, cela devient un objet JSON imbriqué.
Séparation des Articles Individuels
Le nœud Split Out RSS Feed prend le tableau à rss.channel.item et crée un élément de sortie par article. C’est essentiel car :
- Chaque article doit être traité indépendamment
- Vous devez vérifier chaque article individuellement pour les doublons
- Chaque article devient sa propre page Notion
Logique de Déduplication
C’est là que le workflow devient sophistiqué. Le nœud Get All Articles récupère tous les articles RSS existants de votre base de données de contenu Notion (où type = "RSS"). Ensuite, le nœud Merge effectue une jointure anti-gauche :
- Entrée 1 (gauche) : Articles existants de Notion avec leur
property_content_url - Entrée 2 (droite) : Nouveaux articles du flux RSS avec leur
link - Fusionner par :
property_content_url=link - Mode de jointure :
keepNonMatches(ne garder que les éléments de l’entrée 2 qui ne correspondent pas à l’entrée 1) - Sortie de : input2
Le résultat ? Seuls les articles qui n’existent pas déjà dans votre base de données Notion sont transmis à l’étape suivante. Cela évite les doublons et économise les appels API.
La configuration executeOnce: true sur le nœud Get All Articles est cruciale—elle garantit que les articles existants sont récupérés une fois pour l’ensemble du lot, et non une fois par élément RSS.
Étape 3 : Extraction et Nettoyage du Contenu
Création de Pages Notion Temporaires
Le nœud Create a database page crée une nouvelle page Notion pour chaque article avec des métadonnées de base :
- Titre :
{{ $json.title }}de l’élément RSS - Auteur : Utilise en cascade
dc:creator,author, ou “no author” - Publié le :
{{ $json.pubDate }} - Nom du flux RSS : Fait référence à la source de “Get many sources from monitoring”
- content_url : L’URL de l’article depuis
{{ $json.link }} - Type : Défini sur “RSS” pour filtrer plus tard
- Icône : Emoji 📰 pour une cohérence visuelle
À ce stade, les pages existent mais n’ont pas de contenu—juste des métadonnées. L’ID de la page est capturé dans la réponse.
Extraction des IDs de Page
Le nœud Set notion_page_id crée un nouveau champ contenant l’ID de la page Notion :
{ "notion_page_id": "{{ $json.id }}"}Cet ID est crucial pour l’étape finale lorsque nous ajoutons le contenu nettoyé à la page.
Récupération du Contenu de l’Article avec Jina AI
Le nœud Read URL content utilise l’API Reader de Jina AI, qui est spécifiquement conçue pour extraire du contenu propre des pages web. La configuration :
url: "{{ $items('Create a database page')[$itemIndex].json.property_content_url }}"outputFormat: "markdown"Jina AI retourne le contenu de l’article en markdown, ce qui est parfait car :
- Le markdown est un format structuré plus facile à analyser que le HTML
- Il préserve le formatage (titres, listes, gras, italique) tout en éliminant les éléments superflus
- C’est le format intermédiaire dont nous avons besoin avant de convertir en blocs Notion
Le nœud a une logique de réessai configurée :
retryOnFail: truemaxTries: 5waitBetweenTries: 5000(5 secondes)
C’est important car le web scraping peut être instable (timeouts, limites de taux, erreurs temporaires).
Préparation du Prompt ChatGPT
Le nœud ChatGPT Prompt Preparation construit le corps de la requête API en utilisant JavaScript. La stratégie du prompt est :
Message système : Établit le rôle et les règles
You are a meticulous Markdown cleaner. Keep the main article text and structurebut remove navigation menus, cookie notices, newsletter CTAs, footers, share buttons,related posts, and other site chrome. Preserve headings, paragraphs, code blocks,lists, tables, and links (strip tracking params). Preserve the bold and italicizationmarkers. Replace the double return \\n\\n with a single return \\n. Remove the weirdcharacters (like \\_ or * * * alone in a single line). Return only the cleanedMarkdown with no commentary, and without wrapping it in a markdown block.Message utilisateur : Fournit la tâche et le contenu
Task: Clean the Markdown below according to the rules. Return ONLY the cleaned Markdown.
---BEGIN MARKDOWN---${$input.item.json.content || ''}---END MARKDOWN---Le prompt est conçu pour :
- Supprimer tout le contenu non-article (navigation, CTA, etc.)
- Préserver la structure sémantique (titres, listes, code)
- Nettoyer les artefacts de formatage
- Supprimer les paramètres de tracking des liens
- Retourner du markdown brut sans blocs de code
Le modèle utilisé est gpt-4o-mini avec temperature: 0.1 pour des résultats cohérents et déterministes.
Le code maintient explicitement la relation d’élément apparié : pairedItem: 0, ce qui est crucial pour que n8n suive quelle entrée correspond à quelle sortie lors du traitement de plusieurs éléments.
Appel de l’API ChatGPT
Le nœud ChatGPT Markdown Cleaner effectue une requête POST vers l’API Chat Completions d’OpenAI :
method: "POST"url: "<https://api.openai.com/v1/chat/completions>"authentication: "predefinedCredentialType"nodeCredentialType: "openAiApi"sendBody: truespecifyBody: "json"jsonBody: "={{ $json.requestBody }}"timeout: 500000 // 8+ minutes pour les réponses lentesLe timeout élevé est défensif—les API LLM peuvent parfois être lentes, surtout pour les articles longs. Le timeout était l’une des raisons pour lesquelles je ne pouvais pas utiliser les nœuds LLM natifs dans n8n, ils ont des timeouts relativement courts ; trop courts pour mon cas d’usage.
Étape 4 : Conversion au Format Notion
Le Parser Markdown vers Blocs Notion
C’est le nœud le plus complexe du workflow. Notion n’accepte pas le markdown brut—il nécessite que le contenu soit structuré comme un tableau d’objets “blocs”. Chaque bloc représente un élément de contenu (paragraphe, titre, élément de liste, etc.) avec son propre type et ses propriétés.
Le nœud Markdown to notion blocks contient ~400 lignes de JavaScript qui :
- Analyse le formatage markdown en ligne :
- Gras :
*texte**ou__texte__ - Italique :
texte*ou_texte_ - Liens :
[texte](url) - Code en ligne :
code
- Convertit les éléments de niveau bloc :
- En-têtes :
# H1,## H2,### H3 - Paragraphes : Texte régulier
- Listes :
puceou1. numérotée - Citations :
> texte cité - Blocs de code :
langage... - Images :
 - Séparateurs :
--ou**
-
Construit des objets rich_text Notion : Ce sont des structures imbriquées complexes comme :
{type: "text",text: {content: "Bonjour monde",link: { url: "<https://example.com>" } // optionnel},annotations: {bold: true,italic: false,// ... autre formatage}} -
Gère les cas particuliers :
- Les en-têtes au-delà de h3 (h4, h5, h6) deviennent des paragraphes en gras car Notion ne supporte que 3 niveaux de titres
- Les citations vides sont ignorées (elles ont l’air maladroites dans Notion)
- Le texte brut consécutif est fusionné pour plus d’efficacité
- Les underscores échappés sont désécappés :
\\_→_ - Déplie les images liées :
[](lien)→
-
Divise le contenu surdimensionné : Notion a une limite de 2000 caractères par élément rich_text. La fonction
splitLongBlocks:- Détecte les blocs avec du contenu texte dépassant 2000 caractères
- Les divise en plusieurs morceaux
- Préserve le formatage et la structure entre les morceaux
- Gère spécialement les blocs de code (divise par position de caractère)
-
Limite à 100 blocs : L’API de Notion a une limite de 100 blocs par requête. Le workflow prend les 100 premiers blocs, ce qui est généralement suffisant pour la plupart des articles.
La sortie inclut des métadonnées pour le débogage :
{ children: blocksToSend, // Tableau de blocs Notion meta: { model: "gpt-4o-mini", created: "...", total_blocks: 45, split_blocks: 47, // Après division des blocs longs blocks_sent: 47 }}Ajout du Contenu à Notion
Le nœud final HTTP Request effectue une requête PATCH vers l’API “append block children” de Notion :
method: "PATCH"url: "<https://api.notion.com/v1/blocks/>{{ notion_page_id }}/children"authentication: "predefinedCredentialType"nodeCredentialType: "notionApi"body: { "children": "={{ $json.children }}" // Tableau de blocs}Cela ajoute tous les blocs de contenu à la page Notion que nous avons créée précédemment. La page contient maintenant :
- Des métadonnées dans les propriétés de la base de données (titre, auteur, date, source, URL)
- Le contenu complet de l’article avec formatage préservé
- Une structure propre sans publicités, navigation ou autres éléments superflus
Comme le nœud Jina AI, celui-ci a une logique de réessai pour gérer les défaillances API transitoires.
Considérations de Coût
Estimons les coûts d’exécution quotidienne de ce workflow :
n8n
- Auto-hébergé : Je paie 5$/mois sur railway.com
- n8n Cloud : Commence à 20$/mois pour 2 500 exécutions de workflow
Jina AI Reader
- Tier gratuit : 1 million de tokens
- Article typique : ~2 000-5 000 tokens
- À 20 articles/jour : ~60 000-150 000 tokens, donc ça dure un moment. Ensuite c’est 50$ par milliard de tokens. Un milliard de tokens devrait durer un bon moment.
API OpenAI (GPT-4o-mini)
- 0,150$ par 1M de tokens d’entrée
- 0,600$ par 1M de tokens de sortie
- Entrée par article : ~3 000-8 000 tokens (système + message utilisateur)
- Sortie par article : ~2 000-5 000 tokens (markdown nettoyé)
- À 20 articles/jour × 30 jours = 600 articles/mois
- Entrée : ~3,6M tokens = 0,54$
- Sortie : ~2,4M tokens = 1,44$
- Total : ~2$/mois
Notion
- Tier gratuit : Suffisant pour un usage personnel
- Plus : 10$/mois
Coût mensuel total : ~7-32$, selon votre choix d’hébergement n8n. Les coûts du LLM et de l’extraction de contenu sont minimes. Dans l’ensemble, c’est moins cher et plus personnalisable qu’un outil de lecture RSS payant.
Conclusion
Ce workflow combine quelques outils modernes pour automatiser quelque chose qui me prenait du temps chaque jour :
- RSS pour l’agrégation de contenu décentralisée
- Jina AI pour l’extraction intelligente de contenu
- ChatGPT pour le nettoyage de contenu
- Notion pour le stockage structuré
- n8n pour l’orchestration
J’ai construit un système qui organise automatiquement une base de connaissances personnelle à partir du web. Le workflow s’exécute quotidiennement, ne nécessite aucune intervention manuelle et ne coûte que quelques dollars par mois à exploiter.
Pour les professionnels de la data, ce modèle s’étend au-delà des flux RSS. La même architecture pourrait agréger :
- Les mises à jour de dépôts GitHub
- Les messages Slack avec des mots-clés spécifiques
- Les descriptions de tickets Jira
- Les changements de documentation
- Les publications de rapports sectoriels
Je suis une grande fan du fait que les pipelines de données structurées ne sont pas seulement pour l’analytique—ils sont aussi puissants pour la gestion des connaissances. Chaque composant de ce workflow est conçu avec les mêmes principes que vous appliqueriez à un pipeline de données : idempotence, gestion des erreurs, logique de transformation et traitement efficace.
Si vous construisez quelque chose de similaire, le JSON du workflow peut être importé directement dans n8n. Vous devrez :
- Configurer vos bases de données Notion (sources RSS et stockage de contenu)
- Configurer vos identifiants API (Notion, OpenAI)
- Ajuster le planning et les filtres selon vos préférences
- Exécuter le déclencheur manuel pour tester le flux complet
Vous pouvez trouver le workflow dans ce dépôt GitHub.
Bonne automatisation !