티스토리 뷰

경제·투자·기술 유튜브를 여러 개 구독하고 있다면 매일 모든 영상을 직접 보는 것은 사실상 불가능하다. 그렇다고 제목만 보고 넘어가면 중요한 시그널을 놓칠 수 있다. 이 글에서는 YouTube 업로드 감지 → 자막 수집 → OpenAI 요약 → 슬랙 전송까지 실제로 동작 가능한 수준의 코드 흐름을 포함해 설명한다. 단순 개념이 아니라, 바로 실험해볼 수 있는 구조를 기준으로 정리한다.


1. 전체 시스템 구조

구성은 다음 네 단계다.

  1. 특정 채널의 최신 영상 감지
  2. 영상 자막(Transcript) 수집
  3. OpenAI API로 구조화 요약
  4. 슬랙 또는 이메일로 자동 전송

리눅스 서버 기준으로 cron에 등록해 10~30분마다 실행하도록 설정하면 완전 자동화가 된다.


2. YouTube 최신 영상 감지 코드

먼저 YouTube Data API 키를 발급받는다.
환경 변수에 저장해두는 것이 안전하다.

export YOUTUBE_API_KEY="your_api_key"

 

Python 코드 예시는 다음과 같다.

import os
import requests

YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
CHANNEL_ID = "UCxxxxxxxxxxxx"  # 대상 채널 ID

def get_latest_video():
    url = "https://www.googleapis.com/youtube/v3/search"
    params = {
        "key": YOUTUBE_API_KEY,
        "channelId": CHANNEL_ID,
        "part": "snippet",
        "order": "date",
        "maxResults": 1
    }

    res = requests.get(url, params=params)
    data = res.json()

    if "items" in data and len(data["items"]) > 0:
        video = data["items"][0]
        return video["id"]["videoId"], video["snippet"]["title"]

    return None, None

실무에서는 마지막으로 처리한 videoId를 파일이나 DB에 저장해두고, 새로운 ID일 경우에만 다음 단계로 진행한다.

 

3. 영상 자막 수집 코드

공식 API는 자막 접근이 제한적일 수 있어 youtube-transcript-api 라이브러리를 사용하는 것이 편리하다.

pip install youtube-transcript-api
 
from youtube_transcript_api import YouTubeTranscriptApi

def get_transcript(video_id):
    transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=["ko", "en"])
    text = " ".join([item["text"] for item in transcript])
    return text

 

이때 자막 길이가 매우 길 수 있다. 바로 API에 넘기지 말고 정제 과정을 거친다.

 
def clean_text(text):
    text = text.replace("\n", " ")
    return text[:10000]  # 과도한 길이 제한

실무에서는 광고 멘트, 반복 문장 제거 로직을 추가하는 것이 좋다.


4. OpenAI로 구조화 요약 요청

OpenAI API 키도 환경 변수로 관리한다.

 
export OPENAI_API_KEY="your_openai_key"

 

Python 코드 예시:

from openai import OpenAI

client = OpenAI()

def summarize_video(title, transcript):
    prompt = f"""
    역할: 당신은 투자 리서치 애널리스트다.
    아래 유튜브 영상 자막을 기반으로 투자 관점에서 정리하라.

    영상 제목: {title}

    출력 형식:
    1. 핵심 주장 3가지
    2. 긍정 요인
    3. 리스크 요인
    4. 시장 영향 분석
    5. 한 줄 결론

    자막:
    {transcript}
    """

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )

    return response.choices[0].message.content
 

여기서 temperature를 낮추면 결과의 일관성이 높아진다.


5. 슬랙으로 자동 전송

슬랙 Webhook URL을 생성한 뒤 다음 코드로 전송할 수 있다.

 
SLACK_WEBHOOK = "https://hooks.slack.com/services/xxxx"

def send_to_slack(message):
    payload = {"text": message}
    requests.post(SLACK_WEBHOOK, json=payload)

6. 전체 실행 흐름 통합

def main():
    video_id, title = get_latest_video()
    if not video_id:
        return

    transcript = get_transcript(video_id)
    cleaned = clean_text(transcript)

    summary = summarize_video(title, cleaned)
    send_to_slack(summary)

if __name__ == "__main__":
    main()
 

이 스크립트를 cron에 등록한다.

 
crontab -e

예시:

*/30 * * * * /usr/bin/python3 /home/user/youtube_summary.py

30분마다 실행되어 새 영상이 올라오면 자동으로 요약이 전달된다.


7. 비용 최적화 전략

자막이 길 경우 한 번에 호출하면 비용이 증가한다.
실무에서는 다음 전략을 사용한다.

  • 2,000~3,000자 단위 분할 후 1차 요약
  • 부분 요약 결과를 다시 통합 요약
  • 제목과 설명란을 함께 전달해 맥락 강화

또한 특정 키워드가 제목에 포함된 경우에만 요약하도록 필터링할 수 있다.

예:

if "금리" not in title and "AI" not in title:
    return

8. 확장 아이디어

여기서 멈추지 않고 다음과 같은 확장이 가능하다.

  • 여러 채널 동시 모니터링
  • 특정 종목 언급 횟수 카운트
  • 감성 분석 추가
  • 주간 PDF 리포트 자동 생성

요약 결과를 구글 스프레드시트에 누적 저장하면
한 달간 “금리 인하” 언급 빈도 같은 통계도 만들 수 있다.


마무리

이 시스템의 핵심은 단순 요약이 아니라
“영상 콘텐츠를 데이터화하는 것”이다.

YouTube API와 OpenAI API를 결합하면
개인 투자자도 자신만의 리서치 자동화 환경을 만들 수 있다.

영상을 소비하는 단계에서 끝나지 않고,
영상에서 구조화된 인사이트를 추출하는 단계로 넘어가는 것.
그것이 이 자동화 프로젝트의 진짜 가치다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함