본문으로 건너뛰기
멍냥잇 — AI & LIFE

카카오톡 AI 모닝 브리핑 만들기: 설계부터 수동 발송까지

멍냥잇 편집 · 2026년 9월 28일

멍냥잇 AI 활용 제작 기록 · 설계부터 구현까지

“AI로 여러 뉴스를 종합해 매일 아침 카카오톡으로 받을 수 있을까?”라는 질문을 작은 Windows 프로그램으로 시험했습니다. 목표는 뉴스를 사이트에 매일 복사해 올리는 것이 아닙니다. 공식 발표를 모아 Gemini로 한 번에 요약하고, 읽을 내용 전체를 카카오톡 메시지로 보내는 과정을 직접 만들어 보는 것입니다.

아래에는 처음 정한 기준, 실제 개발에서 바꾼 선택, 수신 시험 결과와 직접 따라 할 수 있는 코드를 한 글에 모았습니다. 계획과 검증 결과를 구분해 읽어 주세요.

무엇을 만들려고 했나

처음에는 오전 7시에 관심 있는 AI 소식과 날씨를 카카오톡으로 받아보려고 했습니다. 범위를 정하지 않으면 뉴스가 없는 날에도 세 건을 채우거나, 영어 기사 링크만 보내는 식으로 목적에서 벗어나기 쉬웠습니다. 그래서 서울 날씨와 최근 24시간의 공식 AI 발표 최대 3건으로 첫 버전을 좁혔습니다. 발표가 없다면 없다고 말하고, 수집에 실패했다면 실패라고 구별합니다. 공식 발표는 출처를 추적하기 쉽지만 업계 뉴스 전체를 대표하지는 않습니다.

실행 환경은 Windows PC로 정했습니다. 코드 작성에는 Codex를 보조 도구로 사용했지만, 브리핑 실행은 별도의 Python 프로그램이 자료 수집·Gemini API 호출·카카오 API 전송을 처리합니다. SQLite에는 날짜별 발송 상태를 남깁니다. 별도 서버 없이 시험할 수 있지만, 예약 발송을 쓰려면 해당 시각에 PC와 인터넷이 켜져 있어야 합니다. 현재는 AI를 활용해 어디까지 만들 수 있는지 보여 주는 수동 데모로 보관합니다.

설계 기준 실제 선택과 이유
수집 공식 RSS의 최근 발표만 선별하고 날짜·중복을 확인해 오래된 소식을 오늘 뉴스처럼 보내지 않습니다.
AI 선택된 자료를 Gemini에 한 번에 전달해 공통 흐름과 발표별 핵심을 한국어로 정리합니다. 날씨 수치는 수집값을 씁니다.
전달 200자 제한에 맞춰 나누되 필요한 설명은 전부 카카오톡 본문에 넣습니다. 웹 링크는 제작 과정 확인용입니다.
오류와 재실행 출처·근거·숫자를 검사하고, 발송 상태를 기록합니다. 응답이 사라져 발송 결과가 불명확하면 무작정 재전송하지 않습니다.

완성한 브리핑은 여러 발표를 종합해 카카오 메시지 자체에서 읽는 방식입니다. 오전 7시 자동 발송 설정은 현재 꺼져 있으며, 실제 정시 실행은 아직 검증하지 않았습니다.

처음 생각한 ‘뉴스별 링크’가 부족했던 이유

초기 시험에서는 뉴스마다 짧은 설명과 원문 버튼을 보냈습니다. 기술적으로는 메시지가 도착했지만, 영어 원문을 열어야 내용을 이해할 수 있다면 한국어 모닝 브리핑이라고 하기 어렵습니다. 사이트에 뉴스를 다시 써서 버튼으로 보내는 방법도 목적과 달랐습니다. 그래서 프로그램의 출력 단위를 개별 기사 카드에서 여러 발표를 묶은 하나의 한국어 브리핑으로 바꿨습니다.

지금의 처리 흐름

OpenAI·Google AI 공식 RSS와 서울 날씨 수집 → 최근 24시간 발표 최대 3건 선택 → 읽을 수 있는 공식 본문 또는 공식 RSS 소개문 확보 → Gemini에 한 번에 전달 → 근거·숫자·길이 검사 → 200자 이하 카카오 메시지로 분할 → 발송 상태 기록

WordPress는 이 흐름에 들어 있지 않습니다. 브리핑을 만들거나 읽기 위해 사이트 글을 발행할 필요가 없습니다. 사이트에는 지금 보고 있는 것처럼 설계, 구현, 실패와 검증을 제작 사례로만 남깁니다.

AI에는 종합 설명을 맡기고, 경계는 코드로 확인했습니다

Gemini에는 선택한 공식 자료들을 한 요청으로 보내 전체 흐름, 발표별 한국어 핵심, 사용 전 확인할 점을 생성하게 했습니다. 단순히 번역문을 나열하지 않도록 공통점이 없으면 억지로 묶지 말라는 조건도 넣었습니다. 날짜와 날씨 수치는 AI가 지어내지 않고 수집 결과에서 가져옵니다.

요약 결과에는 발표별 출처 ID와 근거가 된 원문 구간을 함께 요구합니다. 프로그램은 출처 ID와 순서가 맞는지, 근거 구간이 실제 입력 자료에 있는지, 요약에 등장한 숫자가 원문에 있는지 검사합니다. 실패하면 확인되지 않은 뉴스 요약을 보내지 않고 상태만 표시합니다. 근거 문장이 존재해도 요약의 뜻까지 자동으로 보증하지는 않습니다. ‘일부 사용자’, ‘예정’, ‘최대’ 같은 제한 조건은 사람이 표본을 읽어 대조해야 합니다.

공식 본문을 읽을 수 없을 때에는 충분한 길이의 공식 RSS 소개문만 사용하도록 제한했습니다. 이 경우에도 소개문에 없는 세부 기능을 채우지 않도록 요청합니다. 확인할 자료가 부족하면 해당 발표를 건너뜁니다.

카카오톡 안에서 끝까지 읽히도록 바꿨습니다

카카오 기본 텍스트 메시지는 본문이 최대 200자입니다. 시험 브리핑은 첫 메시지에 날씨와 전체 흐름, 다음 메시지들에 발표별 핵심과 확인할 점을 담았습니다. 과거 공식 발표 2건으로 만든 형식 시험에서는 3개 메시지가 테스트 계정의 ‘나와의 채팅’에 도착했고, 주요 내용을 메시지 안에서 읽을 수 있었습니다. 핵심 내용을 읽으려고 버튼을 누를 필요는 없습니다.

다만 카카오 앱에 웹 도메인을 등록한 상태에서는 기본 텍스트 템플릿에 버튼이 표시됐습니다. 빈 링크를 보내도 버튼이 남는 것을 시험으로 확인했습니다. 버튼 이름은 ‘제작 과정’으로 바꾸고 이 글로 연결했습니다. 뉴스 본문이나 영어 기사로 이동시키는 필수 단계가 아닙니다. 버튼 없는 사용자 정의 템플릿도 검토했지만, 제목과 설명이 합쳐 화면에 표시되는 줄 수가 짧아 이번 길이의 브리핑에는 맞지 않았습니다. 카카오 기본 템플릿 · 템플릿 종류와 표시 길이 · 등록 도메인과 버튼 설명

실제로 어디까지 시험했을까요?

항목 결과
카카오 로그인·메시지 동의 실제 계정 연결 완료
여러 공식 발표 종합 과거 발표 2건, Gemini 한 번 호출로 한국어 브리핑 생성
카카오 수신 형식 시험 3개 메시지 도착 확인
코드 검사 수집·근거·길이·중복 방지 등 15개 테스트 통과
오전 7시 정시 발송 미시험, 예약 비활성화

시험에 쓴 발표는 그날 새로 나온 뉴스가 아닙니다. 메시지 형식과 종합 요약의 동작을 확인하기 위해 과거 자료를 사용했습니다. 실제 운영 성능이나 매일 정시 도착을 입증한 시험으로 해석하면 안 됩니다.

실패 경험이 설계를 바꾼 지점

카카오 로그인은 리다이렉트 URI와 메시지 동의 설정이 맞지 않으면 완료되지 않았습니다. OAuth 인증 화면을 오래 열어둔 뒤 돌아오면 임시 상태값이 일치하지 않아 다시 시작해야 했습니다. 그래서 인증값을 채팅에 붙여 넣는 대신 로컬 설정 파일에 보관하고, 로그인은 본인이 직접 완료하는 방식으로 정리했습니다.

AI 호출도 항상 성공하지 않았습니다. 시험 중 한 모델의 서버 오류가 이어져 다른 무료 등급 모델로 바꿔 다시 확인했습니다. 이 경험 때문에 AI 결과를 무조건 발송하는 대신 실패 시 뉴스 요약을 생략하고 상태를 표시하도록 했습니다. 무료 사용량은 모델과 프로젝트 상태에 따라 달라지므로 고정된 ‘하루 무료 몇 회’라고 적지 않았습니다. 현재 한도는 Google AI Studio의 Rate limits에서 확인해야 합니다.

또한 카카오톡 ‘나에게 보내기’는 본인 채팅방 메모여서 푸시 알림이 울리지 않습니다. 따라서 이 데모는 채팅방에 브리핑을 남기는 동작을 보여 주며, 전화 알림 서비스라고 소개하지 않습니다.

직접 구현하려면: 코드부터 첫 메시지까지

직접 재현할 수 있도록 실행 코드 ZIP(약 28KB) 내려받기와 단계별 QUICKSTART.md를 제공합니다. 압축 파일에는 Python 소스·시험 코드·PowerShell 실행 파일·빈 .env.example만 있으며, 실제 API 키·카카오 토큰·실행 로그·수집 데이터는 포함하지 않았습니다. Windows와 Python 3.11 이상을 기준으로 합니다.

  1. 카카오 앱 준비: 카카오디벨로퍼스에서 앱을 만들고 카카오 로그인을 켭니다. 사용할 REST API 키에 리다이렉트 URI http://127.0.0.1:8765/oauth/callback을 등록합니다. 접근권한의 talk_message 동의항목을 설정하고, 제품 링크 관리에 자신의 HTTPS 페이지 도메인을 등록합니다. 카카오 공식 설정 순서
  2. Gemini 키 준비: Google AI Studio에서 API 키를 만들거나 확인합니다. 현재 키 종류와 사용 한도는 프로젝트에서 확인하세요. Google API 키 안내
  3. PC 설정: ZIP을 풀고 그 폴더에서 PowerShell을 엽니다. 다음 명령으로 가상환경과 개인 설정 파일을 만듭니다.
py -3 -m venv .venv
Copy-Item .env.example .env
notepad .env

.env에는 KAKAO_REST_API_KEY, KAKAO_CLIENT_SECRET, GEMINI_API_KEY, KAKAO_PROJECT_LINK, KAKAO_LINK_DOMAINS를 자신의 값으로 채웁니다. 마지막 두 항목의 예시는 각각 https://example.com/my-project/과 example.com입니다. 링크 도메인과 카카오 앱에 등록한 도메인이 일치해야 합니다. 토큰 두 칸은 비워두면 로그인 뒤 프로그램이 채웁니다. 실제 키는 채팅·공개 저장소·사이트에 올리지 마세요.

이제 PowerShell에서 아래 명령을 순서대로 실행합니다. connect가 연 창에서는 직접 로그인하고 카카오톡 메시지 전송에 동의합니다.

& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py doctor
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py connect
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py check-consent
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py check-ai
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py send-test

check-consent가 동의 완료, check-ai가 JSON 응답 확인을 알려주고, send-test의 한 문장이 자신의 카카오톡 ‘나와의 채팅’에 도착하면 연결 단계가 끝납니다. 화면에서 사람이 수신을 확인하기 전에는 API 성공 응답만으로 도착을 단정하지 않습니다.

마지막으로 실제 브리핑을 수동으로 준비·발송합니다. preview는 뉴스를 조회만 하고 발송하지 않습니다. prepare는 발표가 있으면 Gemini 종합 요약을 만들고, send --manual이 당일 메시지를 보냅니다.

& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py preview
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py prepare
& '.\.venv\Scripts\python.exe' .\src\mungnyang_briefing\cli.py send --manual

최근 24시간 공식 발표가 없으면 날씨와 “확인한 공식 발표 없음”만 보내는 것이 정상입니다. 과거 뉴스를 오늘 뉴스인 것처럼 채우지 않습니다. 실제 신규 발표가 나온 날에는 한국어 요약이 원문의 대상·이용 조건을 유지했는지 직접 대조하세요. 같은 날짜의 메시지를 다시 실행하면 중복 발송을 막도록 기록합니다.

오전 7시 예약은 수동 시험을 마치고 스스로 원할 때만 .\install_schedule.ps1로 등록합니다. PC가 켜져 있고 인터넷에 연결돼 있어야 합니다. 이번 시연에서는 오전 7시 자동 발송을 시험하지 않았고, 현재 예약도 꺼두었습니다. 설정 오류의 해결 순서와 예약 해제 명령은 ZIP의 QUICKSTART.md에 적었습니다.

이 제작 사례가 보여 주는 것

AI는 뉴스의 공통 흐름을 한국어로 정리하는 데 쓸 수 있었습니다. 하지만 출처 선정, 분량 제한, 중복 전송 방지, 실패 처리와 사람의 최종 확인은 별도 설계가 필요했습니다. 현재 자동 발송은 꺼두고 수동 시연용으로 보관합니다. 다음 검증에서는 실제 신규 발표가 있는 날의 요약 품질과 오전 7시 정시 실행을 따로 측정해야 합니다.

사이트에는 매일 뉴스 복제 글을 쌓지 않습니다. 이 글은 실제로 어떤 문제를 만났고 어떤 선택을 했는지 설명하는 제작 기록입니다.