{
  "name": "Un article devient un post LinkedIn, validé par un humain",
  "nodes": [
    {
      "id": "73739f27-71d1-4cec-a34f-1086b3a620bc",
      "name": "Formulaire de l'article",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.6,
      "position": [
        100,
        300
      ],
      "parameters": {
        "formTitle": "Transformer un article en post LinkedIn",
        "formDescription": "Collez l'adresse d'un article. Un brouillon de post vous sera proposé sur Slack pour validation.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "URL de l'article",
              "fieldType": "text",
              "placeholder": "https://www.atelier-martin.fr/blog/nouvel-atelier",
              "requiredField": true
            }
          ]
        },
        "responseMode": "onReceived",
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Préparer le post",
          "respondWithOptions": {
            "values": {
              "respondWith": "text",
              "formSubmittedText": "Merci, le brouillon arrive sur Slack dans quelques instants."
            }
          }
        }
      },
      "webhookId": "985e1025-8183-4c15-89da-961d35eb3385"
    },
    {
      "id": "1c7c1666-ae2b-4d84-bc5e-67a0395bac28",
      "name": "Récupérer la page",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.5,
      "position": [
        300,
        300
      ],
      "parameters": {
        "method": "GET",
        "url": "={{ $json[\"URL de l'article\"] }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text",
              "outputPropertyName": "data"
            }
          },
          "timeout": 20000
        }
      }
    },
    {
      "id": "287ccd73-d45c-46a4-97cd-d49c44d06f83",
      "name": "Extraire le texte de l'article",
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        500,
        300
      ],
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "titre",
              "cssSelector": "h1",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "contenu",
              "cssSelector": "article, main",
              "returnValue": "text",
              "skipSelectors": "nav, header, footer, aside, script, style, form",
              "returnArray": false
            }
          ]
        },
        "options": {
          "trimValues": true,
          "cleanUpText": true
        }
      }
    },
    {
      "id": "7068acef-35bb-47c4-9717-a1bde24c3f1c",
      "name": "Rédiger le post LinkedIn",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.9,
      "position": [
        300,
        450
      ],
      "parameters": {
        "promptType": "define",
        "text": "=Titre : {{ $json.titre }}\n\nArticle :\n{{ ($json.contenu || \"\").slice(0, 12000) }}",
        "messages": {
          "messageValues": [
            {
              "type": "SystemMessagePromptTemplate",
              "message": "Tu écris des posts LinkedIn en français pour une petite entreprise. À partir de l'article fourni, rédige un post de 120 à 200 mots : une première ligne qui accroche, deux ou trois idées clés en phrases courtes, une question finale pour inviter aux commentaires, puis trois hashtags pertinents. Ton chaleureux et professionnel, pas de jargon, pas d'emoji en excès. Réponds uniquement avec le texte du post."
            }
          ]
        }
      }
    },
    {
      "id": "44a234df-2f8f-41a2-a4f9-1ab5c79ca3b4",
      "name": "Claude",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.5,
      "position": [
        100,
        450
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-6",
          "cachedResultName": "Claude Sonnet 4.6"
        },
        "options": {
          "temperature": 0.6
        }
      },
      "credentials": {}
    },
    {
      "id": "eca254aa-1df4-4bca-8f9d-61665ad7552b",
      "name": "Demander la validation sur Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.6,
      "position": [
        500,
        450
      ],
      "parameters": {
        "resource": "message",
        "operation": "sendAndWait",
        "authentication": "accessToken",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Canal validation (à choisir)"
        },
        "message": "=Nouveau brouillon de post LinkedIn à partir de {{ $(\"Formulaire de l'article\").item.json[\"URL de l'article\"] }}\n\n{{ $json.text }}",
        "responseType": "approval",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "Publier",
            "disapproveLabel": "Refuser"
          }
        },
        "options": {
          "appendAttribution": false,
          "limitWaitTime": {
            "values": {
              "limitType": "afterTimeInterval",
              "resumeAmount": 2,
              "resumeUnit": "days"
            }
          }
        }
      },
      "credentials": {},
      "webhookId": "b71016e6-2d3f-4926-afd7-f3bcfdd71c73"
    },
    {
      "id": "d6b8a87b-444e-4be9-82bd-691c97a3714b",
      "name": "Post validé ?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        700,
        450
      ],
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "leftValue": "={{ $json.data?.approved }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "rightValue": ""
            }
          ],
          "combinator": "and"
        },
        "options": {}
      }
    },
    {
      "id": "0a1acc62-8fac-4697-af25-cf7711116945",
      "name": "Publier sur LinkedIn",
      "type": "n8n-nodes-base.linkedIn",
      "typeVersion": 1,
      "position": [
        900,
        450
      ],
      "parameters": {
        "resource": "post",
        "operation": "create",
        "authentication": "standard",
        "postAs": "person",
        "person": "",
        "text": "={{ $(\"Rédiger le post LinkedIn\").item.json.text }}",
        "shareMediaCategory": "ARTICLE",
        "additionalFields": {
          "originalUrl": "={{ $(\"Formulaire de l'article\").item.json[\"URL de l'article\"] }}",
          "title": "={{ $(\"Extraire le texte de l'article\").item.json.titre }}",
          "visibility": "PUBLIC"
        }
      },
      "credentials": {}
    },
    {
      "id": "cad28033-85d5-4a9d-a701-bd33ce876464",
      "name": "Signaler le refus sur Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.6,
      "position": [
        900,
        600
      ],
      "parameters": {
        "resource": "message",
        "operation": "post",
        "authentication": "accessToken",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Canal validation (à choisir)"
        },
        "messageType": "text",
        "text": "=Post refusé, rien n'a été publié sur LinkedIn.\nArticle : {{ $(\"Formulaire de l'article\").item.json[\"URL de l'article\"] }}",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {}
    },
    {
      "id": "241dc2dc-804b-4ae3-8a44-9104a4a60453",
      "name": "À configurer",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        64,
        208
      ],
      "parameters": {
        "content": "## À configurer\n- **Anthropic** : ajoutez votre clé API dans le nœud Claude.\n- **Slack** : connectez votre espace puis choisissez le canal de validation dans les deux nœuds Slack.\n- **LinkedIn** : connectez votre compte puis choisissez votre profil dans le nœud Publier sur LinkedIn.\n- Sans réponse sous 2 jours, le post est considéré comme refusé.",
        "color": 4,
        "width": 560,
        "height": 224
      }
    },
    {
      "id": "9a96fbb4-ec88-4400-ab52-23e7f31fa7ed",
      "name": "L'idée",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        464,
        352
      ],
      "parameters": {
        "content": "## L'idée\nVous collez l'adresse d'un article, Claude en tire un post LinkedIn. Rien ne part sans votre accord : le brouillon arrive sur Slack avec deux boutons, Publier ou Refuser.",
        "color": 7,
        "width": 560,
        "height": 368
      }
    }
  ],
  "connections": {
    "Formulaire de l'article": {
      "main": [
        [
          {
            "node": "Récupérer la page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Récupérer la page": {
      "main": [
        [
          {
            "node": "Extraire le texte de l'article",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extraire le texte de l'article": {
      "main": [
        [
          {
            "node": "Rédiger le post LinkedIn",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rédiger le post LinkedIn": {
      "main": [
        [
          {
            "node": "Demander la validation sur Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude": {
      "ai_languageModel": [
        [
          {
            "node": "Rédiger le post LinkedIn",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Demander la validation sur Slack": {
      "main": [
        [
          {
            "node": "Post validé ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post validé ?": {
      "main": [
        [
          {
            "node": "Publier sur LinkedIn",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Signaler le refus sur Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}