源发现 - 自动搜索更及时的信息源
高级
这是一个Market Research, AI Summarization领域的自动化工作流,包含 68 个节点。主要使用 Set, Code, Limit, Merge, Filter 等节点。 多平台源发现系统,集成 SerpAPI、DuckDuckGo、GitHub、Reddit 和 Bluesky
前置要求
- •可能需要目标 API 的认证凭证
使用的节点 (68)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "l3q1m2TZDbwizwGn",
"meta": {
"instanceId": "c8661626eeda758e004fa6cdc30e89de83810c1ff0923b0bb91a200abd0100f3",
"templateCredsSetupCompleted": true
},
"name": "源发现 - 自动搜索更及时的信息源",
"tags": [
{
"id": "7Ebg06QToXQ2UrOO",
"name": "WHITE LABEL",
"createdAt": "2025-07-17T18:04:33.197Z",
"updatedAt": "2025-07-17T18:04:33.197Z"
},
{
"id": "JK3I68rY6cIlUP5Z",
"name": "V1.0",
"createdAt": "2025-06-20T18:01:10.400Z",
"updatedAt": "2025-06-20T18:01:10.400Z"
},
{
"id": "QJOKfP6e64mUtezh",
"name": "Source Discovery",
"createdAt": "2025-07-11T23:43:47.597Z",
"updatedAt": "2025-08-06T20:59:12.981Z"
},
{
"id": "nEQ2nHALSQN4jgJ0",
"name": "Free",
"createdAt": "2025-06-25T21:55:38.353Z",
"updatedAt": "2025-06-25T21:55:38.353Z"
}
],
"nodes": [
{
"id": "595e8cac-a963-4776-9d8d-e0fda9fadc73",
"name": "便签17",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-288
],
"parameters": {
"color": 5,
"width": 1580,
"height": 760,
"content": "## 使用 DuckDuckGo 和 Bluesky 进行搜索查询"
},
"typeVersion": 1
},
{
"id": "5d5fb335-068e-4262-8242-aedf5fd3d211",
"name": "过滤字段",
"type": "n8n-nodes-base.set",
"position": [
336,
48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "e2ffe594-180d-4e1d-b869-8056ac67015d",
"name": "title",
"type": "string",
"value": "={{ $json.title }}"
},
{
"id": "87c5a171-9ab9-4043-a72a-32aec218fe63",
"name": "pubDate",
"type": "string",
"value": "={{ $json.date }}"
},
{
"id": "978b05c9-6e6b-4a18-bc06-4de785b19413",
"name": "link",
"type": "string",
"value": "={{ $json.url }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "52a92dde-ed73-4740-be96-1b09ba03c328",
"name": "DuckDuckGo",
"type": "n8n-nodes-duckduckgo-search.duckDuckGo",
"position": [
128,
48
],
"parameters": {
"newsQuery": "={{ $json.search_themes }}",
"operation": "searchNews",
"cacheSettings": {
"cacheTTL": 300,
"enableCache": true
},
"proxySettings": {},
"newsSearchOptions": {
"region": "wt-wt",
"maxResults": 100,
"safeSearch": 0
}
},
"typeVersion": 1
},
{
"id": "f138753e-87a4-488f-b76c-0fca466b4402",
"name": "遍历项目(搜索)",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-32,
-128
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "1c6dd5b2-5fde-4dd6-a0ce-9343a50dc51f",
"name": "拆分输出",
"type": "n8n-nodes-base.splitOut",
"position": [
-848,
720
],
"parameters": {
"options": {},
"fieldToSplitOut": "search_themes"
},
"typeVersion": 1
},
{
"id": "5440ef06-7711-47cc-a758-24391be05585",
"name": "Bluesky 搜索",
"type": "n8n-nodes-bluesky-enhanced.bluesky",
"position": [
128,
208
],
"parameters": {
"q": "={{ $json.search_themes }}",
"limit": 10,
"resource": "search",
"operation": "searchPosts"
},
"credentials": {
"blueskyApi": {
"id": "extLnOXNko6WCgUR",
"name": "Blank Bluesky Credentials"
}
},
"typeVersion": 2
},
{
"id": "38c87790-9d0c-43eb-8f83-576bf2d5bd62",
"name": "编辑字段(Bluesky)",
"type": "n8n-nodes-base.set",
"position": [
304,
208
],
"parameters": {
"options": {
"ignoreConversionErrors": true
},
"assignments": {
"assignments": [
{
"id": "17a6bee3-c6f1-4e27-b170-31557516a29f",
"name": "title",
"type": "string",
"value": "=Bluesky Search - {{ $json.author.displayName }} - {{ $json.embed.external.title }}"
},
{
"id": "e0ee92e7-0dca-4b15-9570-4f0c599872b7",
"name": "pubDate",
"type": "string",
"value": "={{ $json.indexedAt }}"
},
{
"id": "f9f1da0c-79fe-4c59-9eca-9f058bf7128c",
"name": "link",
"type": "string",
"value": "={{ $json.embed.external.uri }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "4fb13374-aa77-4d91-a1a3-c17259f4f515",
"name": "移除空链接元素",
"type": "n8n-nodes-base.filter",
"position": [
480,
240
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.link }}",
"rightValue": "={{ $today.minus({ days: 0 }) }}"
}
]
}
},
"typeVersion": 2.2,
"alwaysOutputData": true
},
{
"id": "0a5c2591-6bca-4d42-9810-522c0457cc3a",
"name": "合并1",
"type": "n8n-nodes-base.merge",
"position": [
704,
256
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "8c29882d-1613-4187-9bfc-f14e8a15bed2",
"name": "Google_news 搜索",
"type": "n8n-nodes-serpapi.serpApi",
"position": [
240,
864
],
"parameters": {
"q": "={{ $json.search_themes }}",
"operation": "google_news",
"requestOptions": {},
"additionalFields": {}
},
"credentials": {
"serpApi": {
"id": "VsA9ILHrt3wF6xP8",
"name": "Blank SerpApi account"
}
},
"typeVersion": 1
},
{
"id": "eeb3a274-3690-4f26-94fd-99c6cc899d5e",
"name": "循环过滤字段",
"type": "n8n-nodes-base.set",
"position": [
816,
864
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "e2ffe594-180d-4e1d-b869-8056ac67015d",
"name": "title",
"type": "string",
"value": "={{ $json.title }}"
},
{
"id": "87c5a171-9ab9-4043-a72a-32aec218fe63",
"name": "pubDate",
"type": "string",
"value": "={{ $json.date }}"
},
{
"id": "978b05c9-6e6b-4a18-bc06-4de785b19413",
"name": "link",
"type": "string",
"value": "={{ $json.link }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "283558c4-2779-4b3b-94b7-48f886a200cb",
"name": "拆分新闻结果",
"type": "n8n-nodes-base.splitOut",
"position": [
432,
864
],
"parameters": {
"options": {},
"fieldToSplitOut": "news_results"
},
"typeVersion": 1
},
{
"id": "275508f1-ef16-40e3-a67f-5f568f65a5fa",
"name": "便签27",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
512
],
"parameters": {
"color": 5,
"width": 1580,
"height": 720,
"content": "## 使用 SerpAPI 进行搜索查询"
},
"typeVersion": 1
},
{
"id": "3686c81a-a017-4f77-90a4-11c0b706bdeb",
"name": "调度",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2848,
992
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1,
2,
5,
3,
4
],
"triggerAtHour": 12
}
]
}
},
"typeVersion": 1.2
},
{
"id": "3e18e79b-47f4-4fb4-8a73-a83243cb36ab",
"name": "便签12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2016,
-368
],
"parameters": {
"color": 7,
"width": 1060,
"height": 796,
"content": "## 源发现 - 自动搜索更及时的信息源"
},
"typeVersion": 1
},
{
"id": "8e9216fd-ef99-454a-b51c-2f1907e387ec",
"name": "便签30",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1200,
-304
],
"parameters": {
"color": 7,
"width": 150,
"content": ""
},
"typeVersion": 1
},
{
"id": "0897ce2a-b17a-4123-8a61-634ccd48731f",
"name": "合并",
"type": "n8n-nodes-base.merge",
"position": [
1728,
768
],
"parameters": {
"numberInputs": 4
},
"typeVersion": 3.1
},
{
"id": "75edbbce-fa43-49b8-b284-62e84c2b567d",
"name": "移除重复项",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
2240,
784
],
"parameters": {
"compare": "allFieldsExcept",
"options": {},
"fieldsToExclude": "pubDate"
},
"typeVersion": 2
},
{
"id": "5d35a167-b63f-4469-8cd9-47a4b5474525",
"name": "移除空值",
"type": "n8n-nodes-base.filter",
"position": [
2016,
784
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2df9ef75-ea55-4e5b-a78d-e37de85fe8ca",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.link }}",
"rightValue": ""
},
{
"id": "f74c0863-d9c3-465a-b6e9-f5616d25dec2",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.title }}",
"rightValue": "^(?:\\s*\\S+\\s+){0,2}\\s*\\S+\\s*$"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "389bf473-c8a0-46b9-a63d-e3fd9544a9de",
"name": "移除现有内容",
"type": "n8n-nodes-base.filter",
"position": [
2720,
784
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
"operator": {
"type": "string",
"operation": "notContains"
},
"leftValue": "={{ $('Configure Workflow Args (Prep)').item.json.existing_sources }}",
"rightValue": "={{ $json.baseUrl }}"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "5a2b70aa-8e85-41e9-98b1-d075af479380",
"name": "获取基础 URL",
"type": "n8n-nodes-base.code",
"position": [
2480,
784
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n const inputUrl = item.json.link;\n const baseUrl = getBaseUrl(inputUrl);\n item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "290c077d-d5ff-40dd-9dae-8ad48a713d3d",
"name": "保留剩余来源",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
2960,
784
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "696da287-5535-4487-b69f-65d01bffeaa8",
"name": "baseUrl",
"type": "string",
"value": "={{ $json.baseUrl }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "9cd4fa0d-493c-4b54-8467-e4ad05b31bab",
"name": "移除重复 URL",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
3184,
784
],
"parameters": {
"options": {}
},
"typeVersion": 2
},
{
"id": "029b2480-e2c7-4dd5-835e-6e7c65c9c4c9",
"name": "配置工作流参数",
"type": "n8n-nodes-globals.globalConstants",
"notes": "This is useful to quickly setting variables for new workflow variants. Additionally:\n- It helps avoid leaving important information in a node when creating new templates to share.\n- Easier to add new variables.",
"position": [
-2608,
992
],
"parameters": {},
"credentials": {
"globalConstantsApi": {
"id": "IL1NFgjnFjgv1gvg",
"name": "Global Constants for News Curator - V3"
}
},
"typeVersion": 1
},
{
"id": "a450289d-d558-4494-b356-6bd3a38f14d1",
"name": "编辑字段",
"type": "n8n-nodes-base.set",
"position": [
-2416,
992
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "22f11d71-307d-4c6a-9594-7ffbfaac5ccb",
"name": "rss_feeds",
"type": "array",
"value": "={{ $json.constants.rss_feeds }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1ce72ec2-d1e6-485b-9e12-df1f68f73e81",
"name": "聚合",
"type": "n8n-nodes-base.aggregate",
"position": [
-1584,
992
],
"parameters": {
"options": {
"mergeLists": false
},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "existing_sources_to_add",
"fieldToAggregate": "baseUrl"
}
]
}
},
"typeVersion": 1
},
{
"id": "8845c095-5f3c-424b-8ff7-a7cd293d80a9",
"name": "获取来源的基础 URL",
"type": "n8n-nodes-base.code",
"position": [
-2016,
992
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n const inputUrl = item.json.link;\n const baseUrl = getBaseUrl(inputUrl);\n item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "24d32321-760c-4ad3-b3eb-ab9cdc64f5c1",
"name": "拆分订阅源列表",
"type": "n8n-nodes-base.splitOut",
"position": [
-2224,
992
],
"parameters": {
"options": {},
"fieldToSplitOut": "rss_feeds"
},
"typeVersion": 1
},
{
"id": "095564ab-1b05-42d7-9de7-d912b10a9894",
"name": "移除重复来源",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
-1792,
992
],
"parameters": {
"compare": "selectedFields",
"options": {},
"fieldsToCompare": "baseUrl"
},
"typeVersion": 2
},
{
"id": "917060f7-0fbd-490e-bfbd-1194161e924d",
"name": "当点击\"执行工作流\"时",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1680,
576
],
"parameters": {},
"typeVersion": 1
},
{
"id": "29b46bc4-0a18-4e7a-99c3-3fdf5a3fde7c",
"name": "配置工作流参数(准备)",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
-1072,
720
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "696da287-5535-4487-b69f-65d01bffeaa8",
"name": "search_themes",
"type": "array",
"value": "={{ $json.search_themes }}"
},
{
"id": "f72affa2-1b85-4207-b245-fee0e47cd526",
"name": "existing_sources",
"type": "array",
"value": "={{ $json.existing_sources }}"
},
{
"id": "94eb38bc-2861-4292-96cd-e40c2661c501",
"name": "sources_to_ignore",
"type": "array",
"value": "={{ $json.sources_to_ignore }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "fa48b9d1-79af-4fc8-b7e3-d9654f03e4c3",
"name": "配置工作流参数(手动)",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
-1424,
576
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "696da287-5535-4487-b69f-65d01bffeaa8",
"name": "search_themes",
"type": "array",
"value": "=[\n\"technology\"\n]"
},
{
"id": "f72affa2-1b85-4207-b245-fee0e47cd526",
"name": "existing_sources",
"type": "array",
"value": "=[]"
},
{
"id": "0867ad11-9a76-4398-a582-455c1ddf92b2",
"name": "sources_to_ignore",
"type": "array",
"value": "[]"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "122a5da7-bdf6-4473-8e18-31fb7dbc82df",
"name": "添加其他字段",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
-1360,
992
],
"parameters": {
"options": {
"ignoreConversionErrors": false
},
"assignments": {
"assignments": [
{
"id": "696da287-5535-4487-b69f-65d01bffeaa8",
"name": "search_themes",
"type": "array",
"value": "={{ $('Configure Workflow Args').item.json.constants.search_themes }}"
},
{
"id": "f72affa2-1b85-4207-b245-fee0e47cd526",
"name": "existing_sources",
"type": "array",
"value": "={{ $json.existing_sources_to_add.concat($('Configure Workflow Args').item.json.constants.existing_sources || []) }}"
},
{
"id": "002f4fbe-810f-4384-9552-3a5eaac39ce1",
"name": "sources_to_ignore",
"type": "array",
"value": "={{ $('Configure Workflow Args').item.json.constants.sources_to_ignore || [] }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1b3d4954-d6f3-426a-8c69-6561d711b3ad",
"name": "HTTP 请求",
"type": "n8n-nodes-base.httpRequest",
"position": [
-448,
2256
],
"parameters": {
"url": "https://api.github.com/search/repositories",
"options": {
"response": {
"response": {
"fullResponse": true
}
},
"pagination": {
"pagination": {
"parameters": {
"parameters": [
{
"name": "q",
"value": "=awesome links for {{ $json.search_themes }}"
},
{
"name": "per_page",
"value": "10"
},
{
"name": "page",
"value": "0"
}
]
},
"maxRequests": 1,
"requestInterval": 1000,
"limitPagesFetched": true
}
}
}
},
"typeVersion": 4.2
},
{
"id": "8cf3f2e7-44e6-4362-ae80-434c95d7b83c",
"name": "抓取 README",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
272,
2256
],
"parameters": {
"url": "={{ $json.body.download_url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "6a4c9a07-ab2b-4e30-a97b-c1b7a7d75e15",
"name": "拆分仓库列表",
"type": "n8n-nodes-base.splitOut",
"position": [
-256,
2480
],
"parameters": {
"options": {},
"fieldToSplitOut": "body.items"
},
"typeVersion": 1
},
{
"id": "785dc6c0-8c80-49a4-a5a3-024db6b4a52d",
"name": "HTTP 请求 README",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
80,
2464
],
"parameters": {
"url": "={{ $json.readme_url }}",
"options": {
"timeout": 10000,
"response": {
"response": {
"fullResponse": true
}
}
}
},
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "34cc92b1-32f1-499f-92bb-6c27c3fd08cc",
"name": "添加 README 字段",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
-80,
2256
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
"name": "readme_url",
"type": "string",
"value": "={{ $json.url }}/readme"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "5e849da5-3c8b-4922-803e-679eea498f58",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-528,
2032
],
"parameters": {
"color": 5,
"width": 1996,
"height": 720,
"content": "## 使用 Github 进行搜索查询(带链接的仓库)"
},
"typeVersion": 1
},
{
"id": "5f29ba9d-b1ee-439d-91ad-c7ce7da11731",
"name": "移除忽略的来源",
"type": "n8n-nodes-base.filter",
"position": [
3408,
784
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
"operator": {
"type": "string",
"operation": "notContains"
},
"leftValue": "={{ $('Configure Workflow Args (Prep)').item.json.sources_to_ignore }}",
"rightValue": "={{ $json.baseUrl }}"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "be4e1de2-c8e3-4565-a6a1-355617aa9705",
"name": "获取 Subreddit 列表",
"type": "n8n-nodes-base.reddit",
"position": [
-432,
1488
],
"parameters": {
"limit": 1,
"filters": {
"keyword": "={{ $json.search_themes }}",
"trending": false
},
"resource": "subreddit",
"operation": "getAll"
},
"typeVersion": 1
},
{
"id": "fa4271b2-8117-470b-bc4a-34f2deaecebb",
"name": "RSS 读取",
"type": "n8n-nodes-base.rssFeedRead",
"onError": "continueErrorOutput",
"position": [
-16,
1648
],
"parameters": {
"url": "={{ $json.reddit_rss }}",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "48a46aef-477c-42c4-862b-90bec4c738f4",
"name": "准备 Reddit RSS",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
-224,
1648
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
"name": "reddit_rss",
"type": "string",
"value": "=https://www.reddit.com/r/{{ $json.name }}/.rss"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "af47dcec-2aa6-4af5-8bcb-a8e3d99f4c42",
"name": "从帖子中抓取链接",
"type": "n8n-nodes-base.code",
"position": [
160,
1520
],
"parameters": {
"jsCode": "function extractLinks(text) {\n const urlPattern = /https?:\\/\\/[^\\s\"'>]+/g; // Regular expression to match URLs\n return text.match(urlPattern) || []; // Return an array of matched URLs or an empty array\n}\n\n// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n const inputString = item.json.content;\n const links = extractLinks(inputString);\n item.json.sources = links;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "cefb0d33-79fe-4275-8e0d-d96da2b1c82d",
"name": "获取 Reddit 来源的基础 URL",
"type": "n8n-nodes-base.code",
"position": [
528,
1520
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n const inputUrl = item.json.sources;\n const baseUrl = getBaseUrl(inputUrl);\n item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "a22a8928-c9a6-47b0-88ba-602f3847008e",
"name": "移除重复的 Reddit 来源",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
720,
1520
],
"parameters": {
"compare": "selectedFields",
"options": {},
"fieldsToCompare": "baseUrl"
},
"typeVersion": 2
},
{
"id": "c4c16192-2b42-446e-b2d4-0dbb6884c880",
"name": "准备 Reddit 来源结果",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
944,
1360
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
"name": "title",
"type": "string",
"value": "={{ $json.sources }}"
},
{
"id": "c7fa4b82-1c6c-4175-a95a-fb7331dc0ed3",
"name": "pubDate",
"type": "string",
"value": "={{ $today }}"
},
{
"id": "34d8eb5d-01d0-477c-bda0-8bd63dd262ec",
"name": "link",
"type": "string",
"value": "={{ $json.baseUrl }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "0fe69cac-6370-49fa-a33c-2caa51977495",
"name": "便签28",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
1264
],
"parameters": {
"color": 5,
"width": 1580,
"height": 720,
"content": "## 使用 Reddit 进行搜索查询"
},
"typeVersion": 1
},
{
"id": "5e0beb0f-120d-41f8-9eb2-83fc49a2f68a",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1600,
400
],
"parameters": {
"color": 5,
"width": 2000,
"height": 816,
"content": "## 现有和不良来源的过滤步骤"
},
"typeVersion": 1
},
{
"id": "947716d4-6731-42ae-b1f5-79caf1a2f34d",
"name": "Mistral Cloud Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
"position": [
4448,
1056
],
"parameters": {
"options": {}
},
"credentials": {
"mistralCloudApi": {
"id": "i9fED0hhcQnPZBi6",
"name": "Blank Account"
}
},
"typeVersion": 1
},
{
"id": "c3677e5d-5e14-47c6-96f0-f496787ed0d1",
"name": "限制",
"type": "n8n-nodes-base.limit",
"position": [
3744,
784
],
"parameters": {
"maxItems": 36
},
"typeVersion": 1
},
{
"id": "ccbc3f13-20a9-465c-97a4-e607a80049de",
"name": "HTTP 请求获取 URL 内容",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
3968,
784
],
"parameters": {
"url": "={{ $json.baseUrl }}",
"options": {
"timeout": 2100
}
},
"typeVersion": 4.2
},
{
"id": "21479b32-a984-48cc-93ae-301667edff76",
"name": "移除错误",
"type": "n8n-nodes-base.filter",
"position": [
464,
2448
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": "={{ $json.baseUrl }}"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "f837603e-a1d6-4785-9a22-1ab9f3a64721",
"name": "从 README 抓取链接",
"type": "n8n-nodes-base.code",
"position": [
656,
2256
],
"parameters": {
"jsCode": "function extractLinks(text) {\n const urlPattern = /https?:\\/\\/[^\\s\"'>)(]+/g; // Regular expression to match URLs\n return text.match(urlPattern) || []; // Return an array of matched URLs or an empty array\n}\n\n// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n const inputString = item.json.data;\n const links = extractLinks(inputString);\n item.json.sources = links;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "b17bdf65-36cb-4df3-802e-7af4e2316e6c",
"name": "拆分来源",
"type": "n8n-nodes-base.splitOut",
"position": [
352,
1520
],
"parameters": {
"options": {},
"fieldToSplitOut": "sources"
},
"typeVersion": 1
},
{
"id": "45b44c9a-e28b-42d6-a1b6-6cb34461408c",
"name": "拆分 Github 来源",
"type": "n8n-nodes-base.splitOut",
"position": [
848,
2448
],
"parameters": {
"options": {},
"fieldToSplitOut": "sources"
},
"typeVersion": 1
},
{
"id": "9f31d625-6952-4bfc-8e9f-3a014ddb7dce",
"name": "获取 Github 来源的基础 URL",
"type": "n8n-nodes-base.code",
"position": [
1040,
2256
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n const inputUrl = item.json.sources;\n const baseUrl = getBaseUrl(inputUrl);\n item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "38a532cf-c6ae-4294-9f44-67c9bc90db0d",
"name": "准备 Github 来源结果",
"type": "n8n-nodes-base.set",
"notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
"position": [
1264,
2144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
"name": "title",
"type": "string",
"value": "={{ $json.sources }}"
},
{
"id": "c7fa4b82-1c6c-4175-a95a-fb7331dc0ed3",
"name": "pubDate",
"type": "string",
"value": "={{ $today }}"
},
{
"id": "34d8eb5d-01d0-477c-bda0-8bd63dd262ec",
"name": "link",
"type": "string",
"value": "={{ $json.baseUrl }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "cac06128-2f90-4999-b87e-f936412f229b",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
3664,
464
],
"parameters": {
"width": 1168,
"height": 752,
"content": "## 最终步骤:来源选择"
},
"typeVersion": 1
},
{
"id": "9101a285-bf16-48ea-828e-1bae09adc92f",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2912,
480
],
"parameters": {
"color": 4,
"width": 2256,
"height": 720,
"content": "## 设置和启动"
},
"typeVersion": 1
},
{
"id": "fc39ad99-56cf-4b2d-a7e4-bdcc858f1dfa",
"name": "信息提取器",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"onError": "continueErrorOutput",
"position": [
4448,
784
],
"parameters": {
"text": "=Check this link: {{ $('Limit').item.json.baseUrl }}.\nCheck its content: \"\"\"{{ $json.data }}\"\"\"\n\nFollow the provided JSON schema for your response.",
"options": {
"systemPromptTemplate": "You are an expert extraction algorithm.\nOnly extract relevant information from the text.\nIf you do not know the value of an attribute asked to extract, you may omit the attribute's value."
},
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"data\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"The link to the website.\"\n },\n \"relevance\": {\n \"type\": \"boolean\",\n \"description\": \"If the website content is relevant or not.\"\n },\n \"updated\": {\n \"type\": \"string\",\n \"description\": \"How recent are the updates in the website content.\"\n },\n \"accessible\": {\n \"type\": \"boolean\",\n \"description\": \"If it was possible to access the website content through the tool.\"\n }\n },\n \"required\": [\"url\", \"relevance\", \"updated\", \"accessible\"],\n \"additionalProperties\": false\n }\n }\n },\n \"required\": [\"data\"],\n \"additionalProperties\": false\n}"
},
"typeVersion": 1.2
},
{
"id": "be2fae8c-8636-4afe-b874-73b4396cb1c0",
"name": "便签38",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2656,
672
],
"parameters": {
"color": 7,
"width": 736,
"height": 260,
"content": "**配置工作流参数**:"
},
"typeVersion": 1
},
{
"id": "e1498796-014a-4cad-9d65-01e643b30332",
"name": "便签32",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2432,
-368
],
"parameters": {
"color": 7,
"width": 400,
"height": 796,
"content": "### 信息 - 使用的 n8n 设置"
},
"typeVersion": 1
},
{
"id": "cb82e1aa-c564-4083-8ad5-c5b0d6abbaf5",
"name": "遍历项目(搜索)2",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-144,
736
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "d54066cf-ddd5-4982-a19c-50e99ae306d2",
"name": "移除空链接元素 2",
"type": "n8n-nodes-base.filter",
"notes": "This is happening to SerpAPI results for some reason.",
"position": [
624,
864
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.link }}",
"rightValue": "={{ $today.minus({ days: 0 }) }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "300f2a46-8da8-4a9b-b8e6-68ff173cbcd3",
"name": "代码(限制字符数)",
"type": "n8n-nodes-base.code",
"position": [
4208,
784
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n // Check if item.json.data exists and is a string\n if (item.json.data && typeof item.json.data === 'string') {\n item.json.data = item.json.data.substring(0, 1500);\n } else {\n // Optionally, you can set a default value or handle the case where data is undefined\n item.json.data = ''; // or any default value you prefer\n }\n}\n\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "dc195b6c-65f6-4c32-9ccb-63562b8312a0",
"name": "便签31",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2112,
1424
],
"parameters": {
"color": 3,
"width": 680,
"height": 528,
"content": "## 工作流参数示例"
},
"typeVersion": 1
},
{
"id": "79dd95d9-7890-4aa5-b1d6-2ae8294fb391",
"name": "便签7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
112
],
"parameters": {
"color": 7,
"width": 440,
"height": 344,
"content": "### 备注"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {
"Schedule": [
{
"json": {
"Hour": "14",
"Year": "2025",
"Month": "August",
"Minute": "38",
"Second": "15",
"Timezone": "America/New_York (UTC-04:00)",
"timestamp": "2025-08-06T14:38:15.844-04:00",
"Day of week": "Wednesday",
"Day of month": "06",
"Readable date": "August 6th 2025, 2:38:15 pm",
"Readable time": "2:38:15 pm"
}
}
]
},
"settings": {
"executionOrder": "v1"
},
"versionId": "5932dc5c-2b85-401d-9e79-c8311414d0b1",
"connections": {
"Limit": {
"main": [
[
{
"node": "HTTP Request to get URL Content",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Remove Empty",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "Loop Over Items (Search)",
"type": "main",
"index": 0
}
]
]
},
"RSS Read": {
"main": [
[
{
"node": "Grab Links from Threads",
"type": "main",
"index": 0
}
]
]
},
"Schedule": {
"main": [
[
{
"node": "Configure Workflow Args",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Add Other Fields",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Loop Over Items (Search)",
"type": "main",
"index": 0
},
{
"node": "Loop Over Items (Search) 2",
"type": "main",
"index": 0
},
{
"node": "Get list of Subreddits",
"type": "main",
"index": 0
},
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"DuckDuckGo": {
"main": [
[
{
"node": "Filter Fields",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Split Out Feed List",
"type": "main",
"index": 0
}
]
]
},
"Get Base URL": {
"main": [
[
{
"node": "Remove Existing Content",
"type": "main",
"index": 0
}
]
]
},
"Grab READMEs": {
"main": [
[
{
"node": "Remove Errors",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Split Out Repo List",
"type": "main",
"index": 0
}
]
]
},
"Remove Empty": {
"main": [
[
{
"node": "Remove Duplicates",
"type": "main",
"index": 0
}
]
]
},
"Filter Fields": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Remove Errors": {
"main": [
[
{
"node": "Grab Links from README",
"type": "main",
"index": 0
}
]
]
},
"Bluesky Search": {
"main": [
[
{
"node": "Edit Fields (Bluesky)",
"type": "main",
"index": 0
}
]
]
},
"Add Other Fields": {
"main": [
[
{
"node": "Configure Workflow Args (Prep)",
"type": "main",
"index": 0
}
]
]
},
"Add README field": {
"main": [
[
{
"node": "HTTP Request the READMEs",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates": {
"main": [
[
{
"node": "Get Base URL",
"type": "main",
"index": 0
}
]
]
},
"Split Out Sources": {
"main": [
[
{
"node": "Get Base URL of Reddit Sources",
"type": "main",
"index": 0
}
]
]
},
"Google_news search": {
"main": [
[
{
"node": "Split Out News Results",
"type": "main",
"index": 0
}
]
]
},
"Prepare Reddit RSS": {
"main": [
[
{
"node": "RSS Read",
"type": "main",
"index": 0
}
]
]
},
"Split Out Feed List": {
"main": [
[
{
"node": "Get Base URL of Sources",
"type": "main",
"index": 0
}
]
]
},
"Split Out Repo List": {
"main": [
[
{
"node": "Add README field",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields (Bluesky)": {
"main": [
[
{
"node": "Remove Elements with Empty Links",
"type": "main",
"index": 0
}
]
]
},
"Filter Fields for Loop": {
"main": [
[
{
"node": "Loop Over Items (Search) 2",
"type": "main",
"index": 0
}
]
]
},
"Get list of Subreddits": {
"main": [
[
{
"node": "Prepare Reddit RSS",
"type": "main",
"index": 0
}
]
]
},
"Grab Links from README": {
"main": [
[
{
"node": "Split Out Github Sources",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates Urls": {
"main": [
[
{
"node": "Remove Ignored Sources",
"type": "main",
"index": 0
}
]
]
},
"Remove Ignored Sources": {
"main": [
[
{
"node": "Limit",
"type": "main",
"index": 0
}
]
]
},
"Split Out News Results": {
"main": [
[
{
"node": "Remove Elements with Empty Links 2",
"type": "main",
"index": 0
}
]
]
},
"Configure Workflow Args": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Get Base URL of Sources": {
"main": [
[
{
"node": "Remove Duplicates Sources",
"type": "main",
"index": 0
}
]
]
},
"Grab Links from Threads": {
"main": [
[
{
"node": "Split Out Sources",
"type": "main",
"index": 0
}
]
]
},
"Leave Remaining Sources": {
"main": [
[
{
"node": "Remove Duplicates Urls",
"type": "main",
"index": 0
}
]
]
},
"Remove Existing Content": {
"main": [
[
{
"node": "Leave Remaining Sources",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request the READMEs": {
"main": [
[
{
"node": "Grab READMEs",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items (Search)": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
],
[
{
"node": "DuckDuckGo",
"type": "main",
"index": 0
},
{
"node": "Bluesky Search",
"type": "main",
"index": 0
}
]
]
},
"Mistral Cloud Chat Model": {
"ai_languageModel": [
[
{
"node": "Information Extractor",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Split Out Github Sources": {
"main": [
[
{
"node": "Get Base URL of Github Sources",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates Sources": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items (Search) 2": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
],
[
{
"node": "Google_news search",
"type": "main",
"index": 0
}
]
]
},
"Prepare Github Source Results": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 3
}
]
]
},
"Prepare Reddit Source Results": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"Configure Workflow Args (Prep)": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Get Base URL of Github Sources": {
"main": [
[
{
"node": "Prepare Github Source Results",
"type": "main",
"index": 0
}
]
]
},
"Get Base URL of Reddit Sources": {
"main": [
[
{
"node": "Remove Duplicates Reddit Sources",
"type": "main",
"index": 0
}
]
]
},
"Code (Limiting number of Chars)": {
"main": [
[
{
"node": "Information Extractor",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request to get URL Content": {
"main": [
[
{
"node": "Code (Limiting number of Chars)",
"type": "main",
"index": 0
}
]
]
},
"Configure Workflow Args (Manual)": {
"main": [
[
{
"node": "Configure Workflow Args (Prep)",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates Reddit Sources": {
"main": [
[
{
"node": "Prepare Reddit Source Results",
"type": "main",
"index": 0
}
]
]
},
"Remove Elements with Empty Links": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
},
"Remove Elements with Empty Links 2": {
"main": [
[
{
"node": "Filter Fields for Loop",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "Configure Workflow Args (Manual)",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 市场调研, AI 摘要总结
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
灵活新闻聚合器 - 多源集成、AI分析和可设置频道
多源新闻策展系统,集成Mistral AI分析、摘要和自定义频道
If
Set
Xml
+32
120 节点Hybroht
内容创作
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
科技新闻聚合器 - 使用AI代理分析每日新闻并利用Mistral V0生成摘要
科技新闻策展 - 使用AI代理和Mistral分析每日新闻
Set
Merge
Filter
+12
48 节点Hybroht
人工智能
社区问题监控器与OpenRouter AI、Reddit和论坛爬取
使用OpenRouter AI、Reddit和论坛爬取监控社区问题
Set
Code
Html
+13
29 节点Julian Kaiser
市场调研
使用 Bright Data API 和 AI 抓取分析 Google 广告并发送邮件报告
使用 Bright Data API 和 AI 抓取分析 Google 广告并发送邮件报告
Set
Code
Gmail
+15
45 节点Zacharia Kimotho
市场调研
潜在客户开发与邮件工作流
使用Google Maps、SendGrid和AI自动化B2B潜在客户开发与邮件营销
If
Set
Code
+21
141 节点Ezema Kingsley Chibuzo
潜在客户开发
工作流信息
难度等级
高级
节点数量68
分类2
节点类型21
作者
Hybroht
@hybrohtCompany dedicated to delivering tailored software solutions and data-driven experiences through effective technology. We develop workflows leveraging AI agents to maximize the productive benefits of artificial intelligence.
外部链接
在 n8n.io 查看 →
分享此工作流