631 lines
27 KiB
JSON
631 lines
27 KiB
JSON
{
|
|
"name": "test용",
|
|
"nodes": [
|
|
{
|
|
"parameters": {
|
|
"messages": {
|
|
"message": [
|
|
{
|
|
"content": "={{ $json.submittedAt }}를 기준으로, {{ $json['수집 기간'] }}동안에 {{ $json['키워드'] }}와 관련된 기사를 모두 수집 정리해줘. 공신력 있는 매체를 중심으로 수집하되, 유튜브, 동영상 링크는 제외해줘.\n\n아래 JSON 형식으로만 답변해줘.\n[\n {\n \"제목\": \"\",\n \"발행일\": \"\",\n \"매체\": \"\",\n \"URL\": \"\",\n }\n]"
|
|
}
|
|
]
|
|
},
|
|
"options": {},
|
|
"requestOptions": {}
|
|
},
|
|
"type": "n8n-nodes-base.perplexity",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
176,
|
|
-224
|
|
],
|
|
"id": "d0e538a2-eeb9-4caf-a794-f1a6a0253a78",
|
|
"name": "Message a model",
|
|
"credentials": {
|
|
"perplexityApi": {
|
|
"id": "sJrK346BATWXY2dP",
|
|
"name": "Perplexity account"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "={{ $json.search_results.url }}",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.4,
|
|
"position": [
|
|
608,
|
|
-224
|
|
],
|
|
"id": "a49db960-6302-4071-840e-c6496ac021c2",
|
|
"name": "HTTP Request"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"fieldToSplitOut": "search_results",
|
|
"include": "allOtherFields",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.splitOut",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
384,
|
|
-224
|
|
],
|
|
"id": "ff741487-10c4-49e8-b1f8-79892ae029fa",
|
|
"name": "Split Out"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "=https://news.google.com/rss/search?q={{ encodeURIComponent($json['키워드']) }}&hl=ko&gl=KR&ceid=KR:ko\n",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.rssFeedRead",
|
|
"typeVersion": 1.2,
|
|
"position": [
|
|
176,
|
|
112
|
|
],
|
|
"id": "59eb818c-026e-4c89-98e9-ae3222c95a15",
|
|
"name": "RSS Read"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "={{ $json.link }}",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.4,
|
|
"position": [
|
|
384,
|
|
112
|
|
],
|
|
"id": "6df6e206-d0d6-4a69-8b0f-d8e7af9e9b44",
|
|
"name": "HTTP Request1"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"language": "pythonNative",
|
|
"pythonCode": "import time\nimport requests\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nimport re\nimport logging\nimport os\nimport random\nimport ssl\nfrom datetime import datetime\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.poolmanager import PoolManager\n\n# -------------------------------------------------\n# 설정: 로그 파일 및 기본 환경\n# -------------------------------------------------\nlog_file = os.path.join(os.path.dirname(__file__), '엔지니어링_일일_동향.log')\nlogging.basicConfig(\n filename=log_file,\n level=logging.DEBUG,\n format='%(asctime)s - %(levelname)s - %(message)s'\n)\nlogging.info('Script started')\n\n# -------------------------------------------------\n# 공통 전처리 함수\n# -------------------------------------------------\n\ndef clean_text(text: str) -> str:\n \"\"\"HTML 엔티티 및 불필요한 태그 제거\"\"\"\n reps = {\n ' ': ' ', '‘': \"'\", '’': \"'\", '“': '\"', '”': '\"',\n '&': '&', '<': '<', '>': '>', ''': \"'\", '"': \"'\", '·': \"'\"\n }\n for key, val in reps.items():\n text = text.replace(key, val)\n return re.sub(r'<[^>]+>', '', text).strip()\n\n\ndef fetch_article_content(url: str, source: str) -> str:\n \"\"\"단일 기사 본문 추출\"\"\"\n try:\n resp = requests.get(url, verify=False, timeout=10)\n resp.encoding = 'utf-8'\n resp.raise_for_status()\n soup = BeautifulSoup(resp.text, 'html.parser')\n paragraphs = soup.find_all('p')\n content = ' '.join(clean_text(p.get_text()) for p in paragraphs)\n content = content.replace('\\n', ' ')\n if not content.strip():\n logging.warning(f'No content for {url}')\n return f\"No content available #출처: {source}\"\n return content\n except Exception as e:\n logging.error(f'Error fetching content {url}: {e}')\n return f\"No content available #출처: {source}\"\n\n\ndef format_date(date_str: str, source: str) -> str:\n \"\"\"날짜 형식을 YYYY-MM-DD 로 변환\"\"\"\n try:\n match = re.search(r'\\d{4}-\\d{2}-\\d{2}', date_str)\n if match:\n return match.group(0)\n if source == '연합뉴스':\n return datetime.strptime(date_str, '%m-%d %H:%M').strftime('2024-%m-%d')\n return date_str\n except Exception:\n return date_str\n\n\ndef fetch_articles(\n base_url: str,\n article_sel: str,\n title_sel: str,\n date_sel: str,\n start_page: int,\n end_page: int,\n source: str,\n url_prefix: str = '',\n date_fmt_func=None\n) -> list:\n \"\"\"리스트 페이지 순회하며 메타데이터 및 본문 수집\"\"\"\n results = []\n for page in range(start_page, end_page + 1):\n try:\n page_url = f\"{base_url}{page}\"\n resp = requests.get(page_url, verify=False, timeout=10)\n soup = BeautifulSoup(resp.text, 'html.parser')\n articles = soup.select(article_sel)\n for art in articles:\n tag = art.select_one(title_sel)\n if not tag or not tag.get('href'):\n continue\n link = tag['href']\n url = link if link.startswith('http') else url_prefix + link\n title = tag.get_text(strip=True)\n dtag = art.select_one(date_sel)\n date = date_fmt_func(dtag.get_text(strip=True), source) if dtag else 'No date'\n body = fetch_article_content(url, source)\n results.append([title, body, date, url])\n logging.info(f'[{source}] Page {page} completed')\n time.sleep(1)\n except Exception as e:\n logging.error(f'[{source}] Page {page} error: {e}')\n return results\n\n# -------------------------------------------------\n# SSL 우회 세션 (일부 사이트 전용)\n# -------------------------------------------------\nclass SslAdapter(HTTPAdapter):\n def init_poolmanager(self, *args, **kwargs):\n ctx = ssl.create_default_context()\n ctx.set_ciphers('DEFAULT:@SECLEVEL=1')\n self.poolmanager = PoolManager(*args, ssl_context=ctx, **kwargs)\n\nsession = requests.Session()\nsession.mount('https://', SslAdapter())\nheaders = {'User-Agent': 'Mozilla/5.0', 'Accept-Language': 'ko-KR,ko;q=0.9'}\n\n# -------------------------------------------------\n# 사이트별 함수 (대한경제 제외)\n# -------------------------------------------------\nfetch_ikld = lambda s, e: fetch_articles(\n 'https://www.ikld.kr/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'div.list-titles.table-cell a.links',\n 'div.list-dated.table-cell', s, e, '국토일보', 'https://www.ikld.kr', format_date\n)\n\nfetch_conslove = lambda s, e: fetch_articles(\n 'http://www.conslove.co.kr/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'div.list-titles.table-cell a.links',\n 'div.list-dated.table-cell', s, e, '한건신문', 'http://www.conslove.co.kr', format_date\n)\n\nfetch_koscaj = lambda s, e: fetch_articles(\n 'https://www.koscaj.com/news/articleList.html?page=',\n 'section#section-list li',\n 'h2.titles a',\n 'em.info.dated', s, e, '전문건설신문', 'https://www.koscaj.com', format_date\n)\n\nfetch_engdaily = lambda s, e: fetch_articles(\n 'https://www.engdaily.com/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'a.links',\n 'div.list-dated.table-cell', s, e, '엔지니어링데일리', 'https://www.engdaily.com', format_date\n)\n\nfetch_cenews = lambda s, e: fetch_articles(\n 'http://www.cenews.kr/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'a.links',\n 'div.list-dated.table-cell', s, e, '건설이코노미뉴스', 'http://www.cenews.kr', format_date\n)\n\nfetch_engjournal = lambda s, e: fetch_articles(\n 'http://www.engjournal.co.kr/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'a.links',\n 'div.list-dated.table-cell', s, e, '공학저널', 'http://www.engjournal.co.kr', format_date\n)\n\nfetch_yna = lambda s, e: fetch_articles(\n 'https://www.yna.co.kr/news/',\n 'div.list-type038 li',\n 'a.tit-wrap',\n 'span.txt-time', s, e, '연합뉴스', 'https:', format_date\n)\n\nfetch_denews = lambda s, e: fetch_articles(\n 'http://www.denews.co.kr/news/articleList.html?page=',\n 'section.article-list-content div.table-row',\n 'div.list-titles.table-cell a.links',\n 'div.list-dated.table-cell', s, e, '디지털경제뉴스', 'http://www.denews.co.kr', format_date\n)\n\n\ndef fetch_aitimes(s, e):\n data = []\n base = 'https://www.aitimes.com/news/articleList.html?page='\n for p in range(s, e+1):\n resp = session.get(f\"{base}{p}\", headers=headers)\n soup = BeautifulSoup(resp.text, 'html.parser')\n for li in soup.select('ul.type1 li'):\n a = li.select_one('h4.titles a')\n if not a: continue\n url = a['href'] if a['href'].startswith('http') else 'https://aitimes.com'+a['href']\n art = BeautifulSoup(session.get(url, headers=headers).text, 'html.parser')\n body = ' '.join(p.get_text(strip=True) for p in art.select('article[itemprop=\"articleBody\"] p'))\n title = art.select_one('header.article-view-header h3.heading').get_text(strip=True)\n dli = art.select_one('div.info-group ul.infomation li:nth-of-type(2)')\n date = dli.get_text(strip=True).split('입력')[-1].strip() if dli else 'No date'\n data.append([title, body, date, url])\n time.sleep(random.uniform(1,2))\n return data\n\n\ndef fetch_hankyung(s, e):\n data = []\n base = 'https://www.hankyung.com/it?page='\n for p in range(s, e+1):\n resp = session.get(f\"{base}{p}\", headers=headers)\n soup = BeautifulSoup(resp.text, 'html.parser')\n for li in soup.select('ul.news-list li'):\n a = li.select_one('h3.news-tit a')\n if not a: continue\n url = a['href'] if a['href'].startswith('http') else 'https://www.hankyung.com'+a['href']\n art = BeautifulSoup(session.get(url, headers=headers).text, 'html.parser')\n title = art.select_one('h1.headline').get_text(strip=True)\n pub = art.select_one('span.txt-date').get_text(strip=True) if art.select_one('span.txt-date') else 'No date'\n body = ' '.join(p.get_text(strip=True) for p in art.select('div[itemprop=\"articleBody\"] p'))\n data.append([title, body, pub, url])\n time.sleep(random.uniform(2,5))\n return data\n\n# -------------------------------------------------\n# 데이터 수집 및 저장\n# -------------------------------------------------\nprint(\"Starting data collection from all sites...\")\n\nikld_data = fetch_ikld(1, 3)\nconslove_data = fetch_conslove(1, 2)\nkoscaj_data = fetch_koscaj(1, 1)\nengdaily_data = fetch_engdaily(1, 1)\ncenews_data = fetch_cenews(1, 1)\nengjournal_data = fetch_engjournal(1, 3)\nnyna_data = fetch_yna(1, 3)\ndenews_data = fetch_denews(1, 3)\naitimes_data = fetch_aitimes(1, 5)\nhankyung_data = fetch_hankyung(1, 5)\n\nall_data = (\n ikld_data + conslove_data + koscaj_data + engdaily_data +\n cenews_data + engjournal_data + nyna_data + denews_data +\n aitimes_data + hankyung_data\n)\n\ndf = pd.DataFrame(all_data, columns=['Title', 'Script', 'Date', 'URL'])\ndf.to_excel(\"comprehensive_article_metadata.xlsx\", index=False)\n\nlogging.info(\"Data collection complete and saved to comprehensive_article_metadata.xlsx\")\nprint(\"Data collection complete and saved to comprehensive_article_metadata.xlsx\")\nprint(f\"Total articles collected: {len(all_data)}\")\n"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
176,
|
|
-48
|
|
],
|
|
"id": "4c40dc3f-07d1-4061-b65d-562695c47254",
|
|
"name": "Code in Python"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"formTitle": "뉴스 수집",
|
|
"formDescription": "키워드를 중심으로 perplexity에서 관련 기사를 수집합니다.",
|
|
"formFields": {
|
|
"values": [
|
|
{
|
|
"fieldLabel": "키워드",
|
|
"requiredField": true
|
|
},
|
|
{
|
|
"fieldLabel": "수집 기간",
|
|
"fieldType": "dropdown",
|
|
"fieldOptions": {
|
|
"values": [
|
|
{
|
|
"option": "당일"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.formTrigger",
|
|
"typeVersion": 2.5,
|
|
"position": [
|
|
-112,
|
|
432
|
|
],
|
|
"id": "dcd008de-2b5d-47a4-ad81-4687bf93264d",
|
|
"name": "키워드 입력(Trigger)",
|
|
"webhookId": "c17c3ace-123f-426e-b636-9f2ccf75a54c"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"aggregate": "aggregateAllItemData",
|
|
"destinationFieldName": "=data",
|
|
"include": "=본문 전체",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.aggregate",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
1088,
|
|
432
|
|
],
|
|
"id": "74ae43b0-b261-4fb2-9926-1ccc3ade5f56",
|
|
"name": "AI 분석을 위한 전처리(본문 추출)"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"modelId": {
|
|
"__rl": true,
|
|
"value": "models/gemini-2.5-flash",
|
|
"mode": "list",
|
|
"cachedResultName": "models/gemini-2.5-flash"
|
|
},
|
|
"messages": {
|
|
"values": [
|
|
{
|
|
"content": "=아래는 '{{ $('키워드 입력(Trigger)').first().json['키워드'] }}' 키워드 관련 뉴스 본문들입니다.\n\n{{ $json.data.map(item => item['본문 전체']).join('\\n\\n') }}\n\n위 내용을 바탕으로 주요 인사이트 3개를 아래 JSON 형식으로만 답해줘. 다른 말은 하지 마:\n[\n {\"제목\": \"인사이트 제목\", \"내용\": \"상세 내용\", \"링크\": \"관련 기사 URL\"},\n {\"제목\": \"인사이트 제목\", \"내용\": \"상세 내용\", \"링크\": \"관련 기사 URL\"},\n {\"제목\": \"인사이트 제목\", \"내용\": \"상세 내용\", \"링크\": \"관련 기사 URL\"}\n]"
|
|
}
|
|
]
|
|
},
|
|
"builtInTools": {},
|
|
"options": {}
|
|
},
|
|
"type": "@n8n/n8n-nodes-langchain.googleGemini",
|
|
"typeVersion": 1.1,
|
|
"position": [
|
|
1232,
|
|
432
|
|
],
|
|
"id": "13eb0c70-acae-4431-a3e2-724fa0e1374d",
|
|
"name": "본문 분석(인사이트 3개 뽑기)",
|
|
"credentials": {
|
|
"googlePalmApi": {
|
|
"id": "evMMDN0o1ciE31vt",
|
|
"name": "Google Gemini(PaLM) Api account"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const text = $json.content.parts[0].text;\nconst parsed = JSON.parse(text.replace(/```json|```/g, '').trim());\nreturn parsed.map((item, i) => ({\n json: {\n '#': i + 1,\n '인사이트': item.제목,\n '관련 내용': item.내용,\n '관련 링크': item.링크\n }\n}));"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
1488,
|
|
432
|
|
],
|
|
"id": "eecdd5a7-c247-410f-a643-0068ed8d00df",
|
|
"name": "뽑은 인사이트 정리하기"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"operation": "append",
|
|
"documentId": {
|
|
"__rl": true,
|
|
"value": "1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw",
|
|
"mode": "list",
|
|
"cachedResultName": "sample",
|
|
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw/edit?usp=drivesdk"
|
|
},
|
|
"sheetName": {
|
|
"__rl": true,
|
|
"value": 1131542344,
|
|
"mode": "list",
|
|
"cachedResultName": "sheet 2",
|
|
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw/edit#gid=1131542344"
|
|
},
|
|
"columns": {
|
|
"mappingMode": "defineBelow",
|
|
"value": {
|
|
"#": "={{ $json['#'] }}",
|
|
"인사이트": "={{ $json['인사이트'] }}",
|
|
"관련 내용": "={{ $json['관련 내용'] }}",
|
|
"링크": "={{ $json['관련 링크'] }}"
|
|
},
|
|
"matchingColumns": [],
|
|
"schema": [
|
|
{
|
|
"id": "#",
|
|
"displayName": "#",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "인사이트",
|
|
"displayName": "인사이트",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "관련 내용",
|
|
"displayName": "관련 내용",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "링크",
|
|
"displayName": "링크",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
}
|
|
],
|
|
"attemptToConvertTypes": false,
|
|
"convertFieldsToString": false
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.googleSheets",
|
|
"typeVersion": 4.7,
|
|
"position": [
|
|
1632,
|
|
432
|
|
],
|
|
"id": "555e5573-64ca-457c-9ee8-cf26e1cd65b5",
|
|
"name": "저장하기(sheet2)",
|
|
"credentials": {
|
|
"googleSheetsOAuth2Api": {
|
|
"id": "4gOcyPEP0O8ViCLs",
|
|
"name": "Google Sheets account 2"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "https://openapi.naver.com/v1/search/news.json",
|
|
"sendQuery": true,
|
|
"queryParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "=query",
|
|
"value": "={{ $json['키워드'] }}"
|
|
},
|
|
{
|
|
"name": "display",
|
|
"value": "12"
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"value": "=date"
|
|
}
|
|
]
|
|
},
|
|
"sendHeaders": true,
|
|
"headerParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "X-Naver-Client-Id",
|
|
"value": "O3foIC9BjTO1co15Aw86"
|
|
},
|
|
{
|
|
"name": "X-Naver-Client-Secret",
|
|
"value": "GM2xjQt2MJ"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.4,
|
|
"position": [
|
|
192,
|
|
432
|
|
],
|
|
"id": "dff89381-1e63-443a-8d39-dcd0560c4c1a",
|
|
"name": "기사 수집(Naver API)"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"fieldToSplitOut": "items",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.splitOut",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
336,
|
|
432
|
|
],
|
|
"id": "39c09e4c-f8e3-4658-9b86-7708097a6484",
|
|
"name": "수집 정보 정리"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "=https://r.jina.ai/{{ $json.link }}",
|
|
"sendHeaders": true,
|
|
"headerParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "Authorization",
|
|
"value": "Bearer jina_a72bde1404d14c2a94fd0c8b357cf795yFATC69lNjusqnhy5ymUhnqjBMNh"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.4,
|
|
"position": [
|
|
480,
|
|
432
|
|
],
|
|
"id": "88a4882c-f6d1-4ce5-bbdc-c359bd7ec9da",
|
|
"name": "기사 본문 수집"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"mode": "runOnceForEachItem",
|
|
"jsCode": "const raw = $json.data || '';\n\nconst mcIdx = raw.indexOf('Markdown Content:');\nconst mdText = mcIdx !== -1 ? raw.substring(mcIdx + 17) : raw;\n\nconst lines = mdText.split('\\n');\nconst bodyLines = lines.filter(line => {\n const t = line.trim();\n return t.length > 50\n && !t.startsWith('#')\n && !t.startsWith('*')\n && !t.startsWith('[')\n && !t.startsWith('!')\n && !t.startsWith('|');\n});\n\nconst body = bodyLines.join(' ').substring(0, 8000);\n\nreturn {\n json: {\n title: $('수집 정보 정리').item.json.title,\n 발행일: $('수집 정보 정리').item.json.pubDate,\n url: $('수집 정보 정리').item.json.link,\n 주요내용: $('수집 정보 정리').item.json.description,\n 본문전체: body\n }\n};"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
624,
|
|
432
|
|
],
|
|
"id": "06ed4bfa-5dee-46dc-8899-bced70618aaf",
|
|
"name": "본문 정리"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"operation": "append",
|
|
"documentId": {
|
|
"__rl": true,
|
|
"value": "1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw",
|
|
"mode": "list",
|
|
"cachedResultName": "sample",
|
|
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw/edit?usp=drivesdk"
|
|
},
|
|
"sheetName": {
|
|
"__rl": true,
|
|
"value": "gid=0",
|
|
"mode": "list",
|
|
"cachedResultName": "시트1",
|
|
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1wWTPdmC3-RXHi0ng6T6VcvIom_R6CdNkGFnB9eSqLlw/edit#gid=0"
|
|
},
|
|
"columns": {
|
|
"mappingMode": "defineBelow",
|
|
"value": {
|
|
"title": "={{ $json.title }}",
|
|
"url": "={{ $json.url }}",
|
|
"주요 내용": "={{ $json['주요내용'] }}",
|
|
"발행일": "={{ $json['발행일'] }}",
|
|
"구분": "={{ $itemIndex + 1 }}",
|
|
"본문 전체": "={{ $json['본문전체'] }}"
|
|
},
|
|
"matchingColumns": [],
|
|
"schema": [
|
|
{
|
|
"id": "구분",
|
|
"displayName": "구분",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "title",
|
|
"displayName": "title",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "발행일",
|
|
"displayName": "발행일",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "url",
|
|
"displayName": "url",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "주요 내용",
|
|
"displayName": "주요 내용",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
},
|
|
{
|
|
"id": "본문 전체",
|
|
"displayName": "본문 전체",
|
|
"required": false,
|
|
"defaultMatch": false,
|
|
"display": true,
|
|
"type": "string",
|
|
"canBeUsedToMatch": true
|
|
}
|
|
],
|
|
"attemptToConvertTypes": false,
|
|
"convertFieldsToString": false
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.googleSheets",
|
|
"typeVersion": 4.7,
|
|
"position": [
|
|
768,
|
|
432
|
|
],
|
|
"id": "a042c1fa-e1e3-4ec2-8ac2-950141b875c7",
|
|
"name": "기사 저장 (제목, 발행일, url, 요약, 본문 전체)",
|
|
"credentials": {
|
|
"googleSheetsOAuth2Api": {
|
|
"id": "4gOcyPEP0O8ViCLs",
|
|
"name": "Google Sheets account 2"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"pinData": {},
|
|
"connections": {
|
|
"Message a model": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Split Out",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Split Out": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "HTTP Request",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"RSS Read": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "HTTP Request1",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"키워드 입력(Trigger)": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "기사 수집(Naver API)",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"AI 분석을 위한 전처리(본문 추출)": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "본문 분석(인사이트 3개 뽑기)",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"본문 분석(인사이트 3개 뽑기)": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "뽑은 인사이트 정리하기",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"뽑은 인사이트 정리하기": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "저장하기(sheet2)",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"기사 수집(Naver API)": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "수집 정보 정리",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"수집 정보 정리": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "기사 본문 수집",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"기사 본문 수집": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "본문 정리",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"본문 정리": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "기사 저장 (제목, 발행일, url, 요약, 본문 전체)",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"기사 저장 (제목, 발행일, url, 요약, 본문 전체)": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "AI 분석을 위한 전처리(본문 추출)",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"active": false,
|
|
"settings": {
|
|
"executionOrder": "v1",
|
|
"binaryMode": "separate",
|
|
"availableInMCP": false
|
|
},
|
|
"versionId": "ae9131fb-9d1a-4827-928b-8a6f8d43b1bc",
|
|
"meta": {
|
|
"templateCredsSetupCompleted": true,
|
|
"instanceId": "f05a5d847999236f5c88cdf334bbb894fc64f4ac70c6fb365f5a000dfb58a2b2"
|
|
},
|
|
"id": "NgtFEf55fyLTGesY",
|
|
"tags": []
|
|
} |