[n8n] 실전 (3) - RSS 를 이용한 뉴스 수집 및 텔레그램 전송

이번 포스팅에서는 RSS 데이터를 수집하고 집계하는 기초적인 방법과 실전 운영 환경에서는 '데이터 중복(Data Redundancy)' 문제를 반드시 해결하는 방법을 공부해봅시다.
RSS 피드는 보통 최근 10~20개의 기사를 계속 보여줍니다. 만약 1시간마다 봇을 실행하면, 이미 봤던 기사가 또 수집되고 알림이 갈 수 있습니다.
포스팅에서는 n8n의 Date & Time 로직을 활용하여 "직전 실행 이후에 발행된 최신 뉴스"만 정확히 필터링하고, 이를 구글 시트에 아카이빙한 후 텔레그램으로 브리핑하는 무결성 높은 데이터 파이프라인을 구축해 보겠습니다.
📋 시스템 아키텍처 (Workflow)
- Schedule: 1시간 주기로 실행
- RSS Read: 글로벌 금융 뉴스(CoinDesk, CNBC) 수집
- If (Condition): 발행일시(pubDate)가 '1시간 전'보다 최신인지 검증
- Google Sheets: 검증 통과한 신규 데이터만 적재
- Code: 데이터 포맷팅
- Telegram: 신규 뉴스 브리핑 발송
1. 스케줄링 및 RSS 수집 (Data Ingestion)
- Schedule 노드 추가.
- Interval: Hours
- Value: 1 (1시간마다 실행 설정)

- RSS Read 노드 연결.
- URL: https://www.coindesk.com/arc/outboundfeeds/rss/ (CoinDesk 예시)
- URL: https://www.cnbc.com/id/10000664/device/rss/rss.html CNBC (Finance)


2. 시계열 데이터 필터링 (Time Filter)
★핵심★
가져온 뉴스 중 **"최근 1시간 내에 나온 뉴스"**만 골라내는 단계입니다. 이 과정이 없으면 구글 시트에 중복 데이터가 쌓이게 됩니다.
- RSS Read 노드 뒤에 If 노드를 연결합니다.
- Conditions 설정:
- Data Type: Date & Time 선택.
- Value 1: RSS의 발행 시간인 {{ $json.pubDate }}를 매핑(Drag & Drop).
- Operation: Is After (이후인지 확인).
- Value 2: 현재 시간에서 1시간을 뺀 시간을 입력해야 합니다. 우측의 기어 아이콘(⚙️)을 눌러 Expression으로 변경 후 아래 코드를 입력하세요.
{{ $now.minus({hours: 1}) }} - 해석: "기사 발행 시간이 (현재 시간 - 1시간)보다 미래인가?" = "최근 1시간 내 새 기사인가?"
이제 이 If 노드의 True(참) 경로로 나가는 데이터는 '따끈따끈한 신규 뉴스' 뿐입니다.

3. 구글 시트 아카이빙 (Data Archiving)
필터링 된(True 경로) 데이터만 시트에 저장합니다.
- If 노드의 True Output에 Google Sheets 노드를 연결합니다.
- Operation: Append.
- Document/Sheet: 준비된 시트 선택.
- Mapping:
- 수집일시: {{ $now.}} (기록 시점)
- 발행일시: {{ $json.pubDate }} (뉴스 실제 발행 시간)
- 제목: {{ $json.title }}
- 링크: {{ $json.link }}


3. 미발송 뉴스 일괄 조회 (Batch Process) ★핵심★
이제 시트에 쌓인 뉴스 중 "안 보낸 녀석들"을 소환합니다.
4. Google Sheets (Get Unread)
- Operation: Get Many Rows
- Filters: 발행여부가 0인 행만 조회.
- Options: Execute Once (한 번만 실행) → ON (켜기)
- 이게 왜 중요하나요? 앞 단계에서 뉴스가 10개가 들어와도, 이 노드는 딱 한 번만 실행되어야 10개를 묶어서 처리할 수 있습니다. 끄면 10번 실행돼서 알림 폭탄 맞습니다.


4. 중복 제거 및 메시지 포맷팅 (Formatting)
혹시 시트에 똑같은 뉴스가 두 번 들어갔더라도, 발송 전에 걸러내야 합니다.
5. Code (JavaScript)
- Get Unread 노드 뒤에 연결합니다.
- 아래 코드는 링크(URL)를 기준으로 중복을 제거하고, 깔끔한 메시지로 만들어줍니다.

// 1. 시트 데이터 가져오기 ('노드이름' 확인 필수!)
const items = $('Get Unread').all();
// 2. 중복 제거 (링크가 같으면 무시하기)
const seen = new Set();
const uniqueItems = items.filter(item => {
const link = item.json.링크 || item.json.link;
const duplicate = seen.has(link);
seen.add(link);
return !duplicate; // 중복이 아닌 것만 남김
});
// 3. 텍스트 합치기
const listText = uniqueItems.map(item => {
return `✅ ${item.json.제목}\n🔗 ${item.json.링크}`;
}).join('\n\n');
// 4. 결과 내보내기
const header = `📢 [미발송 뉴스 알림 모음] (총 ${uniqueItems.length}건)\n\n`;
return [{json: {text: header + listText}}];
5. 발송 및 상태 업데이트 (Close Loop)
마지막으로 메시지를 보내고, 시트에 "처리 완료" 표시를 합니다.
Telegram
- 만들어진 메시지({{ $json.text }})를 전송합니다.

Code (Restore Data)
- 업데이트를 하려면 아까 읽어온 뉴스들의 **행 번호(row_number)**가 다시 필요합니다.
- 텔레그램 뒤에 Code 노드를 붙이고 한 줄만 적습니다.
return $('Get Unread').all();

Google Sheets (Update)
- Operation: Update
- Row Number: {{ $json.row_number }}
- Fields to Update: 발행여부를 **1**로 변경.

🎉 결과 및 마치며
이제 [Execute Workflow]를 눌러보세요.
- RSS 뉴스가 시트에 0 상태로 쌓입니다.
- 봇이 0인 뉴스만 싹 긁어 모아서 텔레그램으로 한 번에 보냅니다.
- 발송된 뉴스는 시트에서 1로 바뀝니다.
- 다시 실행하면? 0인 뉴스가 없으므로 아무 일도 일어나지 않습니다. (중복 완벽 차단!)



이 구조는 금융 뉴스뿐만 아니라 재고 알림, 특가 정보 수집 등 모든 데이터 수집 자동화의 '표준 모델'입니다.
다음 시간에는 이 완벽한 파이프라인 사이에 LLM API 를 끼워 넣어, 단순 번역을 넘어 "투자 관점에서의 호재/악재 분석 요약" 기능까지 구현해 보겠습니다.
https://dt-simulation.tistory.com/70
n8n 실전 (4) - 개발자의 주식 치트키: DeepSeek & RSS.app으로 'AI 여의도 애널리스트' 만들기
n8n 실전 (4) - 개발자의 주식 치트키: DeepSeek & RSS.app으로 'AI 여의도 애널리스트' 만들기"정보 수집은 쉽게, 분석은 날카롭게." 지난 시간까지는 복잡한 URL을 조합해서 뉴스를 가져왔습니다. 하지만
dt-simulation.tistory.com
'n8n > 실전' 카테고리의 다른 글
| [n8n] 실전 (5) - 쏟아지는 업무 메일, AI가 3줄 요약해서 텔레그램으로 쏴준다! (Gmail + DeepSeek) (0) | 2026.02.18 |
|---|---|
| [n8n] 실전 (4) - 개발자의 주식 치트키: DeepSeek & RSS.app으로 'AI 여의도 애널리스트' 만들기 (0) | 2026.02.01 |
| [n8n] 실전 (2) - 환율 떨어지면 알림! 텔레그램 알림 봇 만들기 (0) | 2026.01.18 |
| [n8n] 실전 (1) - 매일 아침 달러 환율, 구글 시트에 자동 기록하기 (무료 API) (1) | 2026.01.10 |
| [n8n] 구글 연동의 첫 관문! Google Credential (OAuth) 설정 완벽 가이드 (3) | 2026.01.03 |