{"id":90,"date":"2025-06-07T12:58:31","date_gmt":"2025-06-07T10:58:31","guid":{"rendered":"https:\/\/boissiebruno-pageperso-pi.ovh\/?p=90"},"modified":"2025-06-07T14:36:26","modified_gmt":"2025-06-07T12:36:26","slug":"automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants","status":"publish","type":"post","link":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/","title":{"rendered":"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants)"},"content":{"rendered":"\n<p>Dans cet article p\u00e9dagogique, nous allons apprendre \u00e0 utiliser <strong>n8n<\/strong> pour cr\u00e9er un syst\u00e8me complet d\u2019automatisation de veille sur YouTube et LinkedIn. Pas de panique si vous d\u00e9butez : nous adopterons un ton accessible et expliquerons chaque \u00e9tape. Nous couvrirons deux cas d\u2019usage concrets r\u00e9unis en un seul workflow coh\u00e9rent&nbsp;:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Veille YouTube<\/strong> \u2013 R\u00e9cup\u00e9ration automatique des nouvelles vid\u00e9os d\u2019une cha\u00eene YouTube via son flux RSS. Nous utiliserons le n\u0153ud communautaire <strong>YouTube Transcript<\/strong> pour extraire la transcription de chaque nouvelle vid\u00e9o, puis un mod\u00e8le d\u2019IA pour g\u00e9n\u00e9rer un r\u00e9sum\u00e9 (avec un agent IA local comme <strong>Oyama<\/strong> ou via l\u2019API <strong>OpenAI<\/strong>). Enfin, nous stockerons les r\u00e9sum\u00e9s dans une base de donn\u00e9es <strong>PostgreSQL<\/strong>.<\/li>\n\n\n\n<li><strong>Veille LinkedIn<\/strong> \u2013 Surveillance des publications LinkedIn d\u2019un influenceur via <strong>PhantomBuster<\/strong>. Nous extrairons les derniers posts du profil, produirons un r\u00e9sum\u00e9 de chaque post (avec le mod\u00e8le local Oyama), puis les enregistrerons dans PostgreSQL. Ensuite, nous ajouterons une \u00e9tape finale qui utilise <strong>OpenAI<\/strong> pour g\u00e9n\u00e9rer un <strong>r\u00e9sum\u00e9 global<\/strong> des id\u00e9es principales \u00e0 partir des donn\u00e9es en base.<\/li>\n<\/ol>\n\n\n\n<p>Suivez le guide&nbsp;! Nous commencerons par pr\u00e9parer l\u2019environnement (installation de n8n, activation des nodes communautaires, ajout de Puppeteer, configuration de PostgreSQL et d\u2019Oyama), puis nous d\u00e9taillerons chaque workflow. Des captures d\u2019\u00e9cran de l\u2019interface n8n illustrent les \u00e9tapes cl\u00e9s pour vous guider visuellement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation de n8n via Docker et activation des Community Nodes<\/h2>\n\n\n\n<p>Pour d\u00e9marrer, installons n8n en utilisant Docker. Cela permet une installation propre et reproductible. Si Docker est d\u00e9j\u00e0 install\u00e9 sur votre machine, ex\u00e9cutez par exemple la commande suivante (elle t\u00e9l\u00e9charge l\u2019image n8n officielle et lance un conteneur)&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name n8n -p 5678:5678 -v ~\/.n8n:\/home\/node\/.n8n n8nio\/n8n:latest\n<\/code><\/pre>\n\n\n\n<p>Cette commande lance n8n en arri\u00e8re-plan (<code>-d<\/code>), lie l\u2019interface web au port 5678 de votre machine, et monte un volume local (<code>~\/.n8n<\/code>) pour persister les donn\u00e9es (ainsi, vos workflows ne seront pas perdus au red\u00e9marrage du conteneur).<\/p>\n\n\n\n<p><strong>Activation des n\u0153uds communautaires :<\/strong> Par d\u00e9faut, la version self-hosted de n8n permet l\u2019installation de n\u0153uds communautaires (Community Nodes). V\u00e9rifiez que l\u2019option est bien activ\u00e9e. Si besoin, vous pouvez forcer l\u2019activation via une variable d\u2019environnement Docker <code>N8N_COMMUNITY_PACKAGES_ENABLED=true<\/code> (c\u2019est normalement le cas par d\u00e9faut). Avec cette option, un nouveau menu <strong>\u201cCommunity Nodes\u201d<\/strong> appara\u00eetra dans l\u2019interface n8n, vous permettant d\u2019installer des n\u0153uds suppl\u00e9mentaires d\u00e9velopp\u00e9s par la communaut\u00e9.<\/p>\n\n\n\n<p><strong>Installation de n8n avec Docker Compose :<\/strong> Si vous pr\u00e9f\u00e9rez Docker Compose, cr\u00e9ez un fichier <code>docker-compose.yml<\/code> incluant un service pour n8n. N\u2019oubliez pas d\u2019y indiquer les variables d\u2019environnement n\u00e9cessaires (par exemple pour activer les Community Nodes). Voici un extrait minimal :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  n8n:\n    image: n8nio\/n8n:latest\n    container_name: n8n\n    restart: unless-stopped\n    ports:\n      - \"5678:5678\"\n    environment:\n      - N8N_COMMUNITY_PACKAGES_ENABLED=true\n      # ... (autres variables si besoin)\n    volumes:\n      - ~\/.n8n:\/home\/node\/.n8n\n<\/code><\/pre>\n\n\n\n<p>Une fois votre compose pr\u00eat, lancez <code>docker-compose up -d<\/code> pour d\u00e9marrer n8n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ajout de Puppeteer pour le n\u0153ud YouTube Transcript<\/h2>\n\n\n\n<p>Le premier cas d\u2019usage (transcription YouTube) n\u00e9cessite un composant suppl\u00e9mentaire : <strong>Puppeteer<\/strong>. En effet, le n\u0153ud communautaire <em>YouTube Transcript<\/em> utilise Puppeteer (un navigateur headless automatis\u00e9) pour r\u00e9cup\u00e9rer le texte des vid\u00e9os. Pour que ce n\u0153ud fonctionne, il faut que Puppeteer soit install\u00e9 et op\u00e9rationnel dans l\u2019environnement n8n.<\/p>\n\n\n\n<p><strong>Pourquoi Puppeteer ?<\/strong> La r\u00e9cup\u00e9ration des sous-titres YouTube sans API officielle implique de <strong>scraper<\/strong> le site YouTube via un navigateur invisible (headless). Puppeteer permet cela en contr\u00f4lant un Chrome\/Chromium en t\u00e2che de fond. Le n\u0153ud <em>YouTube Transcript<\/em> en a besoin pour lancer un navigateur et extraire la transcription via l\u2019interface web (c\u2019est plus fiable que l\u2019API YouTube qui, elle, ne donne les captions que pour vos propres vid\u00e9os).<\/p>\n\n\n\n<p><strong>Installation de Puppeteer dans le conteneur n8n :<\/strong> Il existe deux approches possibles. La premi\u00e8re consiste \u00e0 installer Puppeteer \u201c\u00e0 chaud\u201d dans le conteneur en cours d\u2019ex\u00e9cution, la seconde est de construire une image Docker personnalis\u00e9e incluant Puppeteer. Pour rester simple, d\u00e9taillons la deuxi\u00e8me m\u00e9thode (image custom), mais sachez que la premi\u00e8re m\u00e9thode est possible via <code>docker exec<\/code>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Cr\u00e9er un Dockerfile custom pour n8n :<\/strong> Dans un r\u00e9pertoire, cr\u00e9ez un fichier <code>Dockerfile<\/code> avec le contenu suivant\u00a0: <code>FROM n8nio\/n8n:latest USER root # Installer Chromium + d\u00e9pendances Puppeteer RUN apk add --no-cache udev chromium harfbuzz \"freetype@edge\" \"nss@edge\" \\ &amp;&amp; npm install -g puppeteer USER node<\/code> Explication : on part de l\u2019image n8n officielle, on passe en root pour installer des paquets. On ajoute Chromium (navigateur headless) et quelques librairies n\u00e9cessaires (fonts, etc.), puis on installe Puppeteer via npm. La variable <code>PUPPETEER_SKIP_CHROMIUM_DOWNLOAD<\/code> est ici optionnelle car nous installons nous-m\u00eames Chromium. <em>(Note: l\u2019image n8n est bas\u00e9e sur Alpine Linux, d\u2019o\u00f9 l\u2019utilisation de <code>apk<\/code>.)<\/em><\/li>\n\n\n\n<li><strong>Construire l\u2019image :<\/strong> ex\u00e9cutez <code>docker build -t n8n-puppeteer .<\/code> dans le dossier contenant le Dockerfile. Docker t\u00e9l\u00e9charge tout ce qu\u2019il faut et cr\u00e9e une image locale nomm\u00e9e <em>n8n-puppeteer<\/em>.<\/li>\n\n\n\n<li><strong>Lancer n8n avec l\u2019image custom :<\/strong> utilisez <code>docker run<\/code> (ou compose) en sp\u00e9cifiant <code>image: n8n-puppeteer<\/code>. Par exemple : <code>docker run -d --name n8n -p 5678:5678 -v ~\/.n8n:\/home\/node\/.n8n n8n-puppeteer<\/code> Cette instance de n8n inclut d\u00e9sormais Puppeteer et un Chrome headless pr\u00eat \u00e0 l\u2019emploi.<\/li>\n<\/ol>\n\n\n\n<p>\ud83d\udca1 <em>Astuce :<\/em> si vous avez d\u00e9j\u00e0 un conteneur n8n en route et pr\u00e9f\u00e9rez ne pas reconstruire d\u2019image, vous pouvez <strong>installer Puppeteer \u00e0 la vol\u00e9e<\/strong>. Faites : <code>docker exec -it -u root n8n apk add ... chromium... &amp;&amp; npm install -g puppeteer<\/code> comme indiqu\u00e9 dans la documentation du node. N\u2019oubliez pas de d\u00e9finir <code>PUPPETEER_EXECUTABLE_PATH=\/usr\/bin\/chromium-browser<\/code> dans l\u2019environnement du conteneur pour que Puppeteer utilise le bon binaire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation du n\u0153ud communautaire <em>YouTube Transcript<\/em><\/h2>\n\n\n\n<p>Maintenant que Puppeteer est en place, installons le n\u0153ud <em>YouTube Transcript<\/em>. Depuis l\u2019interface n8n (<a href=\"http:\/\/localhost:5678\/\">http:\/\/localhost:5678<\/a>), rendez-vous dans le menu <strong>Community Nodes<\/strong>. Recherchez \u201c<strong>youtube-transcript<\/strong>\u201d \u2013 vous devriez trouver le paquet <strong>n8n-nodes-youtube-transcript<\/strong>. Cliquez sur <strong>Installer<\/strong>. (Si on vous demande d\u2019autoriser les n\u0153uds non v\u00e9rifi\u00e9s, acceptez \u2013 ce paquet peut \u00eatre non v\u00e9rifi\u00e9 au moment de l\u2019\u00e9criture.) Une fois install\u00e9, n8n red\u00e9marre pour charger le nouveau n\u0153ud.<\/p>\n\n\n\n<p><em>Exemple d\u2019\u00e9cran de configuration d\u2019un PhantomBuster pour LinkedIn. Ici, le phantom LinkedIn Activity Extractor est configur\u00e9 pour extraire les posts d\u2019un profil donn\u00e9. Nous utiliserons ce Phantom via n8n pour r\u00e9cup\u00e9rer automatiquement les publications LinkedIn.<\/em><\/p>\n\n\n\n<p>Lorsque n8n revient en ligne, vous trouverez dans la liste des n\u0153uds disponibles un nouveau n\u0153ud <strong>YouTube Transcript<\/strong> \ud83c\udf89. Nous sommes pr\u00eats \u00e0 construire notre workflow de veille !<\/p>\n\n\n\n<p><em>(NB: \u00c0 ce stade, notre environnement n8n est \u00e9quip\u00e9 pour les t\u00e2ches \u00e0 venir. Pour r\u00e9capituler, nous avons : n8n tournant dans Docker, les Community Nodes activ\u00e9s, Puppeteer install\u00e9, et le node YouTube Transcript disponible.)<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration de PostgreSQL et PGAdmin<\/h2>\n\n\n\n<p>Avant de plonger dans les workflows, configurons la base de donn\u00e9es qui stockera nos r\u00e9sum\u00e9s. Nous utiliserons <strong>PostgreSQL<\/strong>, un SGBD open-source robuste, pour conserver les informations extraites (r\u00e9sum\u00e9s de vid\u00e9os et de posts). Si vous n\u2019avez pas d\u00e9j\u00e0 PostgreSQL d\u2019install\u00e9, le plus simple est de le lancer aussi via Docker.<\/p>\n\n\n\n<p><strong>Lancer un conteneur PostgreSQL :<\/strong> Ex\u00e9cutez par exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 postgres:15\n<\/code><\/pre>\n\n\n\n<p>Cela d\u00e9ploie PostgreSQL version 15, avec le mot de passe <strong>mysecretpassword<\/strong> pour l\u2019utilisateur par d\u00e9faut <code>postgres<\/code>, et expose le port 5432. Bien s\u00fbr, adaptez le mot de passe et autres param\u00e8tres selon vos besoins (vous pouvez aussi cr\u00e9er un utilisateur\/db sp\u00e9cifique).<\/p>\n\n\n\n<p><strong>PGAdmin (optionnel) :<\/strong> Pour g\u00e9rer visuellement la base, vous pouvez utiliser PGAdmin, l\u2019interface web officielle de PostgreSQL. Un moyen rapide :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name pgadmin -e PGADMIN_DEFAULT_EMAIL=user@domain.com -e PGADMIN_DEFAULT_PASSWORD=admin -p 8080:80 dpage\/pgadmin4\n<\/code><\/pre>\n\n\n\n<p>Acc\u00e9dez-y sur <a href=\"http:\/\/localhost:8080\/\">http:\/\/localhost:8080<\/a>, connectez-vous avec <code>user@domain.com<\/code>\/<code>admin<\/code>, puis ajoutez un nouveau serveur pointant sur votre conteneur postgres (host&nbsp;: <code>host.docker.internal<\/code> sur Windows\/Mac ou l\u2019IP du conteneur sur Linux, port&nbsp;5432, user&nbsp;: <code>postgres<\/code>, mot de passe celui d\u00e9fini). Vous pourrez ainsi visualiser les tables, lancer des requ\u00eates, etc.<\/p>\n\n\n\n<p><strong>Cr\u00e9ation des tables :<\/strong> Pour notre usage, nous pouvons cr\u00e9er deux tables : <code>videosummaries<\/code> pour les r\u00e9sum\u00e9s YouTube et <code>linkedin_posts<\/code> pour les posts LinkedIn. Par exemple, via PGAdmin ou psql :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE videosummaries (\n    video_id TEXT PRIMARY KEY,\n    title TEXT,\n    summary TEXT,\n    published_at TIMESTAMP\n);\nCREATE TABLE linkedin_posts (\n    post_id TEXT PRIMARY KEY,\n    author TEXT,\n    content TEXT,\n    summary TEXT,\n    posted_at TIMESTAMP\n);\n<\/code><\/pre>\n\n\n\n<p>Ces sch\u00e9mas simples stockent un identifiant unique (l\u2019ID de la vid\u00e9o YouTube ou du post LinkedIn) en cl\u00e9 primaire, le titre ou contenu original, le r\u00e9sum\u00e9 g\u00e9n\u00e9r\u00e9, et une date. On pourra enrichir selon les besoins (par ex, URL de la vid\u00e9o, lien du post, etc.).<\/p>\n\n\n\n<p>\ud83d\udca1 <strong>Bonnes pratiques PostgreSQL :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cl\u00e9s primaires uniques :<\/strong> En utilisant les IDs naturels des contenus comme cl\u00e9, on \u00e9vite les doublons. Ainsi, si un workflow tente d\u2019ins\u00e9rer un r\u00e9sum\u00e9 d\u00e9j\u00e0 existant, on aura soit une erreur (qu\u2019il faudra g\u00e9rer) soit on choisira de mettre \u00e0 jour l\u2019enregistrement existant.<\/li>\n\n\n\n<li><strong>Requ\u00eates param\u00e9tr\u00e9es ou n\u0153ud d\u00e9di\u00e9 :<\/strong> n8n propose un n\u0153ud <strong>Postgres<\/strong> permettant d\u2019ins\u00e9rer, mettre \u00e0 jour ou requ\u00eater sans \u00e9crire du SQL brut. Vous pouvez l\u2019utiliser en configurant un <strong>Credentials<\/strong> PostgreSQL (h\u00f4te, user, mdp, base).<\/li>\n\n\n\n<li><strong>V\u00e9rifier avant insertion :<\/strong> Il est souvent utile de v\u00e9rifier si la donn\u00e9e existe d\u00e9j\u00e0 (par exemple via un SELECT) avant d\u2019ins\u00e9rer, ou d\u2019utiliser une requ\u00eate <code>INSERT ... ON CONFLICT ... UPDATE<\/code> en SQL. Nous montrerons comment g\u00e9rer cela dans le workflow.<\/li>\n<\/ul>\n\n\n\n<p>Enfin, ajoutez dans n8n un <strong>Credential<\/strong> de type <strong>Postgres<\/strong> pour que n8n puisse se connecter \u00e0 la base. Indiquez l\u2019h\u00f4te (probablement <code>host.docker.internal<\/code> si n8n est en Docker et Postgres sur l\u2019h\u00f4te ou un autre conteneur du m\u00eame compose), le port 5432, l\u2019utilisateur (<code>postgres<\/code>), le mot de passe et la base (<code>postgres<\/code> par d\u00e9faut).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Utilisation d\u2019un mod\u00e8le d\u2019IA local (Oyama) vs OpenAI<\/h2>\n\n\n\n<p>Pour la g\u00e9n\u00e9ration de r\u00e9sum\u00e9s, nous avons deux options : utiliser un <strong>mod\u00e8le d\u2019IA local<\/strong> ou faire appel \u00e0 l\u2019<strong>API OpenAI<\/strong> dans le cloud. L\u2019option locale offre plus de confidentialit\u00e9 (et pas de co\u00fbt par requ\u00eate), tandis que l\u2019API OpenAI peut \u00eatre plus simple \u00e0 configurer si vous avez une cl\u00e9 API.<\/p>\n\n\n\n<p><strong>Oyama (mod\u00e8le IA local) :<\/strong> Oyama est un agent IA local bas\u00e9 sur Ollama, permettant de faire tourner des mod\u00e8les de langage open-source chez vous. Supposons que vous ayez un mod\u00e8le local pr\u00eat (par ex. un conteneur <strong>LocalAI<\/strong> ou <strong>Ollama<\/strong> en cours d\u2019ex\u00e9cution sur votre machine, qui expose une API compatible OpenAI). Dans ce cas, n8n peut y acc\u00e9der.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Exemple de configuration :<\/strong> Si n8n tourne en Docker et votre serveur AI local \u00e9coute sur le port 8000 de votre machine, vous pouvez configurer n8n pour utiliser ce point de terminaison au lieu de api.openai.com. Dans les credentials OpenAI de n8n, il suffit de sp\u00e9cifier l\u2019URL de base de l\u2019API locale. Par exemple, on peut d\u00e9finir la variable d\u2019environnement <code>OPENAI_API_BASE_URL=http:\/\/host.docker.internal:8000\/v1<\/code> (o\u00f9 <code>host.docker.internal<\/code> permet au conteneur Docker d\u2019atteindre l\u2019h\u00f4te). Ainsi, les appels du n\u0153ud OpenAI seront redirig\u00e9s vers votre mod\u00e8le local. Un utilisateur t\u00e9moigne par exemple avoir utilis\u00e9 l\u2019URL <code>http:\/\/host.docker.internal:1234\/v1<\/code> dans la config OpenAI de n8n pour se connecter \u00e0 <strong>LM Studio<\/strong> local, en mettant une cl\u00e9 factice.<\/li>\n\n\n\n<li><strong>V\u00e9rification :<\/strong> Assurez-vous que votre service local accepte les appels au format OpenAI. Beaucoup de solutions (Ollama, LocalAI, text-gen-webui API\u2026) exposent des endpoints <code>\/v1\/completions<\/code> ou <code>\/v1\/chat\/completions<\/code>. Testez hors n8n avec curl pour confirmer la communication. Vous pourriez avoir besoin d\u2019autoriser le conteneur \u00e0 contacter l\u2019h\u00f4te (sur Linux, peut-\u00eatre utiliser <code>--add-host=host.docker.internal:host-gateway<\/code> lors du run Docker, bien que l\u2019IP fixe 172.17.0.1 fonctionne aussi).<\/li>\n<\/ul>\n\n\n\n<p><strong>OpenAI (cloud) :<\/strong> Si vous optez pour l\u2019API OpenAI officielle, cr\u00e9ez une cl\u00e9 API sur <a href=\"https:\/\/platform.openai.com\/\">OpenAI dashboard<\/a>. Ajoutez un credential <strong>OpenAI<\/strong> dans n8n avec cette cl\u00e9. Vous pourrez alors utiliser le n\u0153ud <strong>OpenAI<\/strong> ou <strong>OpenAI Chat<\/strong> en choisissant un mod\u00e8le (par ex GPT-3.5-turbo) pour g\u00e9n\u00e9rer les r\u00e9sum\u00e9s.<\/p>\n\n\n\n<p>Dans la suite, pour simplicit\u00e9, nous utiliserons majoritairement l\u2019API OpenAI <strong>cloud<\/strong> dans les exemples de n\u0153uds (c\u2019est plus direct pour un d\u00e9butant). Sachez toutefois que vous pouvez remplacer ces n\u0153uds par des appels \u00e0 votre mod\u00e8le local Oyama en configurant comme expliqu\u00e9 ci-dessus.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cas d\u2019usage 1&nbsp;: Veille YouTube automatis\u00e9e<\/h2>\n\n\n\n<p>Passons \u00e0 la pratique avec le premier workflow. L\u2019objectif : surveiller une cha\u00eene YouTube et obtenir automatiquement le r\u00e9sum\u00e9 des nouvelles vid\u00e9os publi\u00e9es. Ce workflow s\u2019ex\u00e9cutera r\u00e9guli\u00e8rement (par exemple tous les jours) et suivra ces \u00e9tapes :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Lecture du flux RSS YouTube<\/strong> de la cha\u00eene pour lister les nouvelles vid\u00e9os.<\/li>\n\n\n\n<li><strong>Extraction de la transcription<\/strong> de chaque nouvelle vid\u00e9o, via le n\u0153ud <em>YouTube Transcript<\/em>.<\/li>\n\n\n\n<li><strong>G\u00e9n\u00e9ration d\u2019un r\u00e9sum\u00e9<\/strong> de la transcription, \u00e0 l\u2019aide d\u2019un mod\u00e8le IA (OpenAI ou local).<\/li>\n\n\n\n<li><strong>Enregistrement du r\u00e9sum\u00e9<\/strong> dans PostgreSQL, en \u00e9vitant les doublons.<\/li>\n\n\n\n<li>R\u00e9p\u00e9ter pour chaque vid\u00e9o r\u00e9cente non encore trait\u00e9e.<\/li>\n<\/ol>\n\n\n\n<p>Voici \u00e0 quoi ressemble le workflow complet dans n8n :<\/p>\n\n\n\n<p><em>Capture d\u2019\u00e9cran d\u2019un workflow n8n (illustratif) combinant plusieurs n\u0153uds pour automatiser un processus. Dans notre cas, un flux RSS est lu, puis les donn\u00e9es sont transform\u00e9es et envoy\u00e9es vers OpenAI et PostgreSQL. Le sch\u00e9ma g\u00e9n\u00e9ral sera similaire, avec des n\u0153uds pour RSS \u2192 Transcript \u2192 IA \u2192 PostgreSQL.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Flux RSS d\u2019une cha\u00eene YouTube<\/h3>\n\n\n\n<p>YouTube fournit un flux RSS pour chaque cha\u00eene. Il suffit de conna\u00eetre l\u2019ID de la cha\u00eene ou son <strong>handle<\/strong>. Par exemple, le flux d\u2019une cha\u00eene s\u2019obtient via l\u2019URL :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;www.youtube.com\/feeds\/videos.xml?channel_id=&lt;ID_DE_LA_CHaINE&gt;\n<\/code><\/pre>\n\n\n\n<p>ou si la cha\u00eene a un nom d\u2019utilisateur personnalis\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;www.youtube.com\/feeds\/videos.xml?user=&lt;NOM_UTILISATEUR&gt;\n<\/code><\/pre>\n\n\n\n<p>Trouvez l\u2019ID de la cha\u00eene en question (vous pouvez l\u2019extraire de l\u2019URL de la cha\u00eene YouTube). Dans n8n, ajoutez un n\u0153ud <strong>RSS Read<\/strong>. Configurez-le ainsi :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>URL<\/strong> : l\u2019adresse du flux RSS de la cha\u00eene.<\/li>\n\n\n\n<li><strong>Options<\/strong> : vous pouvez limiter le nombre d\u2019items retourn\u00e9s ou filtrer par date, mais par d\u00e9faut il prendra les derni\u00e8res vid\u00e9os.<\/li>\n<\/ul>\n\n\n\n<p>Exemple : pour la cha\u00eene n8n (handle <code>@n8n<\/code>), l\u2019ID est <code>UCJlkBMeKq33ujmnZsEnZMJQ<\/code> et le flux est <code>https:\/\/www.youtube.com\/feeds\/videos.xml?channel_id=UCJlkBMeKq33ujmnZsEnZMJQ<\/code>. En sortie, le n\u0153ud <em>RSS Read<\/em> fournira une liste d\u2019items (chaque item repr\u00e9sentant une vid\u00e9o, avec titre, lien, date, etc.).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Filtrer les nouvelles vid\u00e9os<\/h3>\n\n\n\n<p>Le flux RSS contient g\u00e9n\u00e9ralement les derni\u00e8res vid\u00e9os, m\u00eame celles d\u00e9j\u00e0 vues pr\u00e9c\u00e9demment. Pour \u00e9viter de retraiter des vid\u00e9os anciennes, on va filtrer les items pour ne garder que celles publi\u00e9es depuis notre derni\u00e8re ex\u00e9cution. Plusieurs approches :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Utiliser un n\u0153ud <strong>IF<\/strong> ou <strong>Filter<\/strong> sur la date de publication (champ <code>pubDate<\/code> de l\u2019item) par rapport \u00e0 la date actuelle moins X temps.<\/li>\n\n\n\n<li>Ou bien comparer la liste des IDs de vid\u00e9os avec celles d\u00e9j\u00e0 en base de donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<p>Pour simplicit\u00e9, supposons qu\u2019on ex\u00e9cute le workflow assez fr\u00e9quemment et qu\u2019on traite toutes les vid\u00e9os du flux mais qu\u2019on <strong>emp\u00eache les doublons en base<\/strong>. Ainsi, m\u00eame si on revoit une vid\u00e9o ancienne, la tentative d\u2019insertion en DB \u00e9chouera (car l\u2019ID existe) ou sera ignor\u00e9e via un UPSERT. Nous reviendrons sur ce point en \u00e9tape 4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Extraction de la transcription YouTube<\/h3>\n\n\n\n<p>Pour chaque vid\u00e9o \u00e0 traiter, on a besoin de son <strong>ID YouTube<\/strong> (le flux RSS fournit g\u00e9n\u00e9ralement le lien complet de la vid\u00e9o). On peut extraire l\u2019ID \u00e0 l\u2019aide d\u2019un n\u0153ud <strong>Function<\/strong> (code) ou <strong>Set<\/strong> avec une expression. Par exemple, si le lien est <code>https:\/\/www.youtube.com\/watch?v=XyzAbc123<\/code>, l\u2019ID est la portion apr\u00e8s <code>?v=<\/code>. Un petit code JavaScript dans un n\u0153ud <em>Function<\/em> peut faire \u00e7a :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const url = item.json.link;              \/\/ lien de la vid\u00e9o\nconst idMatch = url.match(\/v=(&#91;^&amp;]+)\/);\nitem.json.videoId = idMatch ? idMatch&#91;1] : url;\nreturn item;\n<\/code><\/pre>\n\n\n\n<p>Ce code ajoute un champ <code>videoId<\/code> contenant l\u2019identifiant pur. (Il est aussi possible que le flux RSS contienne directement un champ <code>yt:videoId<\/code> \u2013 v\u00e9rifiez la structure dans <em>RSS Read<\/em>).<\/p>\n\n\n\n<p>On encha\u00eene ensuite avec le n\u0153ud <strong>YouTube Transcript<\/strong>. D\u00e9posez-le dans le workflow et connectez-le. Dans ses propri\u00e9t\u00e9s, entrez le <strong>Video ID<\/strong> soit en dur pour un test, soit via une expression qui pointe vers <code>$json[\"videoId\"]<\/code> provenant du n\u0153ud pr\u00e9c\u00e9dent. Ce n\u0153ud va alors lancer Puppeteer en arri\u00e8re-plan pour ouvrir la page YouTube et r\u00e9cup\u00e9rer la transcription compl\u00e8te de la vid\u00e9o (en g\u00e9n\u00e9ral la transcription auto-g\u00e9n\u00e9r\u00e9e ou fournie, en anglais ou langue originale).<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Note:<\/strong> Le n\u0153ud <em>YouTube Transcript<\/em> retourne le texte complet des sous-titres de la vid\u00e9o, g\u00e9n\u00e9ralement sous forme d\u2019un champ <code>transcript<\/code>. Selon la longueur de la vid\u00e9o, cela peut \u00eatre volumineux (plusieurs milliers de caract\u00e8res).<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">4. G\u00e9n\u00e9ration d\u2019un r\u00e9sum\u00e9 avec l\u2019IA<\/h3>\n\n\n\n<p>Nous voici avec la transcription brute de la vid\u00e9o. Il s\u2019agit souvent d\u2019un texte assez long, qu\u2019il faut synth\u00e9tiser. C\u2019est l\u00e0 qu\u2019intervient l\u2019IA. Nous allons utiliser un n\u0153ud <strong>OpenAI<\/strong> (ou <strong>OpenAI Chat<\/strong>) pour produire un r\u00e9sum\u00e9 concis.<\/p>\n\n\n\n<p>Ajoutez un n\u0153ud <strong>OpenAI<\/strong> et connectez-le apr\u00e8s le transcript. S\u00e9lectionnez vos credentials OpenAI (configur\u00e9s plus t\u00f4t avec la cl\u00e9 API, ou pointant vers Oyama en local). Choisissez l\u2019op\u00e9ration <strong>\u201cChat Completion\u201d<\/strong> (pour utiliser un mod\u00e8le type GPT-3.5 turbo) avec un r\u00f4le <em>system<\/em> qui donnera l\u2019instruction de r\u00e9sum\u00e9, et le contenu du transcript en message <em>user<\/em>. Par exemple&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>System message : <em>\u201cTu es un assistant qui r\u00e9sume des vid\u00e9os YouTube. Fournis un r\u00e9sum\u00e9 court et clair du contenu de la vid\u00e9o.\u201d<\/em><\/li>\n\n\n\n<li>User message : ins\u00e9rez l\u2019expression <code>{{$json[\"transcript\"]}}<\/code> pour passer la transcription r\u00e9cup\u00e9r\u00e9e.<\/li>\n<\/ul>\n\n\n\n<p>Si vous utilisez un n\u0153ud OpenAI <strong>\u201cCompletion\u201d<\/strong> classique, vous pouvez simplement fournir un <em>prompt<\/em> combin\u00e9 du style : <em>\u201cR\u00e9sume le texte suivant : {{ $json[\u00ab\u00a0transcript\u00a0\u00bb] }}\u201d<\/em>. Assurez-vous de bien injecter le texte via les expressions n8n (le petit bouton FX permet d\u2019ins\u00e9rer des variables depuis les n\u0153uds pr\u00e9c\u00e9dents).<\/p>\n\n\n\n<p>Lorsque vous ex\u00e9cuterez ce n\u0153ud, l\u2019IA va g\u00e9n\u00e9rer un r\u00e9sum\u00e9 en fran\u00e7ais (vous pouvez pr\u00e9ciser la langue si besoin dans le prompt). Le r\u00e9sultat appara\u00eetra typiquement dans un champ <code>completion<\/code> ou <code>message<\/code> selon le n\u0153ud utilis\u00e9. On peut renommer ce champ en <code>summary<\/code> via un n\u0153ud <strong>Set<\/strong> par la suite pour uniformiser.<\/p>\n\n\n\n<p>\u26a0\ufe0f <em>Conseil :<\/em> Surveillez la longueur de la transcription envoy\u00e9e \u00e0 OpenAI. La limite de tokens de GPT-3.5 est autour de 4096 tokens. Si vos vid\u00e9os sont tr\u00e8s longues, envisagez de tronquer ou segmenter le transcript (ou d\u2019utiliser un mod\u00e8le local plus costaud en contexte). Pour notre cas, on assumera que \u00e7a tient.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Stockage du r\u00e9sum\u00e9 dans PostgreSQL<\/h3>\n\n\n\n<p>Enfin, nous stockons le r\u00e9sum\u00e9 g\u00e9n\u00e9r\u00e9 dans la base de donn\u00e9es. Utilisez un n\u0153ud <strong>Postgres<\/strong> (op\u00e9ration <strong>Insert<\/strong>) connect\u00e9 apr\u00e8s l\u2019OpenAI. S\u00e9lectionnez le credential PostgreSQL configur\u00e9. Renseignez la table cible, par exemple <code>videosummaries<\/code>. Mappez les colonnes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>video_id<\/code> = l\u2019ID de la vid\u00e9o (depuis <code>$json[\"videoId\"]<\/code> qu\u2019on a d\u00e9fini plus haut),<\/li>\n\n\n\n<li><code>title<\/code> = le titre de la vid\u00e9o (<code>$json[\"title\"]<\/code> provenant du RSS),<\/li>\n\n\n\n<li><code>summary<\/code> = le r\u00e9sum\u00e9 g\u00e9n\u00e9r\u00e9 (<code>$json[\"summary\"]<\/code> provenant du n\u0153ud OpenAI\/Set),<\/li>\n\n\n\n<li><code>published_at<\/code> = la date de publication (<code>$json[\"pubDate\"]<\/code> du RSS, qu\u2019il faudra peut-\u00eatre convertir en timestamp).<\/li>\n<\/ul>\n\n\n\n<p>Le n\u0153ud va ins\u00e9rer une ligne en base. Si la vid\u00e9o \u00e9tait d\u00e9j\u00e0 pr\u00e9sente, deux cas : soit le n\u0153ud <em>Postgres Insert<\/em> retournera une erreur de contrainte (dans ce cas, on peut cocher \u201c<strong>Continue on Fail<\/strong>\u201d pour \u00e9viter d\u2019arr\u00eater tout le workflow), soit on peut opter pour une autre strat\u00e9gie. <strong>Bonne pratique<\/strong> : utiliser l\u2019op\u00e9ration <strong>Execute Query<\/strong> du n\u0153ud Postgres pour faire un <em>UPSERT<\/em>. Par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO videosummaries(video_id, title, summary, published_at)\nVALUES($1, $2, $3, $4)\nON CONFLICT (video_id) DO UPDATE \n    SET title=EXCLUDED.title, summary=EXCLUDED.summary, published_at=EXCLUDED.published_at;\n<\/code><\/pre>\n\n\n\n<p>On passerait alors les 4 valeurs via la propri\u00e9t\u00e9 <em>Query Parameters<\/em>. Cela ins\u00e9rera ou mettra \u00e0 jour en un seul appel. Pour un d\u00e9butant, cette approche est un peu plus avanc\u00e9e, donc on peut s\u2019en tenir \u00e0 l\u2019utilisation du n\u0153ud Insert simple et \u00e0 la gestion \u201ccontinue on error\u201d pour ne pas planter s\u2019il y a doublon.<\/p>\n\n\n\n<p>\u00c0 ce stade, le workflow YouTube est complet. On peut l\u2019am\u00e9liorer en ajoutant un <strong>n\u0153ud de d\u00e9clenchement planifi\u00e9<\/strong> (par ex. un n\u0153ud <strong>Cron<\/strong> configur\u00e9 chaque jour \u00e0 8h) connect\u00e9 tout au d\u00e9but, de fa\u00e7on \u00e0 automatiser son ex\u00e9cution quotidienne sans intervention. Activez le workflow dans n8n, et votre veille YouTube fonctionne en autonomie \ud83c\udf89. Chaque nouvelle vid\u00e9o publi\u00e9e sur la cha\u00eene sera transcrite et r\u00e9sum\u00e9e dans la foul\u00e9e.<\/p>\n\n\n\n<p><em>(Vous pouvez v\u00e9rifier dans PGAdmin que les nouvelles entr\u00e9es apparaissent bien dans la table <code>videosummaries<\/code> apr\u00e8s chaque ex\u00e9cution.)<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cas d\u2019usage 2&nbsp;: Veille LinkedIn automatis\u00e9e<\/h2>\n\n\n\n<p>Abordons maintenant le deuxi\u00e8me cas d\u2019usage : la veille de contenu sur LinkedIn. Imaginons que vous souhaitiez suivre un influenceur ou leader d\u2019opinion qui publie r\u00e9guli\u00e8rement sur LinkedIn, et automatiser la r\u00e9cup\u00e9ration de ses posts avec des r\u00e9sum\u00e9s. Directement, l\u2019API LinkedIn ne permet pas facilement d\u2019extraire les posts d\u2019un utilisateur tiers. C\u2019est l\u00e0 qu\u2019intervient <strong>PhantomBuster<\/strong>, un service en ligne sp\u00e9cialis\u00e9 dans le scraping automatis\u00e9 de plateformes web (LinkedIn, Twitter, Instagram, etc.) sans avoir \u00e0 coder de scraper vous-m\u00eame.<\/p>\n\n\n\n<p>Notre plan de workflow :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Utiliser PhantomBuster pour <strong>r\u00e9cup\u00e9rer les derniers posts<\/strong> d\u2019un profil LinkedIn donn\u00e9.<\/li>\n\n\n\n<li><strong>Extraire le contenu<\/strong> de chaque post (texte, date, liens\u2026).<\/li>\n\n\n\n<li><strong>G\u00e9n\u00e9rer un r\u00e9sum\u00e9<\/strong> pour chaque post via l\u2019IA locale (Oyama) \u2013 ou OpenAI selon config.<\/li>\n\n\n\n<li><strong>Enregistrer<\/strong> chaque r\u00e9sum\u00e9 de post dans PostgreSQL (<code>linkedin_posts<\/code> table).<\/li>\n\n\n\n<li>Faire une <strong>synth\u00e8se globale<\/strong> de l\u2019ensemble des posts r\u00e9cents via OpenAI, \u00e0 partir des donn\u00e9es stock\u00e9es (par exemple pour d\u00e9gager les grandes id\u00e9es de la semaine).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">1. Configuration de PhantomBuster pour LinkedIn<\/h3>\n\n\n\n<p><strong>Cr\u00e9er un compte PhantomBuster :<\/strong> Rendez-vous sur phantombuster.com et inscrivez-vous (il y a un essai gratuit). Une fois connect\u00e9, vous aurez acc\u00e8s \u00e0 divers <em>Phantoms<\/em> (scripts pr\u00e9\u00e9tablis pour diff\u00e9rentes t\u00e2ches). Pour notre besoin, utilisez le Phantom appel\u00e9 <strong>LinkedIn Activity Extractor<\/strong> (ou un similaire) qui <strong>extrait les activit\u00e9s r\u00e9centes d\u2019un profil LinkedIn<\/strong>. Ce Phantom va parcourir la page d\u2019activit\u00e9 publique d\u2019une personne et r\u00e9cup\u00e9rer les posts qu\u2019elle a publi\u00e9s (texte des posts, nombre de likes\/commentaires, etc.).<\/p>\n\n\n\n<p><strong>Configurer le Phantom :<\/strong> Dans PhantomBuster, cr\u00e9ez une instance du LinkedIn Activity Extractor. On vous demandera :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L\u2019URL du profil LinkedIn cible (par ex. <em><a href=\"https:\/\/www.linkedin.com\/in\/nomutilisateur\/\">https:\/\/www.linkedin.com\/in\/nomutilisateur\/<\/a><\/em>).<\/li>\n\n\n\n<li>Votre cookie de session LinkedIn (pour autoriser PhantomBuster \u00e0 acc\u00e9der aux donn\u00e9es \u2013 PhantomBuster fournit un outil pour r\u00e9cup\u00e9rer automatiquement ce cookie depuis votre navigateur).<\/li>\n\n\n\n<li>D\u2019\u00e9ventuels autres param\u00e8tres (comme le nombre de posts \u00e0 r\u00e9cup\u00e9rer, etc.).<\/li>\n<\/ul>\n\n\n\n<p>Enregistrez\/configurez le Phantom. Vous pouvez le tester une fois manuellement sur PhantomBuster pour voir s\u2019il parvient \u00e0 lister les posts (il g\u00e9n\u00e8re g\u00e9n\u00e9ralement un fichier JSON ou CSV en r\u00e9sultat, consultable dans l\u2019interface PhantomBuster).<\/p>\n\n\n\n<p><strong>Obtenir l\u2019API Key PhantomBuster :<\/strong> Pour piloter PhantomBuster via n8n, il nous faut une cl\u00e9 API. Sur votre compte PhantomBuster, allez dans <strong>Settings &gt; API Key<\/strong> (ou <em>Workspace settings &gt; Third party API keys<\/em>) et g\u00e9n\u00e9rez une cl\u00e9 si ce n\u2019est pas d\u00e9j\u00e0 fait. Copiez cette cl\u00e9.<\/p>\n\n\n\n<p><strong>Credentials PhantomBuster dans n8n :<\/strong> Dans n8n, ajoutez un credential de type <strong>PhantomBuster<\/strong>. Collez la cl\u00e9 API. N8n utilisera cette cl\u00e9 pour s\u2019authentifier aupr\u00e8s de l\u2019API PhantomBuster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. R\u00e9cup\u00e9ration des posts LinkedIn via n8n<\/h3>\n\n\n\n<p>Avec le Phantom configur\u00e9 et la cl\u00e9 API pr\u00eate, on peut interagir depuis n8n gr\u00e2ce au n\u0153ud <strong>PhantomBuster<\/strong> (ce n\u0153ud fait partie des int\u00e9grations natives depuis les derni\u00e8res versions de n8n).<\/p>\n\n\n\n<p>Ajoutez un n\u0153ud <strong>PhantomBuster<\/strong> dans le workflow. Param\u00e9trez-le ainsi :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Resource<\/strong> : <em>Agent<\/em> (car les phantoms sont appel\u00e9s \u00ab\u00a0agents\u00a0\u00bb dans l\u2019API PB).<\/li>\n\n\n\n<li><strong>Operation<\/strong> : <em>Launch<\/em> (pour lancer l\u2019agent).<\/li>\n\n\n\n<li><strong>Agent ID<\/strong> : l\u2019identifiant du Phantom LinkedIn Activity Extractor que vous avez configur\u00e9.<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 <em>Comment trouver l\u2019Agent ID ?<\/em> Dans PhantomBuster, ouvrez votre Phantom. L\u2019URL contient un identifiant num\u00e9rique unique. Par exemple, <code>https:\/\/api.phantombuster.com\/agent\/123456<\/code> (123456 \u00e9tant l\u2019ID). Vous pouvez aussi utiliser l\u2019op\u00e9ration <em>Get all agents<\/em> du n\u0153ud PhantomBuster pour lister vos phantoms et rep\u00e9rer l\u2019ID correspondant.<\/p>\n\n\n\n<p>Une fois l\u2019ID en place, le n\u0153ud PhantomBuster peut lancer l\u2019extraction. Cependant, si votre Phantom requiert un param\u00e8tre <em>sessionCookie<\/em> ou autre que vous n\u2019avez pas enregistr\u00e9 par d\u00e9faut, il faudra le fournir. Dans notre config, on a normalement d\u00e9j\u00e0 stock\u00e9 le cookie dans PhantomBuster lors de la config initiale, donc pas besoin de le renvoyer \u00e0 chaque appel. (\u00c0 noter : s\u2019il fallait passer des arguments dynamiques, on pourrait ajouter des champs suppl\u00e9mentaires dans le n\u0153ud n8n, comme l\u2019indique un post de forum).<\/p>\n\n\n\n<p><strong>Ex\u00e9cution et r\u00e9cup\u00e9ration des r\u00e9sultats :<\/strong> Quand on lance l\u2019agent, PhantomBuster va probablement mettre quelques secondes \u00e0 finir la t\u00e2che. Le n\u0153ud n8n <em>Launch<\/em> ajoute l\u2019agent dans la file de lancement. Pour obtenir les donn\u00e9es une fois l\u2019agent termin\u00e9, on doit appeler l\u2019op\u00e9ration <strong>Get output<\/strong> sur cet agent.<\/p>\n\n\n\n<p>On peut soit encha\u00eener un second n\u0153ud <strong>PhantomBuster<\/strong> (Resource: Agent, Operation: <em>Get output<\/em>, en fournissant le m\u00eame Agent ID). Ce n\u0153ud-l\u00e0 r\u00e9cup\u00e9rera le r\u00e9sultat le plus r\u00e9cent de l\u2019agent, g\u00e9n\u00e9ralement un JSON contenant un tableau des posts. Par exemple, chaque post peut avoir un champ <code>content<\/code> (texte du post), <code>author<\/code>, <code>timestamp<\/code>, etc. L\u2019autre approche est d\u2019utiliser l\u2019option \u201cWait for completion\u201d si disponible dans le n\u0153ud Launch, mais pour clart\u00e9 on va s\u00e9parer en deux n\u0153uds.<\/p>\n\n\n\n<p>Reliez donc un second n\u0153ud PhantomBuster configur\u00e9 en <em>Get output<\/em> juste apr\u00e8s le premier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Traitement des donn\u00e9es des posts<\/h3>\n\n\n\n<p>Le n\u0153ud <em>Get output<\/em> renverra possiblement un objet JSON encapsul\u00e9. Il se peut que le tableau des posts soit dans <code>$json[\"output\"]<\/code> ou un champ du genre. Utilisez le n\u0153ud <strong>Function<\/strong> ou <strong>IF<\/strong> appropri\u00e9 pour isoler le tableau des posts et ensuite <strong>splitter<\/strong> chaque post en item s\u00e9par\u00e9 (n8n a le n\u0153ud <strong>Split In Batches<\/strong> ou on peut manipuler via code). Par simplicit\u00e9, imaginons que <em>Get output<\/em> nous renvoie d\u00e9j\u00e0 plusieurs items (un par post) \u2013 si ce n\u2019est pas le cas, un petit Function qui fait <code>return items[0].json.posts;<\/code> (selon le format exact) suffira \u00e0 obtenir un item par post.<\/p>\n\n\n\n<p>Nous avons maintenant chaque post LinkedIn comme un item dans n8n, contenant par exemple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"content\": \"Texte du post ici...\",\n  \"author\": \"Nom de l'auteur\",\n  \"timestamp\": \"2025-06-01T12:34:56.789Z\",\n  \"postUrl\": \"https:\/\/www.linkedin.com\/posts\/...\",\n  \"id\": \"linkedin-post-id\"\n}\n<\/code><\/pre>\n\n\n\n<p>Les champs varient selon PhantomBuster, mais l\u2019essentiel est qu\u2019on a le texte du post (<code>content<\/code>) que l\u2019on souhaite r\u00e9sumer.<\/p>\n\n\n\n<p>Avant de r\u00e9sumer, on peut effectuer quelques <strong>transformations<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Peut-\u00eatre nettoyer le texte (<code>content<\/code>) pour enlever des emojis ou balises HTML s\u2019il y en a.<\/li>\n\n\n\n<li>On peut aussi concat\u00e9ner le <code>author<\/code> et la date au contenu pour donner du contexte \u00e0 l\u2019IA (mais pas forc\u00e9ment n\u00e9cessaire pour un simple r\u00e9sum\u00e9).<\/li>\n\n\n\n<li>S\u2019assurer que les champs n\u00e9cessaires pour l\u2019insertion en base (like <code>id<\/code>, <code>content<\/code>) sont bien nomm\u00e9s.<\/li>\n<\/ul>\n\n\n\n<p>On peut utiliser un n\u0153ud <strong>Set<\/strong> pour renommer ou s\u00e9lectionner les champs pertinents. Par exemple, renommer <code>id<\/code> en <code>post_id<\/code> pour correspondre \u00e0 notre table, et <code>timestamp<\/code> en <code>posted_at<\/code>. On peut aussi limiter la longueur du contenu si c\u2019est tr\u00e8s long (mais g\u00e9n\u00e9ralement les posts LinkedIn sont de longueur raisonnable).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. R\u00e9sum\u00e9 de chaque post via mod\u00e8le local (Oyama)<\/h3>\n\n\n\n<p>Pour chaque post (chaque item actuellement dans le workflow), on va g\u00e9n\u00e9rer un r\u00e9sum\u00e9. Comme exercice, utilisons ici le <strong>mod\u00e8le local Oyama<\/strong> via un appel API. Supposons qu\u2019on a configur\u00e9 n8n pour pointer l\u2019OpenAI node vers notre instance locale (ou qu\u2019on utilise un n\u0153ud <strong>HTTP Request<\/strong> pour interroger une API locale).<\/p>\n\n\n\n<p><strong>Option 1 : n\u0153ud OpenAI Chat (base URL locale)<\/strong> \u2013 Si vous avez suivi la partie configuration Oyama, vous pouvez r\u00e9utiliser un n\u0153ud OpenAI comme pr\u00e9c\u00e9demment, avec un prompt de r\u00e9sum\u00e9. La seule diff\u00e9rence est que cette fois, l\u2019appel ne partira pas vers les serveurs OpenAI mais vers votre machine (gr\u00e2ce au <code>OPENAI_API_BASE_URL<\/code> red\u00e9fini). Vous pouvez donc proc\u00e9der de la m\u00eame mani\u00e8re que pour les vid\u00e9os : un n\u0153ud OpenAI Chat, system prompt \u201cTu r\u00e9sumes du contenu LinkedIn\u201d, user message avec <code>{{$json[\"content\"]}}<\/code>.<\/p>\n\n\n\n<p><strong>Option 2 : n\u0153ud HTTP Request<\/strong> \u2013 Alternativement, on pourrait utiliser un n\u0153ud HTTP configur\u00e9 sur l\u2019URL de l\u2019API locale (par ex. <code>http:\/\/oyama:8000\/v1\/chat\/completions<\/code>) en envoyant un JSON contenant le prompt. Cette m\u00e9thode est plus technique et d\u00e9pend de l\u2019API pr\u00e9cise de votre mod\u00e8le. Pour un d\u00e9butant, rester dans le cadre du n\u0153ud OpenAI (avec d\u00e9tournement vers local) est plus simple.<\/p>\n\n\n\n<p>Pour l\u2019explication, continuons \u00e0 utiliser le n\u0153ud <strong>OpenAI<\/strong> (disons GPT-3.5) pour sortir un r\u00e9sum\u00e9, sachant que vous pouvez basculer vers local plus tard sans changer la logique.<\/p>\n\n\n\n<p>Comme pr\u00e9c\u00e9demment, le r\u00e9sultat du r\u00e9sum\u00e9 sera captur\u00e9 (on le nommera <code>summary<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Stockage des posts r\u00e9sum\u00e9s dans PostgreSQL<\/h3>\n\n\n\n<p>On reprend un n\u0153ud <strong>Postgres<\/strong> (Insert) pour la table <code>linkedin_posts<\/code>. On y mappe :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>post_id<\/code> = l\u2019ID unique du post (fourni par PhantomBuster, ou on peut utiliser l\u2019URL du post comme identifiant unique).<\/li>\n\n\n\n<li><code>author<\/code> = l\u2019auteur du post,<\/li>\n\n\n\n<li><code>content<\/code> = le texte original du post (on peut le stocker aussi pour r\u00e9f\u00e9rence),<\/li>\n\n\n\n<li><code>summary<\/code> = le r\u00e9sum\u00e9 g\u00e9n\u00e9r\u00e9,<\/li>\n\n\n\n<li><code>posted_at<\/code> = la date du post.<\/li>\n<\/ul>\n\n\n\n<p>Comme pour les vid\u00e9os, on veille \u00e0 \u00e9viter les doublons. La cl\u00e9 primaire <code>post_id<\/code> garantit qu\u2019un m\u00eame post ne sera pas ins\u00e9r\u00e9 deux fois. Si le workflow run tous les jours, les posts r\u00e9cents se chevaucheront peut-\u00eatre, mais l\u2019INSERT \u00e9chouera sur ceux d\u00e9j\u00e0 ins\u00e9r\u00e9s. Cochez \u201cContinue on Fail\u201d ou impl\u00e9mentez un UPSERT (m\u00eame technique que pr\u00e9c\u00e9demment, ON CONFLICT sur post_id DO UPDATE).<\/p>\n\n\n\n<p>A pr\u00e9sent, chaque nouveau post d\u00e9tect\u00e9 est consign\u00e9 en base avec son r\u00e9sum\u00e9. F\u00e9licitations, la veille LinkedIn automatis\u00e9e est en place ! Vous pouvez planifier ce workflow avec un Cron (par ex. toutes les heures ou jours, sachant que PhantomBuster a des limites selon votre plan) pour une surveillance r\u00e9guli\u00e8re.<\/p>\n\n\n\n<p><em>(<strong>Remarque s\u00e9curit\u00e9<\/strong> : respectez les conditions d\u2019utilisation de LinkedIn. Ne d\u00e9passez pas des fr\u00e9quences trop \u00e9lev\u00e9es et ne republiez pas de contenus int\u00e9graux. Notre but ici est une veille personnelle.)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. R\u00e9sum\u00e9 global des id\u00e9es (agr\u00e9gation)<\/h3>\n\n\n\n<p>Derni\u00e8re \u00e9tape bonus : produire un <strong>r\u00e9sum\u00e9 global<\/strong> de l\u2019ensemble des posts r\u00e9cup\u00e9r\u00e9s, afin d\u2019en extraire les id\u00e9es principales. Imaginons que l\u2019influenceur a publi\u00e9 5 posts cette semaine, nous voulons un paragraphe qui synth\u00e9tise <strong>en quoi consistent globalement ses publications r\u00e9centes<\/strong>.<\/p>\n\n\n\n<p>Pour cela, nous allons interroger la base de donn\u00e9es pour r\u00e9cup\u00e9rer soit les r\u00e9sum\u00e9s individuels de chaque post, soit directement le texte des posts. Utiliser les r\u00e9sum\u00e9s d\u00e9j\u00e0 g\u00e9n\u00e9r\u00e9s est plus efficace (moins de volume de texte, et d\u00e9j\u00e0 l\u2019essentiel de chaque post).<\/p>\n\n\n\n<p>Ajoutez un n\u0153ud <strong>Postgres<\/strong> (Select) configur\u00e9 sur la table <code>linkedin_posts<\/code>. On peut par exemple s\u00e9lectionner les posts de la derni\u00e8re semaine :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT summary FROM linkedin_posts\nWHERE posted_at &gt;= NOW() - INTERVAL '7 days';\n<\/code><\/pre>\n\n\n\n<p>(en Query ou via l\u2019interface du n\u0153ud en filtrant, selon les possibilit\u00e9s). Le n\u0153ud retournera plusieurs items (chaque item avec un champ <code>summary<\/code> contenant le r\u00e9sum\u00e9 d\u2019un post).<\/p>\n\n\n\n<p>Pour combiner ces r\u00e9sultats en un seul texte, on peut utiliser un n\u0153ud <strong>Function<\/strong> qui agr\u00e8ge les summaries. Par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const summaries = items.map(item =&gt; item.json.summary);\nconst combinedText = summaries.join(\"\\n\\n\");\nreturn &#91;{ json: { combinedText } }];\n<\/code><\/pre>\n\n\n\n<p>Ainsi on obtient un seul item avec <code>combinedText<\/code> qui contient tous les r\u00e9sum\u00e9s de posts, s\u00e9par\u00e9s par deux sauts de ligne.<\/p>\n\n\n\n<p>Enfin, on envoie ce <em>combinedText<\/em> dans un dernier n\u0153ud <strong>OpenAI<\/strong> (ou Chat). Le prompt pourrait \u00eatre : <em>\u201cVoici plusieurs r\u00e9sum\u00e9s de posts LinkedIn d\u2019un m\u00eame auteur. Fais un r\u00e9sum\u00e9 global qui d\u00e9gage les th\u00e8mes et id\u00e9es principales de l\u2019ensemble.\u201d<\/em> Et on inclut le texte combin\u00e9 en entr\u00e9e. GPT-3.5 ou 4 fera tr\u00e8s bien l\u2019affaire pour synth\u00e9tiser plusieurs paragraphes en un seul.<\/p>\n\n\n\n<p>Le r\u00e9sultat final sera un <strong>r\u00e9sum\u00e9 global de la veille<\/strong>. Vous pouvez par exemple l\u2019envoyer par email ou le poster sur Slack via des n\u0153uds suppl\u00e9mentaires, pour partager la veille avec votre \u00e9quipe. Ici, on se concentre sur la production de ce r\u00e9sum\u00e9 final qui cl\u00f4t le workflow.<\/p>\n\n\n\n<p><em>(\u00c0 noter : si vous souhaitiez aussi inclure les vid\u00e9os YouTube dans ce r\u00e9sum\u00e9 global, vous auriez pu interroger \u00e9galement la table <code>videosummaries<\/code>. Il faudrait alors fusionner les donn\u00e9es des deux tables avant de les envoyer \u00e0 l\u2019IA. C\u2019est une variante possible \u2013 par simplicit\u00e9 nous avons r\u00e9sum\u00e9 globalement que les posts LinkedIn, mais libre \u00e0 vous d\u2019\u00e9largir.)<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conseils pour structurer les donn\u00e9es et transformer les items<\/h2>\n\n\n\n<p>Au fil de la cr\u00e9ation de ces workflows, nous avons utilis\u00e9 plusieurs n\u0153uds de transformation pour manipuler les donn\u00e9es entre les \u00e9tapes. Voici quelques <strong>bonnes pratiques et conseils<\/strong> \u00e0 retenir&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>N\u0153ud Set :<\/strong> utile pour <em>renommer<\/em> des champs, ajouter des champs statiques, ou supprimer ceux qui ne sont pas n\u00e9cessaires avant une insertion en base. Par exemple, avant d\u2019ins\u00e9rer en DB, on peut ne garder que <code>id<\/code>, <code>summary<\/code>, etc., pour avoir une structure propre.<\/li>\n\n\n\n<li><strong>N\u0153ud Function (Code) :<\/strong> permet d\u2019\u00e9crire quelques lignes de JavaScript pour des transformations avanc\u00e9es. Nous l\u2019avons utilis\u00e9 pour extraire un ID d\u2019URL, pour concat\u00e9ner plusieurs items en un, etc. N8n vous permet d\u2019importer certaines librairies si besoin, mais souvent les m\u00e9thodes JS de base suffisent (regex, map, join\u2026).<\/li>\n\n\n\n<li><strong>Expressions dans les champs :<\/strong> dans la plupart des n\u0153uds, vous pouvez cliquer sur <em>\u201cAdd Expression\u201d<\/em> et s\u00e9lectionner des donn\u00e9es d\u2019un n\u0153ud pr\u00e9c\u00e9dent. Cela \u00e9vite d\u2019utiliser un n\u0153ud interm\u00e9diaire. Par exemple, au lieu d\u2019un Function pour extraire <code>videoId<\/code> comme on l\u2019a fait, on aurait pu mettre directement dans le champ VideoID du n\u0153ud YouTube Transcript une expression : <code>{{$json[\"link\"].split(\"v=\")[1]}}<\/code> (un peu simpliste, mais illustratif). N\u2019h\u00e9sitez pas \u00e0 exploiter les expressions pour passer des donn\u00e9es \u00e0 l\u2019IA ou \u00e0 la DB.<\/li>\n\n\n\n<li><strong>Contr\u00f4le du flux avec IF\/Switch :<\/strong> Si vous avez besoin de logiques conditionnelles (par ex: <em>si<\/em> aucun nouveau post, <em>alors<\/em> ne pas appeler OpenAI), vous pouvez ins\u00e9rer des n\u0153uds <strong>IF<\/strong>. Dans notre cas, on a d\u00e9lib\u00e9r\u00e9ment tent\u00e9 d\u2019ins\u00e9rer tous les items et laiss\u00e9 le SGDB refuser les doublons, mais on aurait pu faire un IF qui v\u00e9rifie l\u2019existence dans la DB avant de r\u00e9sumer\/inserer. Ce type de contr\u00f4le \u00e9vite des appels IA inutiles sur des donn\u00e9es d\u00e9j\u00e0 trait\u00e9es.<\/li>\n\n\n\n<li><strong>Gestion d\u2019erreurs :<\/strong> Activez l\u2019option <em>Continue on Fail<\/em> sur les n\u0153uds sensibles (par ex, insertion en base) si vous anticipez qu\u2019une erreur non critique peut survenir (duplicate key). Vous pourrez r\u00e9cup\u00e9rer l\u2019erreur dans le r\u00e9sultat et la traiter ou la logguer, sans interrompre l\u2019ex\u00e9cution globale.<\/li>\n<\/ul>\n\n\n\n<p>En structurant bien vos donn\u00e9es \u00e0 chaque \u00e9tape, vous facilitez l\u2019encha\u00eenement du workflow et \u00e9vitez les surprises. Un bon usage des n\u0153uds de transformation rend le workflow plus robuste et lisible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion et extensions possibles<\/h2>\n\n\n\n<p>Nous avons construit un syst\u00e8me complet de veille automatique : chaque jour, les nouvelles vid\u00e9os YouTube d\u2019une cha\u00eene sont transcrites et r\u00e9sum\u00e9es, les nouveaux posts LinkedIn d\u2019un influenceur sont extraits et synth\u00e9tis\u00e9s, et un r\u00e9sum\u00e9 global des tendances ressort. Tout cela sans intervention manuelle, gr\u00e2ce \u00e0 n8n et \u00e0 la puissance des agents IA.<\/p>\n\n\n\n<p>Bien entendu, ce workflow peut \u00eatre \u00e9tendu et adapt\u00e9 \u00e0 d\u2019autres sources et besoins :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udca1 <strong>Autres plateformes<\/strong> : vous pourriez appliquer une approche similaire \u00e0 Medium (articles de blog), Twitter (tweets d\u2019un compte \u2013 via l\u2019API Twitter ou d\u2019autres outils), Reddit (posts d\u2019un subreddit), etc. D\u00e8s qu\u2019une plateforme offre un flux RSS ou qu\u2019un outil comme PhantomBuster peut la scraper, n8n peut s\u2019y connecter.<\/li>\n\n\n\n<li>\ud83d\udca1 <strong>Notifications<\/strong> : actuellement nous stockons en base et c\u2019est tout. On pourrait ajouter une \u00e9tape pour envoyer un email quotidien avec les nouveaux r\u00e9sum\u00e9s, ou les poster sur Slack\/Teams. n8n int\u00e8gre de nombreux connecteurs email et chat pour cela.<\/li>\n\n\n\n<li>\ud83d\udca1 <strong>Analyse avanc\u00e9e<\/strong> : on pourrait imaginer utiliser les donn\u00e9es stock\u00e9es pour faire de l\u2019analyse de sentiment (par ex via une API d\u2019IA ou un mod\u00e8le local de classification) sur les posts, ou g\u00e9n\u00e9rer des graphiques (combien de posts par semaine, etc.). PostgreSQL coupl\u00e9 \u00e0 n8n offre un d\u00e9but de base de donn\u00e9es de veille sur laquelle on peut b\u00e2tir d\u2019autres automatisations.<\/li>\n\n\n\n<li>\ud83d\udca1 <strong>Optimisation IA<\/strong> : pour les tr\u00e8s longues vid\u00e9os, on pourrait int\u00e9grer une \u00e9tape de d\u00e9coupage du transcript en segments et un r\u00e9sum\u00e9 multi-\u00e9tapes (r\u00e9sumer chaque partie puis re-synth\u00e9tiser). De m\u00eame, pour un grand volume de posts, on pourrait demander \u00e0 l\u2019IA un classement des sujets les plus abord\u00e9s, etc.<\/li>\n\n\n\n<li>\ud83d\udca1 <strong>Autres n\u0153uds communautaires utiles<\/strong> : citons par exemple le n\u0153ud <strong>HTTP Request<\/strong> (toujours bon \u00e0 avoir pour appeler n\u2019importe quelle API non g\u00e9r\u00e9e nativement), ou des n\u0153uds de parsing (HTML, Markdown) si vous scrapez du contenu brut.<\/li>\n<\/ul>\n\n\n\n<p>En combinant ces techniques, vous pouvez b\u00e2tir votre propre <strong>agent de veille automatis\u00e9e<\/strong> sur mesure. N8n vous sert de glue pour orchestrer le tout, et les possibilit\u00e9s sont infinies. Nous esp\u00e9rons que ce tutoriel vous aura non seulement fait d\u00e9couvrir n8n, mais aussi inspir\u00e9 pour vos prochains projets d\u2019automatisation, que ce soit pour rester inform\u00e9 des derni\u00e8res tendances ou pour tout autre workflow m\u00ealant donn\u00e9es web et IA.<\/p>\n\n\n\n<p><strong>Bon automatisation !<\/strong> \ud83d\ude80<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"N8N : Automatisation Linkedin\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/8Z06Rl1spNg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article p\u00e9dagogique, nous allons apprendre \u00e0 utiliser n8n pour cr\u00e9er un syst\u00e8me complet&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[2],"tags":[],"class_list":["post-90","post","type-post","status-publish","format-standard","hentry","category-intelligence-artificielle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou\" \/>\n<meta property=\"og:description\" content=\"Dans cet article p\u00e9dagogique, nous allons apprendre \u00e0 utiliser n8n pour cr\u00e9er un syst\u00e8me complet&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/\" \/>\n<meta property=\"og:site_name\" content=\"Le site du matou\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-07T10:58:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-07T12:36:26+00:00\" \/>\n<meta name=\"author\" content=\"admin2154\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin2154\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/\",\"url\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/\",\"name\":\"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou\",\"isPartOf\":{\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/#website\"},\"datePublished\":\"2025-06-07T10:58:31+00:00\",\"dateModified\":\"2025-06-07T12:36:26+00:00\",\"author\":{\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/d62778c4a9a9eb68b258ce862c5cb052\"},\"breadcrumb\":{\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/#website\",\"url\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/\",\"name\":\"Le site du matou\",\"description\":\"Un site utilisant WordPress ma foi pas si mal fichu que \u00e7a\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/d62778c4a9a9eb68b258ce862c5cb052\",\"name\":\"admin2154\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/30bc2ae54660b3c6a84a10d6da54e19248e82ef919e0a33feae1adf7d6e0a9c6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/30bc2ae54660b3c6a84a10d6da54e19248e82ef919e0a33feae1adf7d6e0a9c6?s=96&d=mm&r=g\",\"caption\":\"admin2154\"},\"sameAs\":[\"http:\/\/boissiz.cluster029.hosting.ovh.net\"],\"url\":\"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/author\/admin2154\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/","og_locale":"fr_FR","og_type":"article","og_title":"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou","og_description":"Dans cet article p\u00e9dagogique, nous allons apprendre \u00e0 utiliser n8n pour cr\u00e9er un syst\u00e8me complet&hellip;","og_url":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/","og_site_name":"Le site du matou","article_published_time":"2025-06-07T10:58:31+00:00","article_modified_time":"2025-06-07T12:36:26+00:00","author":"admin2154","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"admin2154","Dur\u00e9e de lecture estim\u00e9e":"28 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/","url":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/","name":"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants) - Le site du matou","isPartOf":{"@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/#website"},"datePublished":"2025-06-07T10:58:31+00:00","dateModified":"2025-06-07T12:36:26+00:00","author":{"@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/d62778c4a9a9eb68b258ce862c5cb052"},"breadcrumb":{"@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/2025\/06\/07\/automatisation-de-la-veille-youtube-et-linkedin-avec-n8n-guide-pour-debutants\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/boissiebruno-pageperso-pi.ovh\/"},{"@type":"ListItem","position":2,"name":"Automatisation de la veille YouTube et LinkedIn avec n8n (Guide pour d\u00e9butants)"}]},{"@type":"WebSite","@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/#website","url":"https:\/\/boissiebruno-pageperso-pi.ovh\/","name":"Le site du matou","description":"Un site utilisant WordPress ma foi pas si mal fichu que \u00e7a","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/boissiebruno-pageperso-pi.ovh\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/d62778c4a9a9eb68b258ce862c5cb052","name":"admin2154","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/boissiebruno-pageperso-pi.ovh\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/30bc2ae54660b3c6a84a10d6da54e19248e82ef919e0a33feae1adf7d6e0a9c6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/30bc2ae54660b3c6a84a10d6da54e19248e82ef919e0a33feae1adf7d6e0a9c6?s=96&d=mm&r=g","caption":"admin2154"},"sameAs":["http:\/\/boissiz.cluster029.hosting.ovh.net"],"url":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/author\/admin2154\/"}]}},"_links":{"self":[{"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":1,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":91,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/posts\/90\/revisions\/91"}],"wp:attachment":[{"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/boissiebruno-pageperso-pi.ovh\/index.php\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}