byminseok.com

Claude로 매일 아침 날씨 카톡 받기 - 판교 날씨 자동화 구축기

Claude로 매일 아침 날씨 카톡 받기 - 판교 날씨 자동화 구축기

기상청 API + Claude API + 카카오톡 + GitHub Actions로 매일 아침 6시에 AI 날씨 브리핑이 카톡으로 오게 만든 과정을 기록합니다.

최종 결과물

매일 아침 6시, 날씨봇 나나🐱가 카카오톡으로 이런 메시지를 보내줍니다:

🐱 오늘(2/12 목) 날씨 브리핑 ☀️

💻 분당
▸ 최저 2°C / 최고 8°C
▸ 하루 종일 맑은 하늘
▸ 저녁부터 기온 뚝, 습도는 85%까지 올라가요

🌲 서천
▸ 최저 0°C / 최고 7°C
▸ 종일 화창한 날씨
▸ 밤 10시부터 영하, 습도 95%로 쌀쌀해요

🌡️ 두 동네 온도차
▸ 분당이 서천보다 2도 높지만, 밤엔 둘 다 매서워요

👗 나나의 옷장
▸ 코트에 니트 조합이면 딱!

🐱 나나의 한마디
▸ 퇴근길엔 목도리 꼭 챙기세요, 체감온도 더 낮아요!

분당과 서천 두 지역 날씨를 동시에 조회하고, 기온별 옷차림까지 추천해주는 AI 날씨 비서입니다.


전체 아키텍처

[매일 아침 6시 KST]
       │
       ▼
  GitHub Actions (cron: 0 21 * * * UTC)
       │
       ▼
  pangyo_weather_kakao.py 실행
       │
       ├─① 기상청 단기예보 API 호출 × 2 (data.go.kr)
       │     → 분당(nx=62, ny=123) + 서천(nx=55, ny=94) 날씨 데이터
       │
       ├─② 기온별 옷차림 매칭 (CLOTHING_MAP)
       │     → 낮 최고기온 기준 옷차림 후보 선정
       │
       ├─③ Claude Sonnet API 호출 (Anthropic)
       │     → 두 지역 날씨 + 옷차림을 자연스러운 브리핑으로 변환
       │
       └─④ 카카오톡 '나에게 보내기' API 호출
             → 나나🐱의 브리핑 메시지를 카톡으로 전송

Step 1. 카카오톡 ‘나에게 보내기’ 스킬 설정 (Claude 웹)

첫 시작은 Claude 웹(claude.ai)에서 했습니다.

1-1. 카카오톡 MCP 스킬 설치

Claude 웹에는 외부 서비스와 연동할 수 있는 스킬(Skill) 기능이 있습니다. 로빈이 만들어둔 카카오톡 ‘나에게 보내기’ 스킬을 다운로드했습니다. 다운로드 링크 아지트

이 스킬은 카카오톡 REST API를 통해 나에게 보내기 기능을 사용할 수 있게 해주는 MCP(Model Context Protocol) 스킬입니다.

설치 후 카카오 개발자 앱 설정이 필요합니다. 상세 단계는 아래와 같습니다:

카카오 앱 설정 상세 가이드

1단계: 앱 생성

  1. 카카오 개발자에 카카오 계정으로 로그인
  2. “내 애플리케이션” → “애플리케이션 추가하기”
  3. 앱 이름: 아무거나 (예: “날씨봇”)
  4. 생성 후 앱 키 탭에서 REST API 키 복사 → 이게 KAKAO_REST_API_KEY

2단계: 카카오 로그인 활성화

  1. 앱 선택 → “카카오 로그인” 메뉴
  2. 활성화 설정: ON
  3. Redirect URI 등록: https://example.com/oauth (아무 URL이나 OK, 코드만 받을 용도)

3단계: 동의항목 설정

  1. “카카오 로그인” → “동의항목”
  2. 카카오톡 메시지 전송 (talk_message) → 선택 동의로 설정

4단계: Client Secret 발급 (선택이지만 추천)

  1. “보안” 메뉴 → Client Secret 발급
  2. 상태를 “사용함”으로 변경
  3. 발급된 값 복사 → 이게 KAKAO_CLIENT_SECRET

5단계: OAuth 인증으로 토큰 발급

브라우저에서 아래 URL을 접속합니다 (REST_API_KEY를 본인 키로 교체):

https://kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri=https://example.com/oauth&response_type=code&scope=talk_message

카카오 로그인 → 동의 → 리다이렉트된 URL에서 code=XXXXX 부분을 복사합니다.

그 다음 터미널에서:

curl -X POST "https://kauth.kakao.com/oauth/token" \
  -d "grant_type=authorization_code" \
  -d "client_id={REST_API_KEY}" \
  -d "redirect_uri=https://example.com/oauth" \
  -d "code={위에서 복사한 CODE}"

응답에서 access_tokenrefresh_token을 복사합니다. 이게 각각 KAKAO_ACCESS_TOKEN, KAKAO_REFRESH_TOKEN입니다.

주의: access_token은 6시간 만료, refresh_token은 2개월 만료입니다. 스크립트에 자동 갱신 로직이 있어서 refresh_token만 살아있으면 됩니다.

1-2. Claude에게 날씨 카톡 요청

스킬 설정이 끝나고, Claude 웹에서 이렇게 요청했습니다:

“판교 내일 날씨 카톡 메시지로 보내줘”

Claude가 기상청 API를 호출하고, 카카오톡 스킬을 통해 메시지를 보내주는 걸 확인했습니다. 잘 동작하는 것을 보고, 이걸 매일 자동으로 돌리고 싶어졌습니다.

1-3. Python 스크립트 생성 요청

“판교 날씨 카톡 메시지로 보내주는 파이썬 스크립트 작성해줘”

Claude 웹이 pangyo_weather_kakao.py를 만들어줬습니다. 이 스크립트는:

  • 기상청 단기예보 API로 판교 날씨를 조회
  • 시간대별 기온, 하늘 상태, 강수 정보를 파싱
  • 카카오톡으로 메시지 전송

이 파일을 로컬에 저장하고, 여기서부터 Claude Code로 작업을 이어갔습니다.


Step 2. GitHub Actions 자동화 구축 (Claude Code)

Claude Code에게 요청했습니다:

“pangyo_weather_kakao.py를 매일 아침 6시에 실행하도록 수정하고, GitHub Action 스크립트 만들어줘”

2-1. 스크립트 수정 - 환경변수 지원

원본 스크립트는 API 키가 코드에 하드코딩되어 있었습니다. GitHub Actions에서 돌리려면 GitHub Secrets로 관리해야 하므로, 환경변수를 우선 사용하도록 수정했습니다.

# 변경 전
CONFIG = {
    "KMA_API_KEY": "YOUR_API_KEY_HERE",
    "KAKAO_SCRIPT": "/mnt/skills/user/kakaotalk/scripts/send_message.py",
}

# 변경 후
CONFIG = {
    "KMA_API_KEY": os.environ.get("KMA_API_KEY", "YOUR_API_KEY_HERE"),
    "KAKAO_ACCESS_TOKEN": os.environ.get("KAKAO_ACCESS_TOKEN", ""),
    "KAKAO_REFRESH_TOKEN": os.environ.get("KAKAO_REFRESH_TOKEN", ""),
    "KAKAO_REST_API_KEY": os.environ.get("KAKAO_REST_API_KEY", ""),
    "KAKAO_CLIENT_SECRET": os.environ.get("KAKAO_CLIENT_SECRET", ""),
    # ...
}

2-2. 카카오톡 REST API 직접 호출 추가

원본은 로컬의 send_message.py 스크립트를 subprocess로 호출하는 방식이었는데, GitHub Actions에는 그 스크립트가 없습니다. 카카오톡 REST API를 직접 호출하는 코드를 추가했습니다.

def send_kakao_api(message, prefix, access_token):
    """카카오톡 REST API로 '나에게 보내기' 메시지를 전송"""
    url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
    headers = {"Authorization": f"Bearer {access_token}"}

    template = {
        "object_type": "text",
        "text": f"{prefix} {message}",
        "link": {"web_url": "https://weather.naver.com"},
    }
    data = {"template_object": json.dumps(template)}
    resp = requests.post(url, headers=headers, data=data)
    return resp.status_code == 200

전송 우선순위도 설계했습니다:

  1. 카카오 REST API 직접 호출 (GitHub Actions용)
  2. 실패 시 → 토큰 자동 갱신 후 재시도
  3. 그래도 실패 시 → send_message.py 스크립트 폴백 (로컬용)

2-3. GitHub Actions 워크플로우 생성

.github/workflows/pangyo-weather.yml:

name: 판교 날씨 카카오톡 전송

on:
  schedule:
    # 매일 아침 6시 (KST) = UTC 21:00 (전날)
    - cron: '0 21 * * *'
  workflow_dispatch: # 수동 실행 지원

jobs:
  send-weather:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          cache: 'pip'

      - run: pip install -r requirements.txt

      - name: 🌤️ 날씨 조회 및 카카오톡 전송
        env:
          ANTHROPIC_API_KEY: $
          KMA_API_KEY: $
          KAKAO_ACCESS_TOKEN: $
          KAKAO_REFRESH_TOKEN: $
          KAKAO_REST_API_KEY: $
          KAKAO_CLIENT_SECRET: $
          TZ: Asia/Seoul
        run: python pangyo_weather_kakao.py

포인트:

  • cron: '0 21 * * *' — GitHub Actions의 cron은 UTC 기준이므로 KST 6시 = UTC 전날 21시
  • TZ: Asia/Seoul — Python의 datetime.now()가 한국 시간을 반환하도록
  • workflow_dispatch — Actions 탭에서 수동 실행도 가능

Step 3. GitHub 레포 생성 및 Secrets 등록

3-1. API 키 준비

필요한 키 목록:

발급처 용도
KMA_API_KEY data.go.kr → 기상청_단기예보 조회서비스 날씨 데이터
KAKAO_REST_API_KEY developers.kakao.com → 앱 키 카카오 인증
KAKAO_CLIENT_SECRET 카카오 개발자 → 보안 → Client Secret 토큰 갱신
KAKAO_ACCESS_TOKEN OAuth 인증 후 발급 카톡 전송
KAKAO_REFRESH_TOKEN OAuth 인증 후 발급 토큰 자동 갱신
ANTHROPIC_API_KEY console.anthropic.com AI 브리핑

기상청 API 키 발급 상세

  1. 공공데이터포털 회원가입
  2. 검색창에 “기상청_단기예보 조회서비스” 검색
  3. 활용신청 클릭 → 목적 아무거나 작성 → 신청
  4. 보통 즉시 ~ 1시간 이내 승인 (자동 승인)
  5. 마이페이지 → 인증키 발급현황 → 일반 인증키 (Decoding) 복사

⚠️ Encoding 키가 아닌 Decoding 키를 사용해야 합니다!

Anthropic API 키 발급 상세

  1. console.anthropic.com 가입
  2. Settings → API Keys → “Create Key”
  3. 키 복사 (sk-ant-… 형태)
  4. Settings → Billing → $5 충전 (이 용도로는 수년간 사용 가능)

참고: Claude Max 플랜(월 $100/$200)은 claude.ai 웹 전용이고, API는 별도 과금입니다.

내 동네 격자 좌표(nx, ny) 찾기

기상청 API는 위경도가 아닌 격자 좌표를 사용합니다.

찾는 방법:

  1. 기상청 격자 좌표 엑셀 다운로드 후 동네 검색
  2. 또는 스크립트의 latlon_to_grid() 함수 사용:
# 예: 강남역 좌표 확인
python3 -c "
from pangyo_weather_kakao import latlon_to_grid
print(latlon_to_grid(37.4979, 127.0276))  # 강남역
"
# 출력: (61, 126)

주요 지역 격자 좌표:

지역 nx ny
서울(종로) 60 127
분당/판교 62 123
강남역 61 126
서천 55 94
제주 52 38
부산 98 76

LOCATIONS 리스트에 원하는 지역을 추가/수정하면 됩니다.

3-2. GitHub CLI(gh) 설치 및 레포 생성

gh CLI 설치

# macOS
brew install gh

# Ubuntu/Linux
sudo apt install gh

# Windows
winget install --id GitHub.cli

GitHub 인증 + 레포 생성

# GitHub 로그인 (처음 한 번만)
gh auth login

# workflow 권한 추가 (Actions 파일 push에 필요)
gh auth refresh -h github.com -s workflow

# 레포 생성 (private)
gh repo create my-weather-bot --private --source=. --push

Claude Code가 gh CLI로 한번에 처리했습니다:

# 레포 생성 (private)
gh repo create pangyo-action --private --source=. --push

# Secrets 등록
gh secret set KMA_API_KEY -b "xxx..."
gh secret set KAKAO_REST_API_KEY -b "xxx..."
gh secret set KAKAO_CLIENT_SECRET -b "xxx..."
gh secret set KAKAO_ACCESS_TOKEN -b "xxx..."
gh secret set KAKAO_REFRESH_TOKEN -b "xxx..."
gh secret set ANTHROPIC_API_KEY -b "xxx..."

보안 포인트: 코드에는 API 키가 전혀 없고, os.environ.get()으로만 참조합니다. GitHub Secrets는 암호화 저장되어 로그에도 ***로 마스킹됩니다.

3-3. 첫 번째 테스트 — 토큰 갱신 실패

⚠️  access_token 만료 - 갱신 시도 중...
❌ 토큰 갱신 실패: 401 Client Error

access_token이 만료된 상태에서 refresh_token으로 갱신을 시도했는데 401 에러가 발생했습니다.

원인: 카카오 앱에 Client Secret이 설정되어 있으면, 토큰 갱신 시에도 client_secret 파라미터를 포함해야 합니다.

# 수정: client_secret 파라미터 추가
def refresh_kakao_token(refresh_token, rest_api_key, client_secret=""):
    data = {
        "grant_type": "refresh_token",
        "client_id": rest_api_key,
        "refresh_token": refresh_token,
    }
    if client_secret:
        data["client_secret"] = client_secret  # 이거 빠져서 401이었음

KAKAO_CLIENT_SECRET을 Secrets에 추가하고 다시 실행 → 성공! 첫 번째 카톡이 도착했습니다.


Step 4. 오늘 날씨로 변경

처음 스크립트는 내일 날씨가 기본값이었습니다. 하지만 매일 아침 6시에 실행되니까 오늘 날씨가 맞습니다.

# 변경 전: 내일이 기본
if args.today:
    target = now
else:
    target = now + timedelta(days=1)  # 기본값

# 변경 후: 오늘이 기본
if args.tomorrow:
    target = now + timedelta(days=1)
else:
    target = now  # 기본값

Step 5. Claude API로 자연스러운 브리핑 생성

5-1. 문제: 딱딱한 데이터 나열

초기 메시지는 이랬습니다:

🐰🔔 판교 날씨 (2/13 금) 맑음 ☀️

🌡️ 1°C / 11°C
🌤️ 맑음 ☀️
☂️ 강수 예상 없음

🕐 6시 1° → 9시 3° → 12시 8° → 15시 10° → 18시 8° → 21시 6°

👉 좋은 하루 보내세요!

나쁘지 않지만, 이런 형태를 원했습니다:

🐰🔔 오늘(2/12 목) 판교 날씨 ☀️

▸ 하루종일 화창한 맑은 날씨가 이어져요.
▸ 기온은 2~9°C로 선선하며, 오후 3시경 8°C까지 올라갑니다.
▸ 바람은 약하고 강수 확률 0%로 쾌청한 하루예요.
▸ 저녁부터 습도가 올라가며 체감온도가 낮아질 수 있어요.

👉 햇살은 좋지만 쌀쌀하니 가벼운 겉옷 챙기세요!

“흐리다가 오후부터 맑아짐” 같은 자연스러운 서술은 코드 로직만으로는 한계가 있습니다. Claude API를 한번 더 태워서 기상 데이터를 자연어 브리핑으로 변환하기로 했습니다.

5-2. 구현: 기상 데이터 → Claude → 브리핑

기상청 API 응답을 시간대별로 정리해서 Claude에게 넘깁니다:

def build_message_claude(forecast, location, label):
    # 시간대별 데이터를 텍스트로 구성
    weather_data = f"""날짜: 2/12 (목)
지역: 판교
최저기온: 2°C / 최고기온: 9°C
대표 하늘: 맑음 ☀️

시간대별:
6시: 2°C, 맑음, 강수확률=0%, 풍속=1.4m/s
9시: 3°C, 맑음, 강수확률=0%, 풍속=1.1m/s
12시: 5°C, 맑음, 강수확률=0%, 풍속=2.0m/s
..."""

    prompt = f"""아래 기상청 데이터를 바탕으로 카카오톡 날씨 브리핑 메시지를 작성해줘.

{weather_data}

규칙:
- 첫 줄: "오늘(2/12 목) 판교 날씨 [이모지]"
- ▸ 로 시작하는 3~5줄의 자연스러운 한국어 브리핑
- 하늘 변화 흐름을 자연스럽게 서술
- 마지막에 👉 한줄 팁 (친근한 톤)
- 메시지 본문만 출력"""

    client = anthropic.Anthropic(api_key=api_key)
    response = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=500,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text.strip()

폴백 구조도 만들었습니다:

  • Claude API 성공 → AI 브리핑 사용
  • Claude API 실패 → 기본 템플릿 메시지로 폴백 (카톡은 어떻게든 감)

5-3. 모델 선택: Haiku vs Sonnet

처음에는 가장 저렴한 Haiku로 시작했는데, 카톡이 이렇게 왔습니다:

👉 퇴근 시간쯤엔 쌌쌌하니까 겨울옷 필수예요!

“쌀쌀”을 “쌌쌌”으로 쓰는 맞춤법 실수가 있었습니다 😂

비용을 비교해보니:

모델 1회 호출 비용 월 비용 (매일 1회)
Haiku 4.5 ~$0.002 ~$0.06
Sonnet 4.5 ~$0.006 ~$0.18

월 $0.18이면 큰 차이가 없어서 Sonnet 4.5로 업그레이드했습니다. 한국어 품질이 확연히 좋아졌습니다.

참고: Claude Max 플랜(월 $100/$200)은 claude.ai 웹/앱 전용이고, API는 별도 과금입니다. console.anthropic.com에서 크레딧을 충전해야 합니다.


Step 6. 두 지역 동시 브리핑 + 날씨봇 나나 🐱

블로그를 읽다 보니 욕심이 생겼습니다. 평일엔 분당에서 일하고, 주말엔 종종 서천에 내려가는데 — 두 동네 날씨를 한번에 보면 어떨까?

6-1. 설계

Claude Code에게 요청했습니다:

“분당 날씨와 서천 날씨를 둘 다 알려주고, 몇 도나 차이나는지 브리핑해줘”

메시지 구조를 함께 설계했습니다:

  • 💻 분당 — 출근하는 곳
  • 🌲 서천 — 주말에 가는 곳
  • 🌡️ 두 동네 온도차 — 기온 비교
  • 🐱 나나의 한마디 — 날씨봇에 이름과 성격을 부여!
    • 월~목: 분당 출퇴근 기반 팁
    • 금~일: “서천에 간다면!” 톤의 주말 팁
# 조회 지역 목록
LOCATIONS = [
    {"name": "분당", "emoji": "💻", "nx": 62, "ny": 123},
    {"name": "서천", "emoji": "🌲", "nx": 55, "ny": 94},
]

6-2. 구현

기존에 단일 지역을 조회하던 구조를 LOCATIONS 리스트를 순회하며 두 번 호출하도록 변경했습니다.

forecasts = []
for loc in LOCATIONS:
    items = fetch_kma_forecast(target_date, loc["nx"], loc["ny"], api_key)
    forecast = parse_forecast(items, target_date)
    forecasts.append((loc, forecast))

message = build_message(forecasts, label)

Claude 프롬프트에는 요일에 따라 나나의 한마디 톤을 다르게 지정했습니다:

if is_weekend:  # 금, 토, 일
    tip_rule = '🐱 나나의 한마디: "서천에 간다면!" 톤으로 한줄 팁'
else:  # 월~목
    tip_rule = '🐱 나나의 한마디: 분당 출퇴근 기반 한줄 팁'

Step 7. 나나의 옷장 — 기온별 옷차림 추천 👗

7-1. 탄생 배경

이 날씨봇을 팀에 공유했더니 반응이 왔습니다:

팀원: “오 저도 이거 카톡 신청해도 되나요?(안됨ㅋ) 아침에 어느 두께의 옷을 입어야 할지도 알려주면 좋겠음”

그 말을 듣고 대학생 때가 떠올랐습니다.

나: “오 그거 저 대학생 때 HCI 수업에서 팀 프로젝트로 만들었던 서비스인데ㅋㅋ 앱 이름이 ‘이거입어’였어요”

그러자 조이가:

조이: “이거입어 테일러버전 만들어줘요!”

2018년에는 3개월 동안 계획하고 만들었던 서비스를, 이번에는 10분 만에 만들었습니다.

7-2. 데이터 구축

기온별 옷차림 이미지 3장을 Claude Code에 넘기고, 중복을 제거하여 8단계 기온 구간으로 정리했습니다.

CLOTHING_MAP = [
    (28, None, "민소매, 반팔, 반바지, 숏팬츠, 린넨 의류, 원피스"),
    (23, 27,   "반팔, 티셔츠, 얇은 셔츠, 반바지, 면바지"),
    (20, 22,   "블라우스, 긴팔 티, 셔츠, 얇은 가디건, 면바지, 청바지, 7부바지"),
    (17, 19,   "얇은 니트, 맨투맨, 가디건, 후드티, 바람막이, 긴바지, 청바지, 슬랙스"),
    (12, 16,   "자켓, 가디건, 청자켓, 야상, 기모후드티, 니트, 맨투맨, 스타킹, 청바지"),
    (9, 11,    "트렌치코트, 야상, 자켓, 점퍼, 니트, 청바지, 스타킹, 기모바지"),
    (5, 8,     "코트, 울 코트, 가죽자켓, 히트텍, 니트, 후리스, 기모 옷, 레깅스"),
    (None, 4,  "패딩, 두꺼운 코트, 누빔 옷, 기모제품, 히트텍, 목도리, 장갑"),
]

7-3. Claude가 센스있게 골라주기

이 옷차림 후보 전체를 나열하면 구구절절해지니까, Claude Sonnet이 1~2개만 센스있게 골라서 자연스럽게 추천하도록 했습니다.

프롬프트에 이렇게 지시합니다:

오늘 낮 최고기온(8°C) 기준 옷차림 후보: 코트, 울 코트, 가죽자켓, 히트텍, 니트, 후리스, ...

규칙:
- "👗 나나의 옷장" 섹션: 위 후보에서 센스있게 1~2개만 골라 자연스럽게 추천
  예: "코트에 니트 조합이면 딱!" 또는 "후드티 하나면 충분해요~"

결과:

👗 나나의 옷장
▸ 코트에 니트 조합이면 딱!

트러블슈팅 정리

1. GitHub Actions에서 workflow 파일 push 거부

! [remote rejected] refusing to allow an OAuth App to create or update workflow

해결: gh auth refresh -h github.com -s workflow로 workflow 스코프를 추가한 후 push.

2. 카카오 토큰 갱신 401 에러

❌ 토큰 갱신 실패: 401 Client Error

해결: 카카오 앱에 Client Secret이 설정되어 있으면 갱신 요청에 client_secret 파라미터가 필수. GitHub Secrets에 KAKAO_CLIENT_SECRET을 추가.

3. Anthropic API 크레딧 부족

Your credit balance is too low to access the Anthropic API

해결: console.anthropic.com에서 $5 충전. 이 용도로는 수년간 사용 가능.


최종 프로젝트 구조

pangyo-action/
├── .github/
│   └── workflows/
│       └── pangyo-weather.yml    # GitHub Actions (매일 6시 KST)
├── pangyo_weather_kakao.py       # 메인 스크립트
└── requirements.txt              # requests, anthropic

GitHub Secrets (총 6개)

Secret 용도
KMA_API_KEY 기상청 단기예보 API
KAKAO_REST_API_KEY 카카오 앱 REST API 키
KAKAO_CLIENT_SECRET 카카오 앱 Client Secret
KAKAO_ACCESS_TOKEN 카카오톡 전송용 토큰
KAKAO_REFRESH_TOKEN 토큰 자동 갱신용
ANTHROPIC_API_KEY Claude API (브리핑 생성)

운영 비용

항목 월 비용
GitHub Actions 무료 (public/private 모두 월 2,000분 무료)
기상청 API × 2 (분당+서천) 무료 (공공데이터)
카카오톡 API 무료
Claude Sonnet API ~$0.20 (하루 1회, 토큰 증가분 반영)
합계 ~$0.20/월

향후 개선 아이디어

  • 미세먼지 정보 추가: 에어코리아 API 연동
  • 주간 날씨 요약: 일요일 저녁에 한 주 날씨 브리핑
  • 카카오 refresh_token 자동 갱신: 만료 1개월 전 자동으로 GitHub Secrets 업데이트 (현재는 수동)
  • 팀원 구독 기능: 원하는 사람도 나나한테 카톡 받을 수 있게

마치며

Claude 웹에서 시작해서 Claude Code로 자동화까지, 기본 버전은 1시간도 안 걸렸습니다. 거기서 두 지역 비교, 옷차림 추천, 날씨봇 캐릭터까지 추가하는 데도 30분이면 충분했습니다.

특히 인상적이었던 점:

  • Claude Code가 gh CLI로 레포 생성, Secrets 등록, 워크플로우 실행까지 한번에 처리
  • 토큰 갱신 에러도 로그 보고 바로 원인 파악 → 수정 → 재배포
  • Claude API를 한번 더 태워서 데이터 나열 → 자연어 브리핑으로 퀄리티 업
  • 기온별 옷차림 이미지 3장을 넘기면 데이터를 알아서 추출하고 코드화
  • 2018년에 HCI 수업 팀프로젝트로 3개월 걸려 만들었던 “이거입어” 서비스를, 2026년에는 10분 만에 만듦

월 300원도 안 되는 비용으로 매일 아침 AI 날씨 비서 나나🐱가 카톡을 보내주는 시스템이 완성됐습니다.