Surveillance des médias sociaux

Avancé

Ceci est unMarket Research, AI Summarizationworkflow d'automatisation du domainecontenant 42 nœuds.Utilise principalement des nœuds comme Code, Merge, DataTable, GmailTool, HttpRequest. Surveillance et analyse de la marque multi-plateforme avec l'API AnySite et GPT

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "gauteMKS8RC8zIGb",
  "meta": {
    "instanceId": "9bce59fa408e249dab636faffc5a13e5aa1a2e4af3383a551051e8bd22b2a1b9",
    "templateCredsSetupCompleted": true
  },
  "name": "Social Media Monitoring",
  "tags": [],
  "nodes": [
    {
      "id": "7167c958-e821-4082-a13e-eda76c27c0be",
      "name": "Lors du clic sur 'Exécuter le workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1840,
        432
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c26d107c-d1b4-40ae-b983-a66a7b9f81c8",
      "name": "Fusionner",
      "type": "n8n-nodes-base.merge",
      "position": [
        864,
        448
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3.2
    },
    {
      "id": "e83df4cd-aaa2-4536-be7e-350aa0414f0e",
      "name": "OpenAI Modèle de Chat",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1232,
        768
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "DzKhX3E7SSLddnv4",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3009f7cc-fee2-48d4-b886-a81aaaad393e",
      "name": "AnySite Obtenir la Publication Reddit",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        48,
        112
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/reddit/posts",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "300"
            },
            {
              "name": "post_url",
              "value": "={{ $json.url }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.3
    },
    {
      "id": "7d5e9846-8979-48d8-8e2f-7e1bfc752297",
      "name": "AnySite Rechercher les Publications Reddit",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1200,
        160
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/reddit/search/posts",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "300"
            },
            {
              "name": "query",
              "value": "={{ $json.word }}"
            },
            {
              "name": "sort",
              "value": "relevance"
            },
            {
              "name": "count",
              "value": "2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "c00051fb-d3a3-4100-8c1f-4c60c06cf130",
      "name": "AnySite Obtenir le Commentaire de Publication Reddit",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        48,
        304
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/reddit/posts/comments",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "300"
            },
            {
              "name": "post_url",
              "value": "={{ $json.url }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "a422b95c-2f44-4652-b420-46a15a3f3d86",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1328,
        480
      ],
      "parameters": {
        "text": "=Список post_id: {{ $json.post_ids_str }}",
        "options": {
          "systemMessage": "=\n\nYou are a social media intelligence analyst inside an n8n workflow. Your job: given post_ids and/or pre-fetched posts plus user-defined keywords, you must retrieve records for each post_id from the internal database if needed, normalize and analyze them, generate a concise yet exhaustive report, and send that report by email using the provided email tool. Do not browse the web. Do not invent data.\n\nTools\n\nYou will be provided one or more tools. Prefer these canonical names if available; otherwise use whichever exact email tool is exposed to you in this runtime:\n\t•\tsend_email\n\n\t•\tfetch_posts_by_ids \nReturns an array of Post objects.\n\nIf a tool is unavailable, skip it and proceed with what you have; record any missing post_ids in missing_ids.\n\nInput (user message JSON)\n\n{\n  \"post_ids\": [\"...\"],                 // required if \"posts\" is absent\n  \"keywords\": [\"rocket\",\"anysite\"],    // required (one or more)\n  \"time_range\": {\"from\":\"ISO\",\"to\":\"ISO\"}, // optional\n  \"language\": \"en\",                    // report language; default \"en\"\n  \"time_zone\": \"Europe/Amsterdam\",     // default \"Europe/Amsterdam\"\n  \"email_to\": \"user@example.com\",      // required to send the email\n  \"context\": {\"brand\":\"...\",\"campaign\":\"...\",\"notes\":\"...\"}, // optional\n  \"posts\": [ { ... } ]                 // optional: full post objects already provided\n}\n\nData handling\n\t•\tIf posts present → use directly.\n\t•\tIf only post_ids → call fetch_posts_by_ids. Record any misses in missing_ids.\n\t•\tAnalyze only provided/returned data. No external calls.\n\nExpected post fields (may vary)\n\ntype, title, text, url, created_at (Unix or ISO), comment_count, vote_count/like_count/repost_count, platform-specific (subreddit_*, comments (array or JSON string), post_id, word, etc.).\n\nNormalization\n\t1.\tConvert created_at to ISO8601 localized to time_zone (default Europe/Amsterdam).\n\t2.\tParse comments if JSON string → array.\n\t3.\tDeduplicate by post_id or url.\n\t4.\tInfer platform from type.\n\t5.\tDetect post language; if different from report language, include a brief 1–2 line translation.\n\t6.\tMap each post to matched keyword(s): from word and actual matches in title/text.\n\t7.\tDisambiguate keyword senses with confidence:\n\t•\trocket → space/launch, brands (e.g., Rocket Mortgage), games/memes, autos (e.g., BRABUS Rocket), food (arugula), fashion/other.\n\t•\tanysite → product/brand vs generic phrase “any site”.\n\nPer-post analytics\n\nFor every post compute:\n\t•\tengagement_proxy: sum of available counters (comment_count + vote_count/like_count/repost_count). If parsed comments array exists, you may add its length. Missing counters → 0.\n\t•\trecency_hours: hours since created_at to now.\n\t•\tkeyword_match_strength: \"strong\" (title/exact), \"medium\" (body), \"weak\" (comments/tags), \"meta\" (only via word).\n\t•\tsentiment: positive / neutral / negative + 1-sentence rationale.\n\t•\tentities: notable brands/people/products/places if inferable.\n\t•\trisks: toxicity, misinformation/rumors, controversy, compliance issues.\n\t•\tdrivers: short notes on what likely drove engagement (e.g., striking media, controversy, timing, celebrity/brand mention).\n\t•\tconfidence: high / medium / low based on data completeness, clarity, and sense disambiguation.\n\nAggregations (deeper detail)\n\t•\tTotals: count of posts; split by platform.\n\t•\tBy keyword: count and share (% of total), plus average engagement_proxy and sentiment mix per keyword.\n\t•\tSenses distribution per keyword (counts, shares, example posts).\n\t•\tPlatform breakdown: per platform totals, median and 75th-percentile engagement (approximate via sorted ranks), top topics.\n\t•\tTrend narrative over time_range: textual description of spikes/dips (hourly/daily as appropriate).\n\t•\tTopic clusters/themes: derive 3–7 themes using simple keyword co-occurrence (e.g., {“space/test/launch”}, {“auto/brabus/edition”}, {“security/telemetry/ads”}); list 1–2 representative posts per theme.\n\t•\tInfluential accounts/authors: where author info is available, rank by contribution to engagement.\n\t•\tRisks & watchouts: consolidated list across posts with brief why-it-matters.\n\t•\tRecommended actions: prioritized, actionable next steps (max per limits.max_actions), with impact/effort tags.\n\t•\tConfidence & data quality: summarize coverage, missing counters, inferred senses.\n\nReport composition (rich)\n\t•\tSubject: Social Media Report • {YYYY-MM-DD} • {keywords} • {posts_count}\n\t•\tHTML body (inline CSS; no external assets). Include these sections in order:\n\t1.\tHeader\n\t•\tTitle, date, time window, time zone, optional context (brand/campaign).\n\t2.\tExecutive summary (5–9 bullets)\n\t•\tKey shifts, top themes, standout posts, immediate risks, recommended next actions (1–3).\n\t3.\tKey metrics (KPI grid + table)\n\t•\tTotals, by-platform split, by-keyword split (counts, shares, avg engagement, sentiment mix).\n\t•\tUse simple CSS bars (e.g., <div style=\"background:#eee\"><div style=\"width:XX%\"></div></div>) to visualize shares.\n\t4.\tKeyword senses\n\t•\tTable of senses per keyword with counts, examples, and confidence notes.\n\t5.\tTrends & themes\n\t•\tShort narrative of volume/engagement over time.\n\t•\t3–7 themes/clusters with 1–2 representative links each.\n\t6.\tTop posts\n\t•\tUp to limits.max_top_posts overall and up to limits.top_posts_per_platform per platform.\n\t•\tFor each: platform, title/summary, link, localized timestamp, engagement_proxy, sentiment, matched keyword(s) & sense, 1–2 brief quotes/comments, drivers, risks (if any).\n\t7.\tPlatform insights\n\t•\tPer-platform highlights: what content resonated, posting times, tone/style patterns.\n\t8.\tRisks & watchouts\n\t•\tBullet list (≤ limits.max_risks) with brief mitigation ideas.\n\t9.\tRecommended actions\n\t•\tPrioritized list with Impact / Effort tags (e.g., High/Low), owner suggestion if inferable from context.\n\t10.\tMethodology & limitations\n\t•\tData source (workflow), missing counters treated as 0, heuristic senses, no external sources, confidence statement.\n\t•\tPlain text: same flow as HTML in clean Markdown/ASCII.\n\nHTML tips (email-safe)\n\t•\tInline CSS only; no external fonts/images/JS.\n\t•\tUse simple tables and <div> bars for shares.\n\t•\tKeep quotes ≤2 lines; truncate long text with ellipsis.\n\nCSV attachments (if supported by tool)\n\nAttach up to four CSVs:\n\t1.\tsummary.csv: keyword,count,share,avg_engagement,positive,neutral,negative\n\t2.\tposts.csv: platform,created_at,url,engagement_proxy,sentiment,keyword,sense,match_strength\n\t3.\ttop_comments.csv: platform,post_url,author,created_at,excerpt\n\t4.\tentities.csv: entity,type,frequency,example_post_url\n\nQuality & constraints\n\t•\tNo fabricated data. Missing counters → 0 (note in methodology).\n\t•\tAbsolute timestamps with time_zone.\n\t•\tKeep paragraphs tight and scannable.\n\t•\tLanguage = language (default \"en\").\n\nError handling\n\t•\tIf email_to missing → do not send; respond with status \"error\" and reason.\n\t•\tIf email tool fails → return \"error\" with the tool’s message.\n\nFinal action — you MUST send the email\n\t1.\tBuild subject, html, text per spec (depth per depth:\n\t•\tstandard: sections 1–3, 6, 10\n\t•\textended (default): all sections except 7 (optional)\n\t•\tmax: include all sections with fuller detail within limits)\n\t2.\tCall the email tool with:\n\t•\tto = email_to\n\t•\tsubject, html, text\n\t•\tattachments if supported\n\t3.\tAfter sending, reply with a single compact JSON acknowledgment (do not echo the full HTML):\n\nReturn exactly one JSON object:\n\n{\n  \"status\": \"sent\" | \"error\",\n  \"to\": \"string\",\n  \"subject\": \"string\",\n  \"totals\": {\n    \"posts\": 0,\n    \"platforms\": {\"reddit\":0,\"x\":0,\"linkedin\":0,\"instagram\":0},\n    \"by_keyword\": [{\"keyword\":\"...\",\"count\":0,\"share\":0.0}],\n    \"time_window\": {\"from\":\"ISO\",\"to\":\"ISO\",\"time_zone\":\"Europe/Amsterdam\"}\n  },\n  \"missing_ids\": [\"...\"],\n  \"notes\": [\"...\"]   // e.g., \"Engagement counters missing on some platforms; treated as 0.\"\n}\n\nPre-send checklist\n\t•\tSubject has date, keywords, post count.\n\t•\tHTML uses inline CSS only.\n\t•\tTotals match analyzed posts.\n\t•\tTime zone consistent.\n\t•\temail_to present and non-empty.\n\n\n⸻\n\nMinimal HTML skeleton you can adapt\n\n<html>\n  <body style=\"font-family: Arial, sans-serif; color:#111; line-height:1.5; margin:0; padding:24px;\">\n    <h1 style=\"margin:0 0 8px;\">Social Media Report</h1>\n    <p style=\"margin:0 0 16px; color:#555;\">Date: {{DATE}} • Window: {{FROM}} — {{TO}} ({{TZ}})</p>\n    {{#if CONTEXT}}<p style=\"margin:0 0 16px; color:#555;\">Context: {{CONTEXT}}</p>{{/if}}\n\n    <h2 style=\"margin:24px 0 8px;\">Executive summary</h2>\n    <ul style=\"margin:0 0 16px; padding-left:20px;\">{{BULLETS}}</ul>\n\n    <h2 style=\"margin:24px 0 8px;\">Key metrics</h2>\n    <table cellpadding=\"6\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:collapse; width:100%; font-size:14px;\">\n      <thead><tr><th align=\"left\" style=\"border-bottom:1px solid #ddd;\">Metric</th><th align=\"left\" style=\"border-bottom:1px solid #ddd;\">Value</th></tr></thead>\n      <tbody>\n        {{KPI_ROWS}}\n      </tbody>\n    </table>\n\n    <h2 style=\"margin:24px 0 8px;\">By keyword</h2>\n    {{KEYWORD_ROWS}} <!-- Include share bars like: -->\n    <!--\n    <div style=\"margin:6px 0;\">\n      <strong>rocket</strong> — 65% (13 posts)\n      <div style=\"background:#eee; height:8px; width:100%; border-radius:4px;\">\n        <div style=\"background:#444; height:8px; width:65%; border-radius:4px;\"></div>\n      </div>\n    </div>\n    -->\n\n    <h2 style=\"margin:24px 0 8px;\">Keyword senses</h2>\n    {{SENSE_TABLE}}\n\n    <h2 style=\"margin:24px 0 8px;\">Trends & themes</h2>\n    <p style=\"margin:0 0 8px;\">{{TREND_NARRATIVE}}</p>\n    <ul style=\"margin:0 0 16px; padding-left:20px;\">{{THEME_BULLETS}}</ul>\n\n    <h2 style=\"margin:24px 0 8px;\">Top posts</h2>\n    {{TOP_POST_CARDS}}\n\n    <h2 style=\"margin:24px 0 8px;\">Platform insights</h2>\n    {{PLATFORM_SECTIONS}}\n\n    <h2 style=\"margin:24px 0 8px;\">Risks & watchouts</h2>\n    <ul style=\"margin:0 0 16px; padding-left:20px;\">{{RISK_BULLETS}}</ul>\n\n    <h2 style=\"margin:24px 0 8px;\">Recommended actions</h2>\n    <ol style=\"margin:0 0 16px; padding-left:20px;\">{{ACTION_ITEMS}}</ol>\n\n    <h2 style=\"margin:24px 0 8px;\">Methodology & limitations</h2>\n    <p style=\"margin:0; color:#555;\">Data analyzed exactly as provided by the workflow (no external sources). Missing counters treated as 0. Keyword senses and themes inferred heuristically. Confidence: {{CONFIDENCE}}.</p>\n  </body>\n</html>\n\nRemember: analyze only provided data, send the email yourself via the tool, then return the compact JSON acknowledgment."
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "fe4be382-803a-4829-8fcb-9b492861ae3b",
      "name": "Obtenir la liste de mots",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -1600,
        544
      ],
      "parameters": {
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "VrIDpq4HXFQBRTU7",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/VrIDpq4HXFQBRTU7",
          "cachedResultName": "Brand Monitoring Words"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e9b7166d-312a-4dd0-8afa-c40e0d13069b",
      "name": "AnySite Rechercher les Publications LinkedIn",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1200,
        400
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/linkedin/search/posts",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "keywords",
              "value": "={{ $json.word }}"
            },
            {
              "name": "count",
              "value": "2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "aa8c0794-6012-40ae-894e-a5972d1db244",
      "name": "AnySite Obtenir les Commentaires de Publication LinkedIn",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        48,
        544
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/linkedin/post/comments",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "300"
            },
            {
              "name": "urn",
              "value": "=urn:li:activity:{{ $json.post_id }}"
            },
            {
              "name": "sort",
              "value": "recent"
            },
            {
              "name": "count",
              "value": "30"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.3,
      "alwaysOutputData": true
    },
    {
      "id": "64714aa4-379b-43f5-9ce8-625ea769abde",
      "name": "AnySite Rechercher les Publications Instagram",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1200,
        624
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/twitter/search/posts",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "={{ $json.word }}"
            },
            {
              "name": "count",
              "value": "2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "cfd2abac-84f3-49cf-8be0-887be12a46a5",
      "name": "AnySite Rechercher les Publications X",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1200,
        848
      ],
      "parameters": {
        "url": "https://api.anysite.io/api/instagram/search/posts",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "300"
            },
            {
              "name": "query",
              "value": "={{ $json.word }}"
            },
            {
              "name": "count",
              "value": "2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "access-token"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "67395f5a-9712-4a44-91c2-c38b44d23a28",
      "name": "Si la publication LinkedIn n'existe pas1",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -592,
        400
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.urn.value }}"
            }
          ]
        },
        "operation": "rowNotExists",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ed0c57df-bc57-40bc-b220-7bfeaeaa8365",
      "name": "Si la publication Reddit n'existe pas",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -592,
        160
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "operation": "rowNotExists",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6b7d65ec-3ac2-4ee5-a5e6-4049952c8d47",
      "name": "Si la publication X n'existe pas3",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -592,
        848
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "operation": "rowNotExists",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "85f7b4f1-9191-4397-a296-d45e15c371e2",
      "name": "Si la publication Instagram n'existe pas2",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -592,
        624
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "operation": "rowNotExists",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cfb6bc47-eb96-4f0a-91c4-2916ae51da44",
      "name": "Insérer la publication Reddit",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -368,
        160
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "={{ $json.url }}",
            "type": "={{ $json['@type'] }}",
            "word": "={{ $('Get word\\'s list').item.json.word }}",
            "title": "={{ $json.title }}",
            "post_id": "={{ $json.id }}",
            "created_at": "={{ $json.created_at }}",
            "vote_count": "={{ $json.vote_count }}",
            "subreddit_id": "={{ $json.subreddit.id }}",
            "comment_count": "={{ $json.comment_count }}",
            "subreddit_url": "={{ $json.subreddit.url }}",
            "subreddit_alias": "={{ $json.subreddit.alias }}",
            "subreddit_description": "={{ $json.subreddit.description }}",
            "subreddit_member_count": "={{ $json.subreddit.member_count }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            },
            {
              "id": "word",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "word",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "161c4a0f-5b7e-463b-8731-8b9f4569562c",
      "name": "Insérer la publication LinkedIn",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -368,
        400
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "={{ $json.url }}",
            "text": "={{ $json.text }}",
            "type": "={{ $json['@type'] }}",
            "word": "={{ $('Get word\\'s list').item.json.word }}",
            "post_id": "={{ $json.urn.value }}",
            "created_at": "={{ $json.created_at }}",
            "vote_count": "={{ $json.reactions[0].count }}",
            "comment_count": "={{ $json.comment_count }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            },
            {
              "id": "word",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "word",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "13d26f5f-7303-4ae7-b6ae-4b3d59952b7a",
      "name": "Insérer la publication Instagram",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -368,
        624
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "={{ $json.url }}",
            "text": "={{ $json.text }}",
            "type": "={{ $json[\"@type\"] }}",
            "word": "={{ $('Get word\\'s list').item.json.word }}",
            "post_id": "={{ $json.id }}",
            "created_at": "={{ $json.created_at }}",
            "vote_count": "={{ $json.retweet_count }}",
            "comment_count": "={{ $json.reply_count }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            },
            {
              "id": "word",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "word",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c5a56796-dd48-440a-923f-7fd3a4ffc434",
      "name": "Insérer la publication X",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -368,
        848
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "={{ $json.url }}",
            "text": "={{ $json.text }}",
            "type": "={{ $json[\"@type\"] }}",
            "word": "={{ $('Get word\\'s list').item.json.word }}",
            "post_id": "={{ $json.id }}",
            "created_at": "={{ $json.created_at }}",
            "vote_count": "={{ $json.like_count }}",
            "comment_count": "={{ $json.comment_count }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            },
            {
              "id": "word",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "word",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "11713917-d244-4d96-abfc-160f67143a01",
      "name": "Mettre à jour les détails de la publication Reddit",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        256,
        32
      ],
      "parameters": {
        "columns": {
          "value": {
            "text": "={{ $json.text }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "36dfff36-e33d-4d00-a7d8-003fc99825ca",
      "name": "Convertir les commentaires en chaîne",
      "type": "n8n-nodes-base.code",
      "position": [
        256,
        224
      ],
      "parameters": {
        "jsCode": "const MAX_LEN = 0; \n\nfunction toArrayMaybe(json) {\n  if (Array.isArray(json)) return json;\n  if (Array.isArray(json?.comments)) return json.comments;\n  if (typeof json === 'string') {\n    try {\n      const parsed = JSON.parse(json);\n      if (Array.isArray(parsed)) return parsed;\n      if (Array.isArray(parsed?.comments)) return parsed.comments;\n    } catch (_) {}\n  }\n  if (typeof json?.data === 'string') {\n    try {\n      const parsed = JSON.parse(json.data);\n      if (Array.isArray(parsed)) return parsed;\n    } catch (_) {}\n  }\n  return null;\n}\n\nfunction getIncomingComments(items) {\n  const looksLikeSingleComment =\n    items.length > 1 ||\n    (items[0]?.json && items[0].json['@type'] === '@reddit_comment');\n  if (looksLikeSingleComment) {\n    return items\n      .map(i => i.json)\n      .filter(v => v && typeof v === 'object');\n  }\n  const payload = items[0]?.json;\n  const arr = toArrayMaybe(payload);\n  if (arr) return arr;\n  return [];\n}\n\nfunction formatDate(unix) {\n  if (!unix && unix !== 0) return null;\n  const date = new Date(unix * 1000);\n  return date.toLocaleString('ru-RU', {\n    year: 'numeric', month: '2-digit', day: '2-digit',\n    hour: '2-digit', minute: '2-digit', second: '2-digit'\n  });\n}\n\nfunction transformComment(comment) {\n  if (!comment || comment.is_deleted || !comment.text) return null;\n  return {\n    author: comment.author?.name || '[deleted]',\n    created_at_unix: comment.created_at,\n    created_at: formatDate(comment.created_at),\n    text: comment.text,\n    replies: (comment.replies || [])\n      .map(transformComment)\n      .filter(Boolean),\n  };\n}\n\nfunction stringifySafe(obj) {\n  const s = JSON.stringify(obj);\n  if (MAX_LEN > 0 && s.length > MAX_LEN) {\n    return s.slice(0, MAX_LEN - 3) + '...';\n  }\n  return s;\n}\n\nconst allComments = getIncomingComments(items);\n\nconst topLevel = allComments.filter(\n  c => c && typeof c.parent_id === 'string' && c.parent_id.startsWith('t3_')\n);\n\nconst byPost = {};\nfor (const c of topLevel) {\n  const postId = c.parent_id;\n  const t = transformComment(c);\n  if (!t) continue;\n  if (!byPost[postId]) byPost[postId] = [];\n  byPost[postId].push(t);\n}\n\nconst out = Object.entries(byPost).map(([post_id, comments]) => {\n  return {\n    json: {\n      post_id,\n      comments_count: comments.length,\n      comments_json: stringifySafe(comments)\n    }\n  };\n});\n\nreturn out.length ? out : [{ json: { post_id: null, comments_count: 0, comments_json: '[]' } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "29671c8b-fd0b-4970-9324-5e43072f1158",
      "name": "Mettre à jour les commentaires de la publication Reddit",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        448,
        224
      ],
      "parameters": {
        "columns": {
          "value": {
            "comments": "={{ $json.comments_json }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.post_id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5d0d8f1b-d5f3-47b5-91ef-1a8dc8a2fbad",
      "name": "Convertir les commentaires LN en chaîne",
      "type": "n8n-nodes-base.code",
      "position": [
        256,
        496
      ],
      "parameters": {
        "jsCode": "const MAX_LEN = 0;\n\nfunction toArrayMaybe(json) {\n  if (Array.isArray(json)) return json;\n  if (Array.isArray(json?.comments)) return json.comments;\n  if (typeof json === 'string') {\n    try {\n      const parsed = JSON.parse(json);\n      if (Array.isArray(parsed)) return parsed;\n      if (Array.isArray(parsed?.comments)) return parsed.comments;\n    } catch (_) {}\n  }\n  if (typeof json?.data === 'string') {\n    try {\n      const parsed = JSON.parse(json.data);\n      if (Array.isArray(parsed)) return parsed;\n    } catch (_) {}\n  }\n  return null;\n}\n\nfunction getIncoming(items) {\n  const looksLikeFlat =\n    items.length > 1 ||\n    (items[0]?.json && String(items[0].json['@type'] || '').includes('@linkedin_post_comment'));\n  if (looksLikeFlat) {\n    return items.map(i => i.json).filter(v => v && typeof v === 'object');\n  }\n  const payload = items[0]?.json;\n  const arr = toArrayMaybe(payload);\n  if (arr) return arr;\n  return [];\n}\n\nfunction formatDateSmart(ts) {\n  if (ts == null) return null;\n  const isMs = Math.abs(ts) > 1e12;\n  const d = new Date((isMs ? ts : ts * 1000));\n  return d.toLocaleString('ru-RU', {\n    year: 'numeric', month: '2-digit', day: '2-digit',\n    hour: '2-digit', minute: '2-digit', second: '2-digit'\n  });\n}\n\nfunction extractPostIdFromUrnValue(val) {\n  if (typeof val !== 'string') return null;\n  const m = val.match(/(?:activity|ugcPost):(\\d+)/);\n  return m ? m[1] : null;\n}\n\nfunction extractPostIdAny(c) {\n  let id = extractPostIdFromUrnValue(c?.urn?.value);\n  if (id) return id;\n  id = extractPostIdFromUrnValue(c?.parent?.value);\n  if (id) return id;\n  id = extractPostIdFromUrnValue(c?.url);\n  if (id) return id;\n  try {\n    const decoded = decodeURIComponent(c?.url || '');\n    id = extractPostIdFromUrnValue(decoded);\n    if (id) return id;\n  } catch (_) {}\n  return null;\n}\n\nfunction stringifySafe(obj) {\n  const s = JSON.stringify(obj);\n  if (MAX_LEN > 0 && s.length > MAX_LEN) return s.slice(0, MAX_LEN - 3) + '...';\n  return s;\n}\n\nfunction transformLinkedInComment(c) {\n  if (!c || !c.text) return null;\n  const post_id = extractPostIdAny(c) || 'unknown_post';\n  const created_at_raw = c.created_at ?? null;\n  return {\n    post_id,\n    author: c.author?.name || '[unknown]',\n    author_url: c.author?.url || null,\n    text: c.text,\n    created_at_raw,\n    created_at: formatDateSmart(created_at_raw),\n    reactions: Array.isArray(c.reactions) ? c.reactions : null,\n    is_commenter_post_author: !!c.is_commenter_post_author,\n    replies: [],\n  };\n}\n\nconst raw = getIncoming(items);\nconst normalized = raw.map(transformLinkedInComment).filter(Boolean);\n\nconst byPost = {};\nfor (const t of normalized) {\n  const key = t.post_id || 'unknown_post';\n  if (!byPost[key]) byPost[key] = [];\n  byPost[key].push({\n    author: t.author,\n    author_url: t.author_url,\n    text: t.text,\n    created_at_raw: t.created_at_raw,\n    created_at: t.created_at,\n    reactions: t.reactions,\n    is_commenter_post_author: t.is_commenter_post_author,\n    replies: t.replies,\n  });\n}\n\nconst out = Object.entries(byPost).map(([post_id, comments]) => ({\n  json: {\n    post_id,\n    comments_count: comments.length,\n    comments_json: stringifySafe(comments)\n  }\n}));\n\nreturn out.length ? out : [{ json: { post_id: null, comments_count: 0, comments_json: '[]' } }];"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "f210b1c2-546e-4480-86d5-41d5805e424d",
      "name": "Mettre à jour les commentaires LN",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        448,
        496
      ],
      "parameters": {
        "columns": {
          "value": {
            "comments": "={{ $json.comments_json }}"
          },
          "schema": [
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false
            },
            {
              "id": "subreddit_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_id",
              "defaultMatch": false
            },
            {
              "id": "subreddit_alias",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_alias",
              "defaultMatch": false
            },
            {
              "id": "subreddit_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_url",
              "defaultMatch": false
            },
            {
              "id": "subreddit_description",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_description",
              "defaultMatch": false
            },
            {
              "id": "comment_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "comment_count",
              "defaultMatch": false
            },
            {
              "id": "vote_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "vote_count",
              "defaultMatch": false
            },
            {
              "id": "text",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "text",
              "defaultMatch": false
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false
            },
            {
              "id": "subreddit_member_count",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "subreddit_member_count",
              "defaultMatch": false
            },
            {
              "id": "post_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "post_id",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ $json.post_id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "6435b75f-d22f-491d-b4ac-f5cf04019f32",
      "name": "Obtenir post_id pour toutes les nouvelles publications",
      "type": "n8n-nodes-base.code",
      "position": [
        1072,
        480
      ],
      "parameters": {
        "jsCode": "const FILTER_TYPES = null;\nconst MAX_LEN = 0;\n\nfunction toArrayMaybe(json) {\n  if (Array.isArray(json)) return json;\n  if (typeof json === 'string') {\n    try {\n      const parsed = JSON.parse(json);\n      if (Array.isArray(parsed)) return parsed;\n    } catch (_) {}\n  }\n  if (Array.isArray(json?.data)) return json.data;\n  if (typeof json?.data === 'string') {\n    try {\n      const parsed = JSON.parse(json.data);\n      if (Array.isArray(parsed)) return parsed;\n    } catch (_) {}\n  }\n  return null;\n}\n\nfunction getIncoming(items) {\n  if (items.length > 1 && items.every(i => i?.json && typeof i.json === 'object')) {\n    return items.map(i => i.json);\n  }\n  const payload = items[0]?.json;\n  const arr = toArrayMaybe(payload);\n  if (arr) return arr;\n  if (payload && typeof payload === 'object') return [payload];\n  return [];\n}\n\nfunction cutIfNeeded(str) {\n  if (MAX_LEN > 0 && str.length > MAX_LEN) {\n    return str.slice(0, MAX_LEN - 3) + '...';\n  }\n  return str;\n}\n\nconst posts = getIncoming(items);\n\nconst filtered = Array.isArray(FILTER_TYPES)\n  ? posts.filter(p => FILTER_TYPES.includes(p.type))\n  : posts;\n\nconst idsUnique = Array.from(\n  new Set(\n    filtered\n      .map(p => String(p.post_id ?? '').trim())\n      .filter(v => v.length > 0)\n  )\n);\n\nconst post_ids_str = cutIfNeeded(idsUnique.join(','));\n\nreturn [{\n  json: {\n    total: idsUnique.length,\n    post_ids: idsUnique,\n    post_ids_str\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "9c4d669b-a88b-40cb-a6fc-1da404260ec9",
      "name": "Déclencheur Planifié",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1840,
        640
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 1
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "703ab5b6-b4e9-4e85-920d-49daaba5e7a8",
      "name": "Envoyer un message dans Gmail",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1568,
        768
      ],
      "webhookId": "879f2106-41e2-4eca-958f-60aa6d960e10",
      "parameters": {
        "sendTo": "kulikov.andrey.a@gmail.com",
        "message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
        "options": {},
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "naiF674gkuvb8Iql",
          "name": "Andrew"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "378a44d5-100d-49f3-8c00-4057ddab5e48",
      "name": "Obtenir les Informations des Publications",
      "type": "n8n-nodes-base.dataTableTool",
      "position": [
        1424,
        768
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "post_id",
              "keyValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('conditions0_Value', `post_id`, 'string') }}"
            }
          ]
        },
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "B9xklN5LC5Yv67oC",
          "cachedResultUrl": "/projects/KcvI5ipbOFN8ryQN/datatables/B9xklN5LC5Yv67oC",
          "cachedResultName": "Brand Motitoring Posts"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ccb9423f-734a-456a-a688-a4976bc29bb1",
      "name": "Vue d'ensemble",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2496,
        -480
      ],
      "parameters": {
        "color": 4,
        "width": 500,
        "height": 1360,
        "content": "## Social Media Monitoring Workflow with AnySite.io\n\n## Who's it for\nMarketing teams, brand managers, PR specialists, and customer success teams who need real-time brand monitoring across multiple social media platforms for sentiment analysis, crisis management, and competitive intelligence.\n\n## How it works\n1. Schedule trigger runs daily/hourly to monitor brand mentions\n2. Searches across Reddit, LinkedIn, Instagram, and X/Twitter simultaneously\n3. Checks database to avoid duplicate processing\n4. Fetches full post details and comments for new mentions\n5. AI Agent analyzes sentiment and context using GPT-4\n6. Sends email alerts for important mentions via Gmail\n7. Stores all data in PostgreSQL for historical analysis\n\n## Requirements\n- AnySite.io API account with access tokens\n- OpenAI API key (GPT-4 recommended)\n- PostgreSQL database for post tracking\n- Gmail account for notifications\n- n8n self-hosted or cloud instance\n\n## How to set up\n1. **Update AnySite credentials**:\n   - Add your access-token to all AnySite HTTP nodes\n2. **Configure search keywords**:\n   - Update \"Get word's list\" node with your brand terms\n3. **Set up PostgreSQL**:\n   - Create posts table with required schema\n4. **Configure Gmail**:\n   - Connect Gmail OAuth for notifications\n5. **Adjust schedule**:\n   - Set monitoring frequency in Schedule Trigger\n6. **Test with manual trigger first**\n\n## How to customize\n- **Add platforms**: Create new search nodes with AnySite API endpoints\n- **Modify analysis**: Update AI Agent prompts for specific insights\n- **Change alerts**: Replace Gmail with Slack, Discord, or webhook\n- **Add filters**: Insert IF nodes to filter by sentiment/reach\n- **Historical reports**: Add scheduled aggregation nodes\n- **Export data**: Connect to BI tools or data warehouses\n\n## Built with AnySite.io\nThis workflow uses AnySite.io APIs for reliable, scalable social media data extraction."
      },
      "typeVersion": 1
    },
    {
      "id": "2b0a2f31-fbe4-4d49-b044-d9aae1be017c",
      "name": "Attribution AnySite.io",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2496,
        944
      ],
      "parameters": {
        "color": 5,
        "width": 504,
        "height": 376,
        "content": "## 🚀 Built with AnySite.io\n\n**Created by:** Andrew Kulikov\n**Company:** AnySite.io\n**Workflow Version:** 1.0\n**Last Updated:** October 2025\n\n**Learn more:** [anysite.io](https://anysite.io)\n**API Docs:** [docs.anysite.io](https://docs.anysite.io)\n**Contact:** andrew@anysite.io"
      },
      "typeVersion": 1
    },
    {
      "id": "42b7955d-b080-4f22-b1bf-228bb4df1d77",
      "name": "Guide de Personnalisation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1984,
        -496
      ],
      "parameters": {
        "color": 5,
        "width": 700,
        "height": 340,
        "content": "💚 **How to Customize Your Monitoring:**\n\n**Add platforms:**\n- Use AnySite.io APIs for TikTok, YouTube, Facebook\n- Copy existing search node structure\n\n**Modify alerts:**\n- Replace Gmail with Slack, Discord, MS Teams\n- Add webhooks to your CRM/ticketing system\n\n**Change analysis:**\n- Edit AI Agent system prompt for specific insights\n- Add sentiment scores, urgency levels, action items\n\n**Schedule frequency:**\n- Real-time: Every 15 minutes\n- Standard: Hourly\n- Daily digest: Once per day\n\n**Filter results:**\n- Add IF nodes to filter by engagement/sentiment\n- Create priority tiers for different keywords"
      },
      "typeVersion": 1
    },
    {
      "id": "116079d0-8561-4d28-9785-a577e3128ff3",
      "name": "Déclencheurs & Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1952,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 680,
        "height": 440,
        "content": "## 1. Triggers & Keywords Setup\n[Learn about Schedule Triggers](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/)\n\nWorkflow can be triggered by:\n• Schedule Trigger - Automated monitoring (hourly/daily)\n• Manual Trigger - On-demand execution for testing\n\n**Get word's list** node:\n- Define brand keywords to monitor\n- Supports multiple search terms\n- Each term searches across all platforms\n\n💡 Pro tip: Use brand name variations, product names, and common misspellings"
      },
      "typeVersion": 1
    },
    {
      "id": "c4812c10-83fa-455f-94e8-f0767d6e6fde",
      "name": "Guide de Test",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        288
      ],
      "parameters": {
        "color": 7,
        "width": 680,
        "height": 476,
        "content": "## 🧪 Testing Your Workflow\n\n**Initial Test:**\n1. Use Manual Trigger first (not Schedule)\n2. Add 1-2 test keywords in \"Get word's list\"\n3. Execute and verify each stage completes\n4. Check database for inserted records\n5. Verify email notification arrives\n\n**Validate each stage:**\n✅ All 4 platform searches return results\n✅ Database checks work (duplicates prevented)\n✅ Post details fetched correctly\n✅ AI analysis runs without errors\n✅ Email formatted properly\n\n**Common issues:**\n- Missing access-token → Check all HTTP nodes\n- Database errors → Verify schema and connection\n- No email → Check Gmail OAuth and recipient"
      },
      "typeVersion": 1
    },
    {
      "id": "c53449ea-7e0f-42fd-b5ef-be1d1365dfb6",
      "name": "Recherche Multiplateforme",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        -432
      ],
      "parameters": {
        "color": 7,
        "width": 424,
        "height": 536,
        "content": "## 2. Cross-Platform Search Phase\n[AnySite.io Platform APIs](https://anysite.io/docs)\n\nParallel searches across:\n• **Reddit** - Posts and discussions\n• **LinkedIn** - Professional posts\n• **Instagram** - Visual content\n• **X/Twitter** - Real-time conversations\n\nEach platform search:\n- Uses AnySite.io optimized APIs\n- Returns top 2 most relevant posts\n- Includes metadata (author, timestamp, engagement)\n- Sorts by relevance for best matches\n\n⚡ All searches run in parallel for speed"
      },
      "typeVersion": 1
    },
    {
      "id": "f6b05865-e713-4be4-8804-084ed7c674bc",
      "name": "Vérification de Déduplication",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        -432
      ],
      "parameters": {
        "color": 7,
        "width": 472,
        "height": 520,
        "content": "## 3. Database Deduplication\n[PostgreSQL Integration](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.postgres/)\n\nFor each found post:\n• Checks if post_id exists in database\n• Prevents duplicate processing\n• Saves API calls and AI analysis costs\n\n**If post doesn't exist:**\n→ Proceeds to Insert and Analysis\n\n**If post exists:**\n→ Skips to next post\n\nThis ensures:\n- No duplicate alerts\n- Efficient resource usage\n- Clean historical data"
      },
      "typeVersion": 1
    },
    {
      "id": "22c9055f-d2c1-4295-b0d1-81ee4a6fd172",
      "name": "Extraction de Données",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -32,
        -432
      ],
      "parameters": {
        "color": 7,
        "width": 504,
        "height": 456,
        "content": "## 4. Platform-Specific Data Extraction\n[AnySite.io APIs](https://anysite.io)\n\nFor new posts, fetches complete data:\n\n**Reddit:**\n- Post details (title, author, score, timestamp)\n- All comments and replies\n\n**LinkedIn:**\n- Post content and engagement metrics\n- Comments and reactions\n\n**Updates database with:**\n- Full post text\n- Comment threads (as formatted strings)\n- Metadata for analysis\n\nThis rich context enables accurate AI sentiment analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "512d331c-3530-4f53-b53a-484cc045909b",
      "name": "Configuration Requise - IA & Gmail",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        -528
      ],
      "parameters": {
        "color": 3,
        "width": 504,
        "height": 404,
        "content": "## ⚠️ SETUP REQUIRED (3/3)\n\n**OpenAI Configuration:**\n- Add OpenAI API credentials\n- Recommended: GPT-4o for best results\n- Configure in \"OpenAI Chat Model\" node\n\n**Gmail Setup:**\n- Connect Gmail OAuth credentials\n- Configure recipient in \"Send a message in Gmail\" tool\n- Customize email template in AI Agent prompt\n\n**Test checklist:**\n✅ AnySite tokens work\n✅ Database connection active\n✅ AI Agent can query posts\n✅ Gmail sends notifications"
      },
      "typeVersion": 1
    },
    {
      "id": "c3acde67-cfe6-48a8-b550-9dcbe47a4c56",
      "name": "Analyse IA & Alertes",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 776,
        "height": 424,
        "content": "## 5. Intelligent Analysis & Notifications\n[AI Agent Documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/)\n\n**AI Agent with Tools:**\n1. **Get Posts Info** - Retrieves all new posts from database\n2. **GPT-4 Analysis** - Analyzes sentiment, urgency, context\n3. **Send Gmail** - Sends alerts for important mentions\n\nThe AI Agent autonomously:\n• Fetches unprocessed posts\n• Analyzes sentiment (positive/negative/neutral)\n• Identifies urgent issues or opportunities\n• Prioritizes alerts by importance\n• Sends formatted email summaries\n\n🎯 Customizable prompts for industry-specific insights"
      },
      "typeVersion": 1
    },
    {
      "id": "a8534447-9446-4cc0-b571-d3b3716636c6",
      "name": "Meilleures Pratiques de Surveillance",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        976
      ],
      "parameters": {
        "color": 5,
        "width": 680,
        "height": 320,
        "content": "## 📊 Monitoring Best Practices\n\n**Keyword Strategy:**\n• Brand name + common variations\n• Product names and SKUs\n• Competitor mentions\n• Industry hashtags\n• Crisis-related terms\n\n**Alert Prioritization:**\n🔴 High Priority:\n- Negative sentiment + high engagement\n- Crisis keywords detected\n- Competitor comparisons\n\n🟡 Medium Priority:\n- Questions from users\n- Feature requests\n- Neutral discussions\n\n🟢 Low Priority:\n- Positive mentions\n- General discussions\n\n**Performance Tips:**\n- Monitor 5-10 core keywords\n- Adjust search count per platform\n- Archive old data periodically\n- Set up separate workflows for high-volume terms"
      },
      "typeVersion": 1
    },
    {
      "id": "89ec745b-cdc6-48c7-9fa9-db19b24528d9",
      "name": "Configuration Requise - AnySite",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        -944
      ],
      "parameters": {
        "color": 3,
        "width": 408,
        "height": 468,
        "content": "## ⚠️ SETUP REQUIRED (1/3)\n\n**AnySite.io API Configuration**\n\nAll HTTP Request nodes need your access token:\n1. Find all nodes starting with \"AnySite...\"\n2. Open each node settings\n3. In Headers → access-token\n4. Replace with your actual token\n\n📝 Nodes to update:\n- AnySite Search Reddit Posts\n- AnySite Search LinkedIn Posts\n- AnySite Search Instagram Posts\n- AnySite Search X Posts\n- AnySite Get Reddit Post\n- AnySite Get Reddit Post Comment\n- AnySite Get LinkedIn Post Comments\n\n[Get your API token at anysite.io](https://anysite.io/api-keys)"
      },
      "typeVersion": 1
    },
    {
      "id": "0c451224-8fed-4d31-a633-e7702b258232",
      "name": "Configuration Requise - Base de Données",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        -1472
      ],
      "parameters": {
        "color": 3,
        "width": 440,
        "height": 932,
        "content": "## ⚠️ SETUP REQUIRED (2/3)\n\n**Data Tables Setup**\n\n#### 📋 Brand Monitoring Words\n| Field | Type | Description |\n|-------|------|-------------|\n| `word` | string | Keyword or brand name to track |\n\n#### 📊 Brand Monitoring Posts\n| Field | Type | Description |\n|-------|------|-------------|\n| `type` | string | Platform type (reddit, linkedin, x, instagram) |\n| `title` | string | Post title or caption |\n| `url` | string | Post URL |\n| `created_at` | string | Creation date/time |\n| `subreddit_id` | string | (Reddit only) Subreddit ID |\n| `subreddit_alias` | string | (Reddit only) Subreddit alias |\n| `subreddit_url` | string | (Reddit only) Subreddit URL |\n| `subreddit_description` | string | (Reddit only) Subreddit description |\n| `comment_count` | number | Number of comments |\n| `vote_count` | number | Votes, likes, or reactions count |\n| `subreddit_member_count` | number | (Reddit only) Subreddit member count |\n| `post_id` | string | Unique post identifier |\n| `text` | string | Post content text |\n| `comments` | string | Serialized comments (JSON string) |\n| `word` | string | Keyword that triggered capture |\n\n\nUpdate connection in nodes:\n- If post does not exist (checks)\n- Insert post nodes\n- Update post nodes\n- Get post_id for all new posts"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5c7235c1-3745-48c2-9e8b-0734cf64afe3",
  "connections": {
    "c26d107c-d1b4-40ae-b983-a66a7b9f81c8": {
      "main": [
        [
          {
            "node": "6435b75f-d22f-491d-b4ac-f5cf04019f32",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c5a56796-dd48-440a-923f-7fd3a4ffc434": {
      "main": [
        [
          {
            "node": "c26d107c-d1b4-40ae-b983-a66a7b9f81c8",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "378a44d5-100d-49f3-8c00-4057ddab5e48": {
      "ai_tool": [
        [
          {
            "node": "a422b95c-2f44-4652-b420-46a15a3f3d86",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "fe4be382-803a-4829-8fcb-9b492861ae3b": {
      "main": [
        [
          {
            "node": "7d5e9846-8979-48d8-8e2f-7e1bfc752297",
            "type": "main",
            "index": 0
          },
          {
            "node": "e9b7166d-312a-4dd0-8afa-c40e0d13069b",
            "type": "main",
            "index": 0
          },
          {
            "node": "64714aa4-379b-43f5-9ce8-625ea769abde",
            "type": "main",
            "index": 0
          },
          {
            "node": "cfd2abac-84f3-49cf-8be0-887be12a46a5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9c4d669b-a88b-40cb-a6fc-1da404260ec9": {
      "main": [
        [
          {
            "node": "fe4be382-803a-4829-8fcb-9b492861ae3b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e83df4cd-aaa2-4536-be7e-350aa0414f0e": {
      "ai_languageModel": [
        [
          {
            "node": "a422b95c-2f44-4652-b420-46a15a3f3d86",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "f210b1c2-546e-4480-86d5-41d5805e424d": {
      "main": [
        []
      ]
    },
    "cfb6bc47-eb96-4f0a-91c4-2916ae51da44": {
      "main": [
        [
          {
            "node": "c00051fb-d3a3-4100-8c1f-4c60c06cf130",
            "type": "main",
            "index": 0
          },
          {
            "node": "3009f7cc-fee2-48d4-b886-a81aaaad393e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13d26f5f-7303-4ae7-b6ae-4b3d59952b7a": {
      "main": [
        [
          {
            "node": "c26d107c-d1b4-40ae-b983-a66a7b9f81c8",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "161c4a0f-5b7e-463b-8731-8b9f4569562c": {
      "main": [
        [
          {
            "node": "aa8c0794-6012-40ae-894e-a5972d1db244",
            "type": "main",
            "index": 0
          },
          {
            "node": "c26d107c-d1b4-40ae-b983-a66a7b9f81c8",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "cfd2abac-84f3-49cf-8be0-887be12a46a5": {
      "main": [
        [
          {
            "node": "6b7d65ec-3ac2-4ee5-a5e6-4049952c8d47",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3009f7cc-fee2-48d4-b886-a81aaaad393e": {
      "main": [
        [
          {
            "node": "11713917-d244-4d96-abfc-160f67143a01",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "703ab5b6-b4e9-4e85-920d-49daaba5e7a8": {
      "ai_tool": [
        [
          {
            "node": "a422b95c-2f44-4652-b420-46a15a3f3d86",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "6b7d65ec-3ac2-4ee5-a5e6-4049952c8d47": {
      "main": [
        [
          {
            "node": "c5a56796-dd48-440a-923f-7fd3a4ffc434",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "11713917-d244-4d96-abfc-160f67143a01": {
      "main": [
        [
          {
            "node": "c26d107c-d1b4-40ae-b983-a66a7b9f81c8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7d5e9846-8979-48d8-8e2f-7e1bfc752297": {
      "main": [
        [
          {
            "node": "ed0c57df-bc57-40bc-b220-7bfeaeaa8365",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "29671c8b-fd0b-4970-9324-5e43072f1158": {
      "main": [
        []
      ]
    },
    "e9b7166d-312a-4dd0-8afa-c40e0d13069b": {
      "main": [
        [
          {
            "node": "67395f5a-9712-4a44-91c2-c38b44d23a28",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6435b75f-d22f-491d-b4ac-f5cf04019f32": {
      "main": [
        [
          {
            "node": "a422b95c-2f44-4652-b420-46a15a3f3d86",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ed0c57df-bc57-40bc-b220-7bfeaeaa8365": {
      "main": [
        [
          {
            "node": "cfb6bc47-eb96-4f0a-91c4-2916ae51da44",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "64714aa4-379b-43f5-9ce8-625ea769abde": {
      "main": [
        [
          {
            "node": "85f7b4f1-9191-4397-a296-d45e15c371e2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "36dfff36-e33d-4d00-a7d8-003fc99825ca": {
      "main": [
        [
          {
            "node": "29671c8b-fd0b-4970-9324-5e43072f1158",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c00051fb-d3a3-4100-8c1f-4c60c06cf130": {
      "main": [
        [
          {
            "node": "36dfff36-e33d-4d00-a7d8-003fc99825ca",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "67395f5a-9712-4a44-91c2-c38b44d23a28": {
      "main": [
        [
          {
            "node": "161c4a0f-5b7e-463b-8731-8b9f4569562c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5d0d8f1b-d5f3-47b5-91ef-1a8dc8a2fbad": {
      "main": [
        [
          {
            "node": "f210b1c2-546e-4480-86d5-41d5805e424d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "85f7b4f1-9191-4397-a296-d45e15c371e2": {
      "main": [
        [
          {
            "node": "13d26f5f-7303-4ae7-b6ae-4b3d59952b7a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "aa8c0794-6012-40ae-894e-a5972d1db244": {
      "main": [
        [
          {
            "node": "5d0d8f1b-d5f3-47b5-91ef-1a8dc8a2fbad",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7167c958-e821-4082-a13e-eda76c27c0be": {
      "main": [
        [
          {
            "node": "fe4be382-803a-4829-8fcb-9b492861ae3b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Étude de marché, Résumé IA

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds42
Catégorie2
Types de nœuds11
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Andrey

Andrey

@kulia

CEO of AnySite.io | Agent-first web scraping APIs for LinkedIn, Instagram, Twitter & Reddit. Try our n8n nodes for reliable, self-healing data extraction. DM for custom integrations.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34