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

반응형

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

 

썸네일

 

이번 포스팅에서는 RSS 데이터를 수집하고 집계하는 기초적인 방법과 실전 운영 환경에서는 '데이터 중복(Data Redundancy)' 문제를 반드시 해결하는 방법을 공부해봅시다.

RSS 피드는 보통 최근 10~20개의 기사를 계속 보여줍니다. 만약 1시간마다 봇을 실행하면, 이미 봤던 기사가 또 수집되고 알림이 갈 수 있습니다.

포스팅에서는 n8n의 Date & Time 로직을 활용하여 "직전 실행 이후에 발행된 최신 뉴스"만 정확히 필터링하고, 이를 구글 시트에 아카이빙한 후 텔레그램으로 브리핑하는 무결성 높은 데이터 파이프라인을 구축해 보겠습니다.


📋 시스템 아키텍처 (Workflow)

  1. Schedule: 1시간 주기로 실행
  2. RSS Read: 글로벌 금융 뉴스(CoinDesk, CNBC) 수집
  3. If (Condition): 발행일시(pubDate)가 '1시간 전'보다 최신인지 검증
  4. Google Sheets: 검증 통과한 신규 데이터만 적재
  5. Code: 데이터 포맷팅
  6. Telegram: 신규 뉴스 브리핑 발송

1. 스케줄링 및 RSS 수집 (Data Ingestion)

  • Schedule 노드 추가.
    • Interval: Hours
    • Value: 1 (1시간마다 실행 설정)


2. 시계열 데이터 필터링 (Time Filter)


★핵심★

가져온 뉴스 중 **"최근 1시간 내에 나온 뉴스"**만 골라내는 단계입니다. 이 과정이 없으면 구글 시트에 중복 데이터가 쌓이게 됩니다.

  1. RSS Read 노드 뒤에 If 노드를 연결합니다.
  2. 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(참) 경로로 나가는 데이터는 '따끈따끈한 신규 뉴스' 뿐입니다.

If 노드 설정화면


3. 구글 시트 아카이빙 (Data Archiving)

필터링 된(True 경로) 데이터만 시트에 저장합니다.

  1. If 노드의 True OutputGoogle Sheets 노드를 연결합니다.
  2. Operation: Append.
  3. Document/Sheet: 준비된 시트 선택.
  4. 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번 실행돼서 알림 폭탄 맞습니다.

Google Sheets 세팅 2

반응형

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]를 눌러보세요.

  1. RSS 뉴스가 시트에 0 상태로 쌓입니다.
  2. 봇이 0인 뉴스만 싹 긁어 모아서 텔레그램으로 한 번에 보냅니다.
  3. 발송된 뉴스는 시트에서 1로 바뀝니다.
  4. 다시 실행하면? 0인 뉴스가 없으므로 아무 일도 일어나지 않습니다. (중복 완벽 차단!)

실행화면
google sheet
Flow

 

이 구조는 금융 뉴스뿐만 아니라 재고 알림, 특가 정보 수집 등 모든 데이터 수집 자동화의 '표준 모델'입니다.

다음 시간에는 이 완벽한 파이프라인 사이에 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

 

반응형