자기개발

[K코딩] 텔레그렘 뉴스 봇 자동 실행 및 기능 업데이트(V3)

Tubeking 2025. 7. 27. 16:47
반응형

[K코딩] 텔레그렘 뉴스 봇 자동 실행 및 기능 업데이트(V3)
[K코딩] 텔레그렘 뉴스 봇 자동 실행 및 기능 업데이트(V3)

텔레그렘 뉴스 크롤링 봇 만들기 3회차입니다. 기본틀은 2회차까지 완성 되었고 이제는 부수적인 기능들을 만들고 실시간으로 운영 될 수 있게 셋팅하는 단계만 남았습니다. 어떤 기능들을 넣으면 좋을까? 지선생님과 대화하며 몇 가지만 넣어 보기로 했습니다. (개발프로세스 참고) 

1. 개발프로세스

① 다수의 RSS피드 등록 설계 
② 키워드 필터 설정 및 전송 시간대 설정 
③ 전체 RSS 순회 및 전송 시간 설정
④ 일간 주간 뉴스 통계 리포트 설정 


텔레그렘봇만들기 2편


2. 다수의 RSS피드 등록 설계  

 

 

📌 RSS 피드란?

RSS(Really Simple Syndication)는 웹사이트의 콘텐츠를 실시간으로 구독할 수 있도록 해주는 기술입니다.
뉴스, 블로그, 정부 발표 등 다양한 콘텐츠를 한곳에서 모아볼 수 있기 때문에 정보 수집의 효율성을 극대화할 수 있습니다.


현대 사회는 ‘정보 과잉’이라는 말이 어울릴 정도로, 수많은 매체들이 실시간으로 뉴스를 쏟아내고 있습니다. 정부기관, 언론사, 블로그, 유튜브 등 정보의 출처는 너무도 다양하고 방대합니다.

그렇다면 우리는 어떻게 이 무한한 정보 속에서 ‘필요한 정보’만을 골라낼 수 있을까요?
바로 다수의 RSS 피드를 등록하고  내가 원하는 정보만 얻어오는 방법으로 체계적으로 관리하는 것이 핵심입니다.

# 📌 [2] 다수의 RSS 피드 목록
RSS_FEEDS = [
    'https://www.korea.kr/rss/policy.xml',
    'https://www.yonhapnewstv.co.kr/browse/feed/',
    'https://rss.donga.com/politics.xml',
    'https://www.hani.co.kr/rss/lead/',
    'https://www.mk.co.kr/rss/society.xml'
]

코드 목록에 내가 원하는 RSS 주소를 언제든 추가 할 수 있도록 코딩 해서 테스트 후 필요 없는 정보들을 필터링해서 제외 시키는 작업을 할 예정입니다. 

💡 왜 다수의 RSS 피드 등록이 중요한가?

  1. 정보 편향 방지
    • 하나의 언론사만 구독할 경우, 정보의 시각이 편향될 수 있습니다. 다양한 소스를 등록하면 균형 잡힌 시각 확보에 도움이 됩니다.
  2. 속보와 분석을 동시에
    • 속보는 연합뉴스, 분석은 한겨레, 정책은 대한민국 정책브리핑 등 각각의 강점을 지닌 채널을 분리해 수집할 수 있습니다.
  3. 필터링을 통한 맞춤형 정보화
    • 키워드 기반 필터링, 시간대 설정 등으로 원하는 정보만 받아볼 수 있는 구조를 만들 수 있습니다.

텔레그렘봇만들기 1편


3. 키워드 필터 설정 및 전송 시간대 설정

# 📌 [4] 키워드 필터 및 허용 시간대 설정
KEYWORDS = ['정책', '정부', '경제', '안보', '복지', '기업', '주식', '산업']
SEND_HOURS = range(7, 22)  # 오전 7시 ~ 오후 10시 사이에만 전송

🔍 키워드 필터 설정 – 관심 주제만 콕 집어 받기

키워드 필터는 내가 원하는 정보만 골라낼 수 있는 기능입니다. 예를 들어:

  • "정책", "정부", "경제", "복지", "주식", "기업" 등 특정 단어가 포함된 기사만 추출
  • 불필요한 키워드(예: 연예, 스포츠 등)는 제외 처리

이를 통해 정보의 밀도는 높이고, 잡음은 줄일 수 있습니다.


⏰ 전송 시간대 설정 – 타이밍을 전략적으로 설정하기

단순히 정보를 수집하는 것을 넘어, 언제 정보를 전송받을지도 매우 중요합니다.

  • 🕗 출근 전 오전 8시: 하루 시작을 위한 핵심 정보 수신
  • 🕛 점심 12시: 오전 뉴스 요약 및 속보 체크
  • 🕕 오후 6시: 하루 정리 뉴스 및 이슈 확인

이렇게 시간대를 나누면 불필요한 알림 피로도 줄이면서, 중요한 순간에 핵심 뉴스만 받아볼 수 있습니다.


4.전체 RSS 순회 및 전송 시간 설정

# 📌 [8] 전체 RSS 순회 및 전송
async def send_all_rss_news():
    bot = Bot(token=TELEGRAM_TOKEN)
    while True:
        if datetime.now().hour in SEND_HOURS:
            try:
                for rss_url in RSS_FEEDS:
                    news_items = get_rss_news(rss_url)
                    for title, link, source in news_items:
                        message = f"📡 *[{source}]*\n🔗 {title}\n🔗 [기사보기]({link})"
                        await bot.send_message(chat_id=CHAT_ID, text=safe_text(message), parse_mode='Markdown')
            except Exception as e:
                print(f"❌ 전송 실패: {e}")
        await asyncio.sleep(60)  # 1분 간격

🔄 전체 RSS 순회 – 하나도 빠짐없이!

등록된 RSS 피드가 5개든, 50개든, 매번 일일이 수동으로 확인할 수는 없습니다.
따라서 다음과 같은 자동화 순회 방식이 중요합니다:

  • 모든 RSS URL을 일정 간격으로 순회하며 새 게시글 탐색
  • 이전에 전송한 링크는 저장(예: sent_links)하여 중복 방지
  • 새로운 항목이 있을 경우에만 알림 또는 전송

이 과정을 자동화하면 정보 누락 없이 안정적인 뉴스 수집이 가능합니다.

⏰ 전송 시간 설정 – ‘언제’가 가장 효과적인가?

수집된 정보를 언제 전송할지도 중요한 전략입니다.

  • 너무 자주 전송하면 수신자가 피로감을 느낄 수 있고,
  • 너무 늦으면 정보 가치가 떨어질 수 있습니다.
전송시간대 목적
오전 7~9시 출근길 핵심 뉴스 전달
오후 12시 오전 뉴스 요약 및 점심시간 콘텐츠
오후 6~8시 하루 마무리 요약, 속보 정리
심야 전송 (선택) 하루 데이터 요약 백업, 관리자 통계 발송

💡 팁: 전송과 분석을 분리하라

  • 전송 로직은 사용자가 받는 정보 제공
  • 분석 로직은 키워드 통계, 클릭률, 소스별 비율 등 추적 용도

분리해서 운영하면 유지 관리가 쉬워지고, 기능 확장도 유연해집니다.



5. 일간 주간 뉴스 통계 리포트 설정 

async def send_report(bot, period='daily'):
    now = datetime.now()
    if period == 'daily':
        from_time = now - timedelta(days=1)
        title = "📅 *일간 뉴스 통계 리포트*"
    else:
        from_time = now - timedelta(days=7)
        title = "📆 *주간 뉴스 통계 리포트*"

    filtered_log = [log for log in news_log if log[0] > from_time]
    if not filtered_log:
        return

    keyword_counter = Counter()
    source_counter = Counter()
    top_news = []

    for dt, title_txt, link, source in filtered_log:
        keyword_counter.update(re.findall(r"\w+", title_txt))
        source_counter[source] += 1
        top_news.append((dt, title_txt, link))

    top_keywords = ', '.join([f"`{kw}`" for kw, _ in keyword_counter.most_common(5)])
    top_sources = '\n'.join([f"- {src}: {cnt}건" for src, cnt in source_counter.most_common(3)])
    top_articles = '\n'.join([f"[{t}]({l})" for _, t, l in top_news[:3]])

    report = f"{title}\n\n"
    report += f"- 총 수집 뉴스: *{len(filtered_log)}*건\n"
    report += f"- 📈 상위 키워드: {top_keywords}\n"
    report += f"- 📚 주요 소스:\n{top_sources}\n\n"
    report += f"- 📃 TOP 3 기사:\n{top_articles}"

    await bot.send_message(chat_id=CHAT_ID, text=safe_text(report), parse_mode='Markdown')

단순히 뉴스를 수집하는 것을 넘어서, 수집된 정보를 분석하는 것이 중요합니다.
하루 또는 일주일 단위로 주요 키워드, 기사 수, 인기 출처 등을 정리한 통계 리포트를 생성하면 다음과 같은 이점이 있습니다:

  • ✅ 어떤 이슈가 반복적으로 등장했는지 파악
  • ✅ 가장 활발했던 미디어 소스 확인
  • ✅ 자동 요약을 통한 정보 소비 시간 절약

Python이나 자동화 툴을 활용하면, Markdown 또는 PDF 형태로 매일 아침, 매주 월요일 자동 리포트 전송 받아 볼 수 있도록 설계
수집된 정보를 활용하여 2차 수익화 하는 방법은 다음 글에서 소개해보도록 하겠습니다. 

6. 실행화면

코드 실행화면 테스트
코드 실행화면 테스트

코드 실행시 설정된 시간에 맞춰서 자동 전동해주는 모습을 확인 했습니다. 실행하면서 몇 가지 의문이 들었고 다음코딩시 반영해서 문제를 해결해 보겠습니다. 

 

반응형