Telegram의 DOI URL을 통해 Zotero에 연구 논문을 자동으로 가져오기
고급
이것은AI Summarization, Multimodal AI분야의자동화 워크플로우로, 25개의 노드를 포함합니다.주로 If, Set, Code, Merge, Telegram 등의 노드를 사용하며. Telegram에서 연구 논문을 Zotero에 가져오기, AI 요약 포함
사전 요구사항
- •Telegram Bot Token
- •대상 API의 인증 정보가 필요할 수 있음
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "njoCDW50H4hQEGIY",
"meta": {
"instanceId": "0d045f8fe3802ff2be0bb9a9ea445ee6c9ed61973377effe00767e483681e2f4",
"templateCredsSetupCompleted": true
},
"name": "Automatically Import Research Papers using DOI URL from Telegram to Zotero",
"tags": [],
"nodes": [
{
"id": "474334ec-ff15-4a12-a200-50eb928f11db",
"name": "Telegram 트리거",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
9.007782644689968,
0
],
"webhookId": "d5ec43d4-76ab-4e79-9822-f42d522b605b",
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "80605785-8fd8-4d86-893d-e33d9cff315e",
"name": "코드",
"type": "n8n-nodes-base.code",
"position": [
220,
0
],
"parameters": {
"jsCode": "// Node: Code (Parse DOI)\nconst txt = $json.message?.text?.trim() || \"\";\n\nfunction extractDOI(s) {\n // 1) doi.org/...\n let m = s.match(/doi\\.org\\/(10\\.\\d{4,9}\\/\\S+)/i);\n if (m) return m[1].replace(/[)\\].,;]*$/, \"\");\n // 2) raw DOI\n m = s.match(/(10\\.\\d{4,9}\\/\\S+)/i);\n if (m) return m[1].replace(/[)\\].,;]*$/, \"\");\n // 3) arXiv link\n m = s.match(/arxiv\\.org\\/abs\\/([\\w\\-.]+)/i);\n if (m) return `10.48550/arXiv.${m[1]}`;\n return null;\n}\n\nconst doi = extractDOI(txt);\nif (!doi) {\n return [{ error: true, message: \"DOI not found. Please send a DOI or arXiv/doi.org link.\" }];\n}\n\nreturn [{ doi }];\n"
},
"typeVersion": 2
},
{
"id": "7e96135b-4bfb-4a05-a7fe-4936f771e7e5",
"name": "HTTP 요청2",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
960,
0
],
"parameters": {
"url": "=https://api.datacite.org/dois/{{ $('Code').item.json.doi }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "6562fd43-ad5a-4172-bf40-e627adec9b65",
"name": "HTTP 요청3",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
960,
-260
],
"parameters": {
"url": "=https://api.crossref.org/works/{{ $('Code').item.json.doi }}",
"options": {}
},
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "44f8af5d-d0c5-4fbc-9717-9bdcc80f6389",
"name": "HTTP 요청4",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
960,
260
],
"parameters": {
"url": "=https://api.unpaywall.org/v2/{{ $('Code').item.json.doi }}?email=your-email@example.com",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "b63893ad-f200-4c1b-ba07-7f429f38f2ff",
"name": "HTTP 요청",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
0
],
"parameters": {
"url": "=https://api.zotero.org/keys/{{ $json['Zotero API Key'] }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Zotero-API-Key",
"value": "={{ $json['Zotero API Key'] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "9f834057-efc6-4f75-b114-4db5d39bd498",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
420,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "2530066f-becf-4a83-b96c-a91ddd4aceb1",
"name": "Zotero API Key",
"type": "string",
"value": "={{ $credentials.zoteroApi.key }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d7b1e0b4-dee1-4359-8da6-b9f3df1854f6",
"name": "코드4",
"type": "n8n-nodes-base.code",
"position": [
1680,
0
],
"parameters": {
"jsCode": "// Code4 — Build Zotero parent metadata + pick best PDF URL\n// Input from Merge: $json.crossref, $json.datacite, $json.unpay, and $json.doi\n\nconst doi = $json.doi;\n\n// Unwrap API results if not error\nconst crossrefBody = ($json.crossref && !$json.crossref.error) ? $json.crossref.message : null;\nconst dataciteAttr = ($json.datacite && !$json.datacite.error) ? $json.datacite.data?.attributes : null;\nconst unpayBody = ($json.unpay && !$json.unpay.error) ? $json.unpay : null;\n\nconst pick = (...vals) => vals.find(v => {\n if (v === undefined || v === null) return false;\n if (typeof v === 'string') return v.trim().length > 0;\n return true;\n}) ?? null;\n\n/* ---------- PDF pickers ---------- */\nfunction fromCrossref(m) {\n if (!m) return null;\n const links = m.link || [];\n for (const l of links) {\n const ct = (l['content-type'] || '').toLowerCase();\n const url = l.URL || '';\n if (ct.includes('pdf') || /\\.pdf(\\?|$)/i.test(url)) return url;\n }\n return null;\n}\n\nfunction fromDataCite(attr) {\n if (!attr) return null;\n // try identifiers -> arXiv\n const ids = attr.identifiers || [];\n const arxiv = ids.find(i => /arxiv/i.test(i.identifierType || ''))?.identifier;\n if (arxiv) {\n const id = String(arxiv).replace(/^arXiv:/i,'');\n return `https://arxiv.org/pdf/${id}.pdf`;\n }\n return null;\n}\n\nfunction fromUnpay(u) {\n if (!u) return null;\n if (u.best_oa_location?.url_for_pdf) return u.best_oa_location.url_for_pdf;\n if (/\\.pdf(\\?|$)/i.test(u.best_oa_location?.url || '')) return u.best_oa_location.url;\n for (const loc of (u.oa_locations || [])) {\n if (loc.url_for_pdf) return loc.url_for_pdf;\n if (/\\.pdf(\\?|$)/i.test(loc.url || '')) return loc.url;\n }\n return null;\n}\n\n// Priority: Crossref → Unpaywall → DataCite → arXiv fallback (from DOI)\nlet pdfUrl = fromCrossref(crossrefBody);\nif (!pdfUrl) pdfUrl = fromUnpay(unpayBody);\nif (!pdfUrl) pdfUrl = fromDataCite(dataciteAttr);\nif (!pdfUrl && /^10\\.48550\\/arxiv\\./i.test(doi || '')) {\n const arxivId = doi.replace(/^10\\.48550\\/arxiv\\./i, '');\n pdfUrl = `https://arxiv.org/pdf/${arxivId}.pdf`;\n}\n\n/* ---------- Parent metadata (Zotero item) ---------- */\n// Title\nconst title = pick(\n crossrefBody?.title?.[0],\n dataciteAttr?.titles?.[0]?.title,\n doi\n);\n\n// Date (YYYY, YYYY-MM, or YYYY-MM-DD)\nconst issued = crossrefBody?.issued?.['date-parts']?.[0] || [];\nconst dateStr = issued.length\n ? issued.join('-')\n : pick(\n dataciteAttr?.published,\n dataciteAttr?.publishedOnline,\n dataciteAttr?.publishedPrint,\n dataciteAttr?.created\n ) || \"\";\n\n// Journal / container\nconst publicationTitle = pick(\n crossrefBody?.['container-title']?.[0],\n dataciteAttr?.container?.title\n) || \"\";\n\n// Landing page (not PDF)\nconst landingFromCR = crossrefBody?.URL;\nconst landingFromUP = unpayBody?.best_oa_location?.url || unpayBody?.oa_locations?.[0]?.url;\nconst landingFromDC = dataciteAttr?.url;\nconst url = pick(landingFromCR, landingFromUP, landingFromDC) || \"\";\n\n// Abstract\nlet abstractNote = \"\";\nif (Array.isArray(dataciteAttr?.descriptions) && dataciteAttr.descriptions.length) {\n const absExact = dataciteAttr.descriptions.find(d => /abstract/i.test(d.descriptionType || ''));\n abstractNote = pick(absExact?.description, dataciteAttr.descriptions[0]?.description) || \"\";\n}\n\n// Creators\nlet creators = [];\nif (Array.isArray(crossrefBody?.author)) {\n creators = crossrefBody.author.map(a => ({\n creatorType: \"author\",\n firstName: a.given || \"\",\n lastName: a.family || (a.name || \"\")\n }));\n} else if (Array.isArray(dataciteAttr?.creators)) {\n creators = dataciteAttr.creators.map(c => ({\n creatorType: \"author\",\n firstName: c.givenName || \"\",\n lastName: c.familyName || (c.name || \"\")\n }));\n}\n\n// Tags\nconst tags = [];\nif (Array.isArray(crossrefBody?.subject)) {\n for (const s of crossrefBody.subject.slice(0, 5)) tags.push({ tag: String(s) });\n}\ntags.push({ tag: \"from-telegram\" });\n\n// Item type heuristic\nconst itemType = publicationTitle ? \"journalArticle\" : \"preprint\";\n\n// Build meta object for POST /items (parent)\nconst meta = {\n itemType,\n title,\n DOI: doi || \"\",\n url,\n date: dateStr,\n publicationTitle,\n abstractNote,\n creators,\n tags\n};\n\n// Unified output for next step:\n// - meta: used for \"Zotero - Create Parent\"\n// - pdfUrl + hasPdf: for IF & attachment creation (linked_url)\nreturn [{\n doi,\n title,\n meta,\n pdfUrl,\n hasPdf: Boolean(pdfUrl)\n}];\n"
},
"typeVersion": 2
},
{
"id": "c7aa9f0e-d58a-48d8-8353-f2c60feb42fc",
"name": "병합",
"type": "n8n-nodes-base.merge",
"position": [
1520,
0
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition",
"numberInputs": 3
},
"executeOnce": true,
"typeVersion": 3.2
},
{
"id": "5f26c1c8-f21f-4aca-b4ae-84ff86c970f4",
"name": "If3",
"type": "n8n-nodes-base.if",
"position": [
1920,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "520e9b80-afa5-45e1-b572-88a855298b2c",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.hasPdf }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "987447af-6fc0-4ef7-afa6-cf43066fd476",
"name": "HTTP 요청9",
"type": "n8n-nodes-base.httpRequest",
"position": [
2160,
0
],
"parameters": {
"url": "=https://api.zotero.org/users/{{ $('HTTP Request').item.json.userID }}/items",
"method": "POST",
"options": {},
"jsonBody": "={{ [ $('Code4').item.json.meta ] }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "ZOTERO-API-KEY",
"value": "={{ $('HTTP Request').item.json.key }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "d9369d30-23f6-4425-8064-160a40189650",
"name": "Edit Fields1",
"type": "n8n-nodes-base.set",
"position": [
1180,
-260
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0df8889d-a22d-4512-a2dc-3e4700f37fe4",
"name": "crossref",
"type": "object",
"value": "={{ $json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a50771b9-b2a1-4ed4-8c7e-1b0b1d629285",
"name": "Edit Fields2",
"type": "n8n-nodes-base.set",
"position": [
1180,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0df8889d-a22d-4512-a2dc-3e4700f37fe4",
"name": "datacite",
"type": "object",
"value": "={{ $json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "dd594610-4115-4035-af02-bec335a10212",
"name": "Edit Fields3",
"type": "n8n-nodes-base.set",
"position": [
1180,
260
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0df8889d-a22d-4512-a2dc-3e4700f37fe4",
"name": "unpay",
"type": "object",
"value": "={{ $json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "0dfa6558-08a4-4a7a-94a2-3d02371aa938",
"name": "HTTP 요청1",
"type": "n8n-nodes-base.httpRequest",
"position": [
2380,
0
],
"parameters": {
"url": "=https://api.zotero.org/users/{{ $('HTTP Request').item.json.userID }}/items",
"method": "POST",
"options": {},
"jsonBody": "={{ [\n {\n itemType: \"attachment\",\n parentItem: $json.successful['0'].key,\n linkMode: \"linked_url\",\n title: \"Fulltext PDF\",\n url: $('If3').item.json.pdfUrl,\n contentType: \"application/pdf\"\n }\n] }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Zotero-API-Key",
"value": "={{ $('HTTP Request').item.json.key }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "594c9d30-853d-4447-a42d-c3eb4068287f",
"name": "메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-580,
-440
],
"parameters": {
"width": 540,
"height": 1120,
"content": "# Automatically Import Research Papers using DOI URL from Telegram to Zotero\n\nThis workflow allows you to automatically import research papers into your Zotero library by simply sending a DOI link through Telegram. It fetches metadata from reliable sources such as Crossref, DataCite, and Unpaywall, enriches the bibliographic details, attaches the best available full-text PDF when possible, and generates a concise summary of the abstract using an LLM before sending it back to Telegram. \n\n## ✨ Key Features \n- **Telegram Integration** – Send a DOI link via Telegram bot to trigger the workflow. \n- **DOI Parsing** – Automatically detects and extracts DOI or arXiv identifiers from user messages. \n- **Metadata Fetching** – Retrieves bibliographic information from **Crossref**, **DataCite**, and **Unpaywall**. \n- **Smart PDF Finder** – Locates the best available PDF (publisher link, open access, or arXiv). \n- **Zotero Integration** – Creates a Zotero parent item with complete metadata and attaches the PDF link when available. \n- **Abstract Summarization** – Uses a basic LLM chain to generate a short and clear summary of the abstract. \n- **Telegram Feedback** – Sends the title, URL, and abstract summary back to the user in Telegram. \n\n\n## 🔑 Required Credentials \n- **Telegram API** – To connect the workflow with your Telegram bot. \n- **Zotero API Key** – To create and update items in your Zotero library. \n- **OpenRouter API Key** – To enable the LLM for generating abstract summaries. \n- *(Optional)* Email for **Unpaywall API** requests (recommended for stable access). \n\n## 💡 Benefits \n- Save time by automating manual research paper imports. \n- Ensure high-quality metadata by combining multiple sources (Crossref, DataCite, Unpaywall). \n- Get instant summaries of abstracts directly in Telegram for quick understanding. \n- Keep your Zotero library organized with accurate titles, abstracts, authors, and tags. \n- Quickly attach available full-text PDFs without manual searching. \n- Improve your academic workflow by managing references and summaries directly from Telegram. \n"
},
"typeVersion": 1
},
{
"id": "77de37c2-b6f5-4fba-9932-154f3144a73a",
"name": "Basic LLM 체인",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
2600,
0
],
"parameters": {
"text": "=Summarize the following abstract: \n\n{{ $('HTTP Request9').item.json.successful['0'].data.abstractNote }}",
"batching": {},
"messages": {
"messageValues": [
{
"message": "=You are an assistant that summarizes academic paper abstracts. Your task is to generate a short and clear summary of the abstract in plain English. Keep the summary concise (2–3 sentences), highlight the main contribution or finding, and avoid technical jargon if possible. "
}
]
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "f5af851a-9a9e-445c-b9c6-a96fdea644f4",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
2600,
200
],
"parameters": {
"model": "google/gemini-2.0-flash-exp:free",
"options": {}
},
"typeVersion": 1
},
{
"id": "aa28ca2d-8590-431f-b01f-c80494be010c",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
2940,
0
],
"webhookId": "0cb93924-6255-48e4-815f-ef2ecd0a8099",
"parameters": {
"text": "=📄 Research Paper Summary\nTitle: {{ $('HTTP Request9').item.json.successful['0'].data.title }}\nURL: {{ $('HTTP Request1').item.json.successful['0'].data.url }}\n\n📝 Summary:\n{{ $json.text }}\n",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "74ac8241-a6b5-4229-99f0-c57b2ae36009",
"name": "메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-20,
-180
],
"parameters": {
"color": 2,
"width": 780,
"height": 380,
"content": "- Start the workflow when a user sends a message to your Telegram bot. \n- Automatically extract DOI or arXiv identifiers from the message text. \n- Store the Zotero API Key for subsequent steps (e.g., creating or updating Zotero items). \n- Sends a simple HTTP request to the Zotero API to validate and fetch information associated with your Zotero API Key. It is useful as a first step to ensure that your credentials are correctly set up before running more advanced Zotero automations."
},
"typeVersion": 1
},
{
"id": "cc9533ee-5edc-4573-9dfa-1cca98a3c854",
"name": "메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
820,
-500
],
"parameters": {
"color": 4,
"width": 600,
"height": 940,
"content": "- **Crossref API Request** – Fetch bibliographic data from Crossref using the provided DOI. \n- **DataCite API Request** – Retrieve additional metadata and attributes from DataCite. \n- **Unpaywall API Request** – Check open-access availability and possible full-text links. \n- **Structured Data Storage** – Save API responses into separate fields (`crossref`, `datacite`, `unpay`) for merging and downstream processing. \n"
},
"typeVersion": 1
},
{
"id": "23d15a9f-ebeb-416f-a66d-967cc27b9cf9",
"name": "메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1460,
-280
],
"parameters": {
"color": 5,
"width": 360,
"height": 440,
"content": "- Combine metadata from Crossref, DataCite, and Unpaywall into a single object. \n- Prioritize PDF links from Crossref, fallback to Unpaywall, DataCite, or arXiv. \n- Generate a Zotero-ready object including title, DOI, date, publication title, abstract, authors, and tags. \n- Identify whether the resource is a journal article or preprint. \n"
},
"typeVersion": 1
},
{
"id": "66f99fac-0698-400d-9bb2-1e57ce4c05c0",
"name": "Send a text message1",
"type": "n8n-nodes-base.telegram",
"position": [
2160,
200
],
"webhookId": "0cb93924-6255-48e4-815f-ef2ecd0a8099",
"parameters": {
"text": "=PDF not found",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "bd043ae9-6d80-4bf0-b80b-79bb921b3340",
"name": "메모4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1880,
-200
],
"parameters": {
"color": 6,
"width": 640,
"height": 600,
"content": "- Uses an IF node to check whether a PDF URL is available. \n- Creates a new Zotero item with complete metadata. \n- Automatically attaches the full-text PDF to the Zotero item if available. \n- Alerts the user in Telegram when no PDF could be found. \n"
},
"typeVersion": 1
},
{
"id": "60bda7fc-c9dc-457a-8cc1-8f6a2c981a49",
"name": "메모5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2580,
-200
],
"parameters": {
"width": 600,
"height": 600,
"content": "- Uses a basic LLM chain to summarize paper abstracts. \n- Delivers the paper title, URL, and generated summary back to the user in a formatted message. \n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "f31f5475-f6e7-47c7-afdd-0b9ad3346cf3",
"connections": {
"5f26c1c8-f21f-4aca-b4ae-84ff86c970f4": {
"main": [
[
{
"node": "HTTP Request9",
"type": "main",
"index": 0
}
],
[
{
"node": "66f99fac-0698-400d-9bb2-1e57ce4c05c0",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "9f834057-efc6-4f75-b114-4db5d39bd498",
"type": "main",
"index": 0
}
]
]
},
"Code4": {
"main": [
[
{
"node": "5f26c1c8-f21f-4aca-b4ae-84ff86c970f4",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Code4",
"type": "main",
"index": 0
}
]
]
},
"9f834057-efc6-4f75-b114-4db5d39bd498": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"d9369d30-23f6-4425-8064-160a40189650": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"a50771b9-b2a1-4ed4-8c7e-1b0b1d629285": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"dd594610-4115-4035-af02-bec335a10212": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "HTTP Request3",
"type": "main",
"index": 0
},
{
"node": "HTTP Request2",
"type": "main",
"index": 0
},
{
"node": "HTTP Request4",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request2": {
"main": [
[
{
"node": "a50771b9-b2a1-4ed4-8c7e-1b0b1d629285",
"type": "main",
"index": 0
}
],
[]
]
},
"HTTP Request3": {
"main": [
[
{
"node": "d9369d30-23f6-4425-8064-160a40189650",
"type": "main",
"index": 0
}
],
[]
]
},
"HTTP Request4": {
"main": [
[
{
"node": "dd594610-4115-4035-af02-bec335a10212",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request9": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"Basic LLM Chain": {
"main": [
[
{
"node": "aa28ca2d-8590-431f-b01f-c80494be010c",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"f5af851a-9a9e-445c-b9c6-a96fdea644f4": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - AI 요약, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
AI, Apify 및 Telegram 통합을 사용한 도구 평가 자동화
Telegram, Apify, AI 및 Google Sheets를 사용한 웹사이트 도구 분석 자동화
If
Set
Code
+
If
Set
Code
20 노드Mirza Ajmal
AI 요약
AI 기반 회의 연구 및 일일 아젠다 (Google 캘린더, Attio CRM 및 Slack)
AI 기반 회의 연구 및 일일 아젠다: Google 캘린더, Attio CRM 및 Slack 활용
If
Set
Code
+
If
Set
Code
30 노드Harry Siggins
AI 요약
YouTube 댓글 감정 및 키워드 추출기
Gemini AI를 사용하여 YouTube 댓글 감성 및 키워드 분석 및 Telegram으로 보고
Set
Code
Telegram
+
Set
Code
Telegram
20 노드Budi SJ
시장 조사
AI, 소셜 미디어 및 WhatsApp 링크 기반 자동화된 로컬 비즈니스 리드 생성기
AI, 소셜 미디어 및 WhatsApp 링크를 사용한 지역 비즈니스 리드 자동 생성
If
Code
Limit
+
If
Code
Limit
29 노드Budi SJ
리드 생성
매일 WhatsApp 그룹 지능형 분석: GPT-4.1 분석 및 음성 메시지 변환
매일 WhatsApp 그룹 지능 분석: GPT-4.1 분석 및 음성 메시지 트랜스크립션
If
Set
Code
+
If
Set
Code
52 노드Daniel Lianes
기타
Vision API와 LLM을 사용하여 자동화된发票 수집 및 데이터 추출
Google Vision OCR, Gemini LLM, Google Sheets를 사용하여 청구서 데이터를 추출하고 구조화합니다.
Set
Code
Telegram
+
Set
Code
Telegram
17 노드Budi SJ
청구서 처리
워크플로우 정보
난이도
고급
노드 수25
카테고리2
노드 유형10
저자
Budi SJ
@budisjI’m a Product Designer who also works as an Automation Developer. With a background in product design and systems thinking, I build user-centered workflows. My focus is on helping teams and businesses work more productively through impactful automation systems.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유