배경 및 목적
누구나 돈을 많이 벌고 싶어 합니다.
올바른 투자의 결과로 한강뷰를 볼 수도 있고, 잘못된 선택으로 인해 한강물을 볼 수도 있습니다
시간은 부족한데 보고, 들어야 하는 것은 많아지고 있어 유튜브 요약본을 먼저 확인하고 본 내용을 즐기면 어떨까 하는 생각에서 제가 자주 듣는 유튜브 채널의 신규 영상을 요약하는 시나리오 make.com을 통해 작성해봤습니다
[아주 바쁜 현대인]
참고 자료
유투브 채널 : 시현의 모험(https://www.youtube.com/watch?v=KoBFv3AgH5o&t=694s)
활용 툴
파이썬 : VS, 유튜브 채널 핸들을 이용한 채널 ID 획득용
Make.com : 신규 영상 감지, 스트립트 획득, 요약
LLM : Chat gpt(스크립트 요약)
실행 과정
0. 과정 요약
채널 ID 확인 : 핸들(@XXX)을 이용해 '채널 ID' 를 확인 가능
(GPT에게 핸들을 이용해 '채널 ID'를 획득하는 Streamlit 코드 생성)
[유튜브 핸들, 채널 ID, 비디오 ID]
[핸들을 통해 채널 ID, RSS Feed 생성하는 코드]
import os
import streamlit as st
import googleapiclient.discovery
# YouTube API 키를 환경 변수에서 불러오기
api_key = os.getenv('YOUTUBE_API_KEY')
# 함수: 채널 핸들을 입력받아 채널 ID를 반환
def get_channel_id(handle):
try:
# YouTube API 클라이언트 생성
youtube = googleapiclient.discovery.build('youtube', 'v3', developerKey=api_key)
# 채널 검색 요청 생성
request = youtube.search().list(
part="snippet",
q=handle,
type="channel"
)
# API 요청 실행 및 응답 받기
response = request.execute()
# 응답에서 채널 ID 추출
channel_id = response['items'][0]['snippet']['channelId']
return channel_id
except Exception as e:
# 오류 발생 시 오류 메시지 반환
return f"Error: {str(e)}"
# Streamlit 앱 제목 설정
st.title("YouTube 채널 ID 및 RSS 피드 생성기")
# 사용자로부터 YouTube 채널 핸들 입력 받기
handle = st.text_input("유튜브 채널 핸들을 입력하세요 (예: @3protv)")
# 채널 ID 확인 및 RSS 피드 생성 버튼
if st.button("채널 ID 및 RSS 피드 생성"):
if handle:
# 입력된 핸들로 채널 ID 가져오기
channel_id = get_channel_id(handle)
if "Error" in channel_id:
# 오류 발생 시 오류 메시지 표시
st.error(f"채널 ID를 가져오는 중 오류가 발생했습니다: {channel_id}")
else:
# 채널 ID 출력
st.success(f"채널 ID: {channel_id}")
# RSS 피드 URL 생성 및 출력
rss_feed_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"
st.write(f"RSS 피드 URL: {rss_feed_url}")
# RSS 피드 URL을 코드 형식으로 표시 (복사하기 쉽게)
st.code(rss_feed_url, language='plaintext')
else:
# 핸들이 입력되지 않았을 때 경고 메시지 표시
st.warning("유튜브 채널 핸들을 입력해주세요.")
Streamlit 화면
※ 핸들(@3protv)을 입력하면 채널 ID 및 RSS feed 자동 생성
make.com
[감지 및 URL 추출] - [자막 요청 및 생성 - 대기 - 다운로드] - [자막 요약] - [요약본 전송]
2.1 watch video in channel(Youtube) : 등록된 채널에서 영상이 올라오는 것을 감지하고 영상 URL(Video ID) 획득
channel ID : 획득한 channel ID 입력
limit : 한번에 가져올 영상의 수
2.2 run an actor(Apify) : 업로드된 영상 URL을 전달하여 스크립트 획득
{
"downloadSubtitles": true,
"hasCC": false,
"hasLocation": false,
"hasSubtitles": false,
"is360": false,
"is3D": false,
"is4K": false,
"isBought": false,
"isHD": false,
"isHDR": false,
"isLive": false,
"isVR180": false,
"maxResultStreams": 0,
"maxResults": 5,
"maxResultsShorts": 0,
"preferAutoGeneratedSubtitles": false,
"saveSubsToKVS": false,
"searchKeywords": "Crawlee",
"startUrls": [
{
"url": "https://www.youtube.com/watch?v={{27.videoId}}"
}
],
"subtitlesFormat": "plaintext"
}
actor : streamers/youtube-scraper 사용
input json : StartUrls의 url 중 video ID 부분만 앞에서 획득한 신규 업로드 영상의 Video ID 입력
2.3 Sleep(tools) : apify youtube-scraper를 이용해 자막 생성을 위한 여유 시간 30s추가
(sleep이 없을 경우 스크립트를 얻기 전에 다음 시퀀스로 넘어가게 됨)
→ 추후 누락되는 영상이 있어서 확인해보니 30s를 초과하는 경우가 있었음
자막이 EVEN하게 cooking 되지 않아 40s로 수정(영상의 길이에 따른 적절한 duration time 설정 필요
2.4 Get dataset items(apify) : run an actor를 통해 획득한 스크립트를 가져오기
2.2에서 얻은 자막파일 ID(defaultdatasetID)를 'datasetID'에 추가하여 스크립트(자막)을 얻어 옴
2.5 Create a completion(open ai) : 얻어온 자막을 Open AI를 통해 가공
model : 저렴한 4o-mini 이용
system content : 국내 퀀트 투자의 대명사 '할투'강환국의 영상 요약을 위한 system 프롬프트 입력
※ 채널, 영상마다 내용의 구성이 다르기 때문에 적절한 프롬프트 작성 필요
user content : '2.4 Get dataset items'에서 얻어온 스크립트를 입력
2.6 Send a text message(telegram bot) : 요약된 정보를 텔레그램으로 전달
[3개의 채널을 요약 중]
→ 텔레그램방 한 곳에서 잘 비벼 볼 수 있어 좋음