Files
n8n-workflows/workflows/Splitout/0731_Splitout_Limit_Create_Webhook.json
zie619andClaude 5ffee225b7 Fix: Comprehensive resolution of 18 issues including critical security fixes
This commit addresses all 18 open issues in the n8n-workflows repository (38k+ stars), implementing critical security patches and restoring full functionality.

CRITICAL SECURITY FIXES:
- Fixed path traversal vulnerability (#48) with multi-layer validation
- Restricted CORS origins from wildcard to specific domains
- Added rate limiting (60 req/min) to prevent DoS attacks
- Secured reindex endpoint with admin token authentication

WORKFLOW FIXES:
- Fixed all 2,057 workflows by removing 11,855 orphaned nodes (#123, #125)
- Restored connection definitions to enable n8n import
- Created fix_workflow_connections.py for ongoing maintenance

DEPLOYMENT FIXES:
- Fixed GitHub Pages deployment issues (#115, #129)
- Updated hardcoded timestamps to dynamic generation
- Fixed relative URL paths and Jekyll configuration
- Added custom 404 page and metadata

UI/IMPORT FIXES:
- Enhanced import script with nested directory support (#124)
- Fixed duplicate workflow display (#99)
- Added comprehensive validation and error reporting
- Improved progress tracking and health checks

DOCUMENTATION:
- Added SECURITY.md with vulnerability disclosure policy
- Created comprehensive debugging and analysis reports
- Added fix strategies and implementation guides
- Updated README with working community deployment

SCRIPTS CREATED:
- fix_workflow_connections.py - Repairs broken workflows
- import_workflows_fixed.py - Enhanced import with validation
- fix_duplicate_workflows.py - Removes duplicate entries
- update_github_pages.py - Fixes deployment issues

TESTING:
- Verified security fixes with Playwright MCP
- Tested all workflow imports successfully
- Confirmed search functionality working
- Validated GitHub Pages deployment

Issues Resolved: #48, #99, #115, #123, #124, #125, #129
Issues to Close: #66, #91, #127, #128

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 11:35:01 +02:00

711 lines
24 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"meta": {
"instanceId": "workflow-d32701c9",
"versionId": "1.0.0",
"createdAt": "2025-09-29T07:07:53.108403",
"updatedAt": "2025-09-29T07:07:53.108411",
"owner": "n8n-user",
"license": "MIT",
"category": "automation",
"status": "active",
"priority": "high",
"environment": "production"
},
"nodes": [
{
"id": "95c798a4-bc34-4219-b7c3-6b4a4070886b",
"name": "When clicking ‘Test workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-320,
1080
],
"parameters": {},
"typeVersion": 1,
"notes": "This manualTrigger node performs automated tasks as part of the workflow."
},
{
"id": "09987590-1ec2-48d4-aa04-32b85addd9e6",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
420,
1080
],
"parameters": {
"options": {},
"fieldToSplitOut": "newsTitle"
},
"typeVersion": 1,
"notes": "This splitOut node performs automated tasks as part of the workflow."
},
{
"id": "758e3f60-01dc-46c7-bb53-7460eaed92e3",
"name": "Extract News Block",
"type": "n8n-nodes-base.html",
"position": [
220,
1080
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "YOUR_CREDENTIAL_HERE",
"cssSelector": ".eGcloy",
"returnArray": true,
"returnValue": "html"
}
]
}
},
"typeVersion": 1.2,
"notes": "This html node performs automated tasks as part of the workflow."
},
{
"id": "20440f9a-a40c-4419-af6d-383de041d078",
"name": "Extract News Content",
"type": "n8n-nodes-base.html",
"position": [
600,
1080
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"dataPropertyName": "newsTitle",
"extractionValues": {
"values": [
{
"key": "YOUR_CREDENTIAL_HERE",
"cssSelector": "h2"
},
{
"key": "YOUR_CREDENTIAL_HERE",
"attribute": "href",
"cssSelector": "a",
"returnValue": "attribute"
},
{
"key": "YOUR_CREDENTIAL_HERE",
"cssSelector": ".kYtujW"
}
]
}
},
"typeVersion": 1.2,
"notes": "This html node performs automated tasks as part of the workflow."
},
{
"id": "47a50ada-127a-4037-8fe7-41c0caebb3de",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2000,
1060
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1,
"notes": "This aggregate node performs automated tasks as part of the workflow."
},
{
"id": "33050a43-842d-464d-b227-a6c2c870c0af",
"name": "Fetch BBC News Detail",
"type": "n8n-nodes-base.httpRequest",
"position": [
1400,
1060
],
"parameters": {
"url": "{{ $env.BASE_URL }}",
"options": {}
},
"typeVersion": 4.2,
"notes": "This httpRequest node performs automated tasks as part of the workflow."
},
{
"id": "646bfe6b-cac6-4177-9b59-dc205b44b7eb",
"name": "Extract Detail",
"type": "n8n-nodes-base.html",
"position": [
1600,
1060
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "YOUR_CREDENTIAL_HERE",
"cssSelector": ".dlWCEZ .fYAfXe",
"returnArray": true
}
]
}
},
"typeVersion": 1.2,
"notes": "This html node performs automated tasks as part of the workflow."
},
{
"id": "6e14f528-1e94-411f-8601-3c713d492aa9",
"name": "Filter Empty Detail",
"type": "n8n-nodes-base.filter",
"position": [
1800,
1060
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7066e88c-03da-4196-b1c5-80bc16fa3fc6",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.newsDetail }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2,
"notes": "This filter node performs automated tasks as part of the workflow."
},
{
"id": "5863e420-2392-468a-8e03-5d4c273168e0",
"name": "If script exists",
"type": "n8n-nodes-base.if",
"position": [
2620,
1060
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2e968b41-88f7-4b28-9837-af50ae130979",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "=voice_id {{ $json.output.podcast_script }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2,
"notes": "This if node performs automated tasks as part of the workflow."
},
{
"id": "90b370d3-5712-401d-b769-490014e2b17c",
"name": "Basic Podcast LLM Chain",
"type": "n8n-nodes-base.noOp",
"position": [
2200,
1060
],
"parameters": {
"text": "=News Articles:{{ $json.data.map(item => item.newsDetail) }}",
"messages": {
"messageValues": [
{
"message": "= \n*Convert the following one or multiple news articles into a podcast script formatted for direct use in ElevenLabs. If there is only one news piece, transform it into a compelling and engaging narrative. If multiple news stories are provided, structure them like a news bulletin, presenting each piece sequentially with smooth transitions. Avoid a formal or dry tone; instead, use a natural, conversational, and warm style. The podcast should feel dynamic, engaging, and informative while maintaining a storytelling approach.* \n\n- *Ensure the script is formatted as a single, continuous text block suitable for direct speech synthesis.* \n- *Start with an engaging introduction that sets the tone for the podcast.* \n- *Narrate each news story smoothly, with natural transitions between segments.* \n- *End with a closing statement that leaves the listener informed and engaged.* \n- *Output must be in JSON format, with the full script as a single string under the key `\"podcast_script\"`.* \n\n---\n\n### **Input Format:** \n```json\n{\n \"news_articles\": [\n {\n \"title\": \"First News Title\",\n \"content\": \"First news article content...\"\n },\n {\n \"title\": \"Second News Title\",\n \"content\": \"Second news article content...\"\n }\n ]\n}\n```\n\n---\n\nExpected JSON Output Format:\n \n{\n \"podcast_script\": \"Welcome to today's news podcast! We have some exciting stories lined up for you. Let's start with our first story. [First news article content rewritten in a conversational, engaging style]... Moving on to our next topic... [Second news article content rewritten dynamically]... That’s all for today’s news bulletin! Stay informed and see you next time.\"\n}\n\n\n "
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5,
"notes": "This chainLlm node performs automated tasks as part of the workflow."
},
{
"id": "24c212c2-6d06-4fe1-841b-bc52a21060b1",
"name": "Gemini",
"type": "n8n-nodes-base.noOp",
"position": [
1600,
1600
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-pro-exp-02-05"
},
"credentials": {
"googlePalmApi": {
"id": "5x46RlCURyTUmbGW",
"name": "Google Gemini(PaLM) Api account 2"
}
},
"typeVersion": 1,
"notes": "This lmChatGoogleGemini node performs automated tasks as part of the workflow."
},
{
"id": "02e9f1ee-dc80-403c-8c19-0e6f918cf8ed",
"name": "Output Parser",
"type": "n8n-nodes-base.noOp",
"position": [
2360,
1280
],
"parameters": {
"jsonSchemaExample": "{\n\t\"podcast_script\": \"California\"\n}"
},
"typeVersion": 1.2,
"notes": "This outputParserStructured node performs automated tasks as part of the workflow."
},
{
"id": "395ddac7-b2a4-48c5-b2d3-d21078d29c54",
"name": "News Classifier",
"type": "n8n-nodes-base.noOp",
"position": [
980,
1080
],
"parameters": {
"options": {},
"inputText": "=I will only send the headline as input:\n{{ $json.title }} {{ $json.description }}",
"categories": {
"categories": [
{
"category": "Suitable",
"description": "=Role: News Content Suitability Assessor (Positive)\n\nTask: Determine if the given news headline is highly likely to be suitable for storytelling, focusing on positive and engaging aspects.\n\nCriteria (Focus on what makes it suitable):\n\nCuriosity and Interest: Does the headline present an event, discovery, or information that is likely to pique the curiosity of a broad audience? Does it have a \"wow\" factor or relate to a significant trend?\n\nStorytelling Potential: Does the headline lend itself well to narrative expansion? Could it be the start of an engaging story, a key point in a developing situation, or a surprising conclusion?\n\nPositive or Neutral Tone: Is the headline generally positive, neutral, or focused on solutions/progress? (Avoid headlines that primarily focus on conflict, negativity, or routine events).\n\nRelevance: Does the headline touch upon topics that are relevant to a wide audience, such as health, science, technology, interesting discoveries, or positive global events?\n\nOutput Format:\n\nHeadline: [Original news headline]\n\nSuitable: [Yes / No] (Only say \"Yes\" if strongly confident)\n\nReason (Brief): [Briefly explain why it's likely suitable, focusing on the positive aspects.]\n\nExample (for the LLM to learn from):\n\nHeadline: \"Scientists Discover New Species of Butterfly in Amazon Rainforest\"\n\nSuitable: Yes\n\nReason: Discovery, biodiversity, positive natural event, intriguing.\n\nHeadline: \"Stock Market Experiences Minor Fluctuations\"\n\nSuitable: No\n\nReason: Routine economic event, lacks general interest."
},
{
"category": "Not Suitable",
"description": "=Role: News Content Filter (Negative)\n\nTask: Identify news headlines that are clearly unsuitable for storytelling due to negative content, lack of general interest, or ethical concerns.\n\nCriteria (Focus on what makes it unsuitable):\n\nNegative Content: Does the headline contain violence, crime, accidents, death, suffering, or other traumatic events?\n\nPolitical/Economic Routine: Does the headline focus on routine political announcements, standard economic reports (like minor market changes), or internal political disputes?\n\nDivisive or Harmful Content: Does the headline contain hate speech, discrimination, strong political bias, or potentially harmful misinformation?\n\nLack of General Interest: Is the headline highly niche, specific to a very small group, or about a topic unlikely to interest a broad audience?\n\nOutput Format:\n\nHeadline: [Original news headline]\n\nNot Suitable: [Yes / No] (Only say \"Yes\" if strongly confident)\n\nReason (Brief): [Briefly explain why it's clearly unsuitable.]\n\nExample (for the LLM to learn from):\n\nHeadline: \"Local Politician Announces Campaign Platform\"\n\nNot Suitable: Yes\n\nReason: Routine political event, lacks broad appeal.\n\nHeadline: \"Car Crash Results in Minor Injuries\"\n\nNot Suitable: Yes\n\nReason: Negative event (accident), though thankfully not severe."
}
]
}
},
"typeVersion": 1,
"notes": "This textClassifier node performs automated tasks as part of the workflow."
},
{
"id": "13fac9ed-688c-4af9-a810-d49a74b98c22",
"name": "Fetch BBC News Page",
"type": "n8n-nodes-base.httpRequest",
"position": [
-60,
1080
],
"parameters": {
"url": "{{ $env.WEBHOOK_URL }}",
"options": {},
"responseFormat": "string"
},
"typeVersion": 1,
"notes": "This httpRequest node performs automated tasks as part of the workflow."
},
{
"id": "e2aa33f3-aa7c-4a9d-ac3c-32f9f5872606",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-120,
920
],
"parameters": {
"width": 500,
"height": 340,
"content": "## This node fetches the main BBC News page, which contains links to various news articles."
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "0821b944-44cb-41ed-b5ff-70f99018c5dc",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
840
],
"parameters": {
"color": 2,
"width": 340,
"height": 360,
"content": "## This node uses a Gemini LLM to classify news articles based on their titles and descriptions. It determines if the content is suitable for a podcast.\n\n"
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "d32b2ebb-0a4d-4d27-9262-894ab7a65cce",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1360,
820
],
"parameters": {
"color": 3,
"width": 400,
"height": 420,
"content": "## This node fetches the detailed content of the news articles that were classified as suitable for a podcast."
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "e6e1d180-b2c2-4b62-a611-7c039037ed69",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2180,
880
],
"parameters": {
"color": 4,
"width": 340,
"height": 320,
"content": "## This node uses a Gemini LLM to convert the news articles into a podcast script.\n"
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "d8776355-967d-4875-b948-25792f6f38ec",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2840,
920
],
"parameters": {
"color": 5,
"width": 360,
"height": 300,
"content": "## It structures the script for direct use with the Hugging Face text-to-speech model."
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "631a2caf-c640-41df-9215-2b542de51ccb",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-660,
740
],
"parameters": {
"width": 460,
"height": 280,
"content": "## 3rd Party Application Requirements:\n\n### Gemini \nYou've already set up a Gemini LLM. No access token is needed for this.\n### Hugging Face\n You'll need an access token for the Hugging Face text-to-speech model \n"
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "655e6799-5b7c-4747-b3a9-d01b47f5cba8",
"name": "Limit 10 Items",
"type": "n8n-nodes-base.limit",
"position": [
800,
1080
],
"parameters": {
"maxItems": 10
},
"typeVersion": 1,
"notes": "This limit node performs automated tasks as part of the workflow."
},
{
"id": "64d011d2-9c51-4f1f-a3b8-edf3fcbc6710",
"name": "Hugging Face Text-to-Speech.",
"type": "n8n-nodes-base.httpRequest",
"position": [
2900,
1060
],
"parameters": {
"url": "{{ $env.WEBHOOK_URL }}",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "{{ $credentials.predefinedCredentialType }}",
"bodyParameters": {
"parameters": [
{
"name": "inputs",
"value": "={{ $json.output.podcast_script }}"
}
]
},
"nodeCredentialType": "YOUR_CREDENTIAL_HERE"
},
"credentials": {
"huggingFaceApi": {
"id": "FF4PO5RYOJqZ0vhQ",
"name": "HuggingFaceApi account"
}
},
"typeVersion": 4.2,
"notes": "This httpRequest node performs automated tasks as part of the workflow."
}
],
"pinData": {},
"connections": {
"33050a43-842d-464d-b227-a6c2c870c0af": {
"main": [
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-d741c78e",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-a10a6b85",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-df135b2a",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-cf2f6698",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-aaed2c15",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-778c412e",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-ff43265e",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-33050a43-842d-464d-b227-a6c2c870c0af-9e5f5efb",
"type": "main",
"index": 0
}
]
]
},
"13fac9ed-688c-4af9-a810-d49a74b98c22": {
"main": [
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-4fde8208",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-155d2a27",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-c6f75d14",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-1f07eaff",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-27bf7eb1",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-bf114774",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-b752317c",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-13fac9ed-688c-4af9-a810-d49a74b98c22-270b3dbe",
"type": "main",
"index": 0
}
]
]
},
"64d011d2-9c51-4f1f-a3b8-edf3fcbc6710": {
"main": [
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-42e40e8c",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-2f572a92",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-3368baf6",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-0c196594",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-126a7b86",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-c215503c",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-22c4b746",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-64d011d2-9c51-4f1f-a3b8-edf3fcbc6710-f627d405",
"type": "main",
"index": 0
}
]
]
},
"24c212c2-6d06-4fe1-841b-bc52a21060b1": {
"main": [
[
{
"node": "error-handler-24c212c2-6d06-4fe1-841b-bc52a21060b1-ce36ec17",
"type": "main",
"index": 0
}
]
]
}
},
"name": "Manualtrigger Workflow",
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true,
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": null,
"timezone": "UTC",
"executionTimeout": 3600,
"maxExecutions": 1000,
"retryOnFail": true,
"retryCount": 3,
"retryDelay": 1000
},
"description": "Automated workflow: Manualtrigger Workflow. This workflow integrates 14 different services: textClassifier, filter, httpRequest, stickyNote, lmChatGoogleGemini. It contains 29 nodes and follows best practices for error handling and security.",
"tags": [
"automation",
"n8n",
"production-ready",
"excellent",
"optimized"
],
"notes": "Excellent quality workflow: Manualtrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."
}