n8n + Telegram + LLM 으로 만든 ‘URL 던지면 요약 답장’ 봇

YouTube 알고리즘이 추천해주는 강연·리뷰 영상을 다 볼 시간은 없지만, 핵심만이라도 빠르게 훑고 싶다. 그래서 Telegram 봇에 URL 을 던지면 30초 안에 요약을 답장하는 봇을 n8n 으로 만들었다.

전체 코드 한 줄 없이 노드 다섯 개로 끝났다. 이 글은 그 워크플로의 설계를 그대로 옮긴 것이다.

전체 흐름

[Telegram Trigger]
          ↓
  [URL 추출 / 분기]
          ↓ (URL 있음)              ↓ (URL 없음)
  [자막 사이드카 호출]            [힌트 메시지]
          ↓
  [OpenAI 요약]
          ↓
  [HTML 답장 전송]

다섯 노드. 그 이상의 복잡도는 의도적으로 만들지 않았다.

1. Telegram Trigger — webhook 모드

n8n 의 Telegram Trigger 는 두 모드를 지원한다. 폴링 모드는 1초마다 getUpdates 를 치는데, 같은 봇 토큰을 다른 곳에서 쓰는 순간 409 충돌이 난다. 그래서 webhook 모드가 깔끔하다.

워크플로를 활성화하면 n8n 이 알아서 Telegram 에 setWebhook 을 등록한다. 등록되는 URL 은 이런 형태.

https://n8n.speech.pe.kr/webhook/<UUID>/webhook

이게 동작하려면 n8n 인스턴스가 공인 도메인 + 유효한 TLS 로 노출돼 있어야 한다. 그 부분은 Nginx + Let’s Encrypt 편에 정리해뒀다.

2. URL 추출과 분기

Telegram 이 보내주는 메시지 페이로드에서 텍스트를 꺼내 정규식으로 YouTube URL 을 뽑는다. n8n 의 IF 노드로 분기.

  • URL 있음 → 자막 사이드카로
  • URL 없음 → “YouTube URL 을 보내주세요” 같은 짧은 힌트 답장

이 단순한 분기 하나가 사용자 실수(다른 텍스트 잘못 보냄)에 대한 가장 큰 사용성 개선이었다.

3. 자막 사이드카 — description 폴백을 같은 응답에 묶다

자막 추출 로직은 별도 컨테이너로 뺐다. n8n 노드 안에서 Python 라이브러리를 직접 호출하기보단, FastAPI 사이드카를 docker-compose 같은 네트워크에 두고 HTTP 로 부르는 게 디버깅과 캐싱에 유리하다.

GET
  http://youtube-helper:8000/transcript?video_id=jNQXAC9IVRw&lang=ko,en

응답은 두 가지 모양 중 하나로 통일.

{ "source": "transcript", "text": "..." }
  { "source": "description", "text": "...", "note": "transcript blocked" }

자막이 막힌 영상은 자동으로 영상 설명으로 폴백한다(VM IP 차단 편 참고). 워크플로 입장에선 같은 형식의 응답이라 분기가 하나 줄어든다.

4. OpenAI 요약 — gpt-4o-mini 한 번 호출

LLM 노드는 n8n 의 HTTP Request 로 OpenAI Chat Completions 를 부른다. 한국어 출력을 강제하고, JSON 으로 구조화된 결과를 받는다.

프롬프트 핵심.

  • 입력: 영상 제목 + 자막 또는 description
  • 출력 JSON 필드: headline, summary, key_points[],
    takeaways[], caveats
  • 자막 소스가 description 인 경우 caveats 에 한계 명시 (“자막이 아닌 영상 설명으로만
    요약했습니다”)

모델은 gpt-4o-mini. 영상 한 편당 호출 비용이 미미해서 운영 부담이 없다.

5. HTML 답장 — Telegram 의 parse_mode=HTML

Telegram 메시지는 일부 HTML 태그를 지원한다. JSON 응답을 그대로 보여주면 가독성이 떨어지므로, 받은 필드를 다음처럼 조립해 한 메시지로 보낸다.

<b>📌 {headline}</b>

  {summary}

  <b>핵심 포인트</b>
  • {key_point 1}
  • {key_point 2}
  ...

  <b>인사이트</b>
  • {takeaway 1}
  ...

  <i>{caveats}</i>

기능 동작 영상 만들기는 어렵지만 채팅 캡처로 결과를 공유하면 일관된 포맷으로 잘 읽힌다.

어디에 안 쓴 노력 — 의도적 단순화

이 워크플로는 의식적으로 안 만든 기능이 더 많다.

  • 사용자별 히스토리 — 안 함. 텔레그램 채팅 자체가 히스토리다.
  • 에러 알림 채널 — 안 함. 워크플로 실행 로그가 n8n UI 에 남는 것으로 충분.
  • 자체 캐싱 — 안 함. 같은 영상을 다시 던지는 빈도가 낮다.

자동화 워크플로의 절반은 무엇을 안 만들지 결정하는 일이다. 가볍게 시작하고, 막상 운영하며 부족한 게 명확해질 때만 추가하기로 했다.

결과

URL 한 줄 → 30초 → 5단락짜리 요약. 영상 길이가 길수록 시간 절약 효과가 크다. 자막이 막혀서 description 만으로 요약할 때도 강연·튜토리얼 채널은 꽤 쓸 만한 결과가 나온다.

자막 우회를 본격적으로 붙이고 싶다면 YouTube IP 차단 편의 옵션 셋(Residential 프록시, Whisper, 외부 API) 중 선택하면 된다.

참고 자료

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤