안녕하세요, log 쌓는 MK 입니다.

넷플릭스를 여러 장소에서 TV로 보시는 분들은 같은 경험이 있으실텐데요.
A 장소에서 보다가 B 장소로 가게 되면 다시 인증을 받아야 합니다. 모바일의 경우 임시 코드를 받는 형태이고, TV로 접속하면 등록된 메일에서 새롭게 인증을 해야 합니다.

빈번하진 않아도 폰을 들고 있지 않은 경우 귀찮은 일이 발생하곤 해서 자동화를 한 번 해보았습니다.


기본 구성

넷플릭스 메일 수신
    ↓ (10~30초 이내)
Gmail → Google Pub/Sub → Cloudflare Tunnel
    ↓
Flask 서버 (Mac Mini)
    ↓
Playwright → "업데이트 확정" 자동 클릭

처음엔 별도의 서버를 두고 싶지 않아서 Apps Script 폴링 방식도 검토했지만 더 짧은 시간내 처리를 위해 Gmail Push 방식을 선택했습니다.

실제 TV에서 인증 요청을 하면 15초 정도면 처리가 되고 있습니다.

사용 스택

  • Google Cloud Pub/Sub
  • Gmail API + OAuth2
  • Cloudflare Tunnel
  • Python + Flask + Playwright
  • M4 Mac Mini

여기서 맥 미니는 제가 사용 중인 홈서버라 그대로 이용을 한 것이고 나머지 추가로 비용이 발생하는 것은 없습니다.


구현

1. Google Cloud 설정

Pub/Sub 주제 생성

console.cloud.google.com에서 새 프로젝트 생성 후 Pub/Sub -> 주제 만들기:

  • 주제 ID: gmail-netflix-alert
  • 기본 구독 추가 체크
새 프로젝트

Gmail 서비스 계정 권한 추가

IAM -> 액세스 권한 부여:

새 프로젝트

Gmail API 활성화 + OAuth 클라이언트 ID 생성

Gmail API 사용 설정 후 사용자 인증 정보 만들기:

  • 데이터 유형: 사용자 데이터
  • 애플리케이션 유형: 데스크톱 앱
  • credentials.json 다운로드
주의! OAuth 앱 게시 상태를 반드시 프로덕션으로 변경해야 합니다.  
테스트 상태로 두면 refresh_token이 7일마다 만료됩니다. 
새 프로젝트 새 프로젝트

2. Mac Mini 환경 셋팅

별다른 건 없고 프로젝트를 구동하기 위한 python 환경과 패키지를 설치하면 됩니다. 아래는 제 예시입니다.

mkdir -p ~/netflix-auto
cd ~/netflix-auto
# credentials.json을 이 폴더에 복사

uv init
uv venv
source .venv/bin/activate
uv add google-auth google-auth-oauthlib google-api-python-client flask playwright
playwright install chromium

3. 넷플릭스 쿠키 저장

넷플릭스 접속해서 쿠키를 저장하는 코드를 생성해 실행하시면 됩니다. 저는 save_cookies.py 로 구성해 두었습니다.

4. 메인 서버

Flask 서버로 main.py로 구성해 두었습니다.

5. Gmail Watch 설정

Gmail 을 체크해 주는 녀석으로 setup_watch.py로 구성해 두었습니다. Watch는 7일 후 만료되기 때문에 crontab 으로 자동 갱신을 설정해 두시면 좋습니다.

6. Cloudflare Tunnel

Pub/Sub이 맥 미니의 Flask 서버로 webhook을 보내려면 외부에서 접근 가능한 URL이 필요해 이용했습니다. 다른 서비스를 이용해도 무방합니다.

실행

tmux를 이용해 두 프로세스를 유지해 두었습니다.

# Flask 서버
tmux new -s netflix-flask
cd ~/netflix-auto && uv run python main.py

# Cloudflare Tunnel
tmux new -s netflix-tunnel
cloudflared tunnel run netflix-auto

트러블 슈팅

Gmail 검색이 안 될 때

넷플릭스 발신자 주소와 메일 제목을 직접 확인해서 검색 쿼리와 맞춰야 합니다. 저의 경우 실제 발신자는 [email protected]이었습니다.

OAuth 토큰 7일 만료

OAuth 앱이 테스트 상태이면 refresh_token이 7일마다 만료됩니다.
Google Cloud Console → OAuth 동의 화면에서 게시 상태를 프로덕션으로 변경해야 합니다.

Cloudflare Tunnel 재시작 후 응답 없음

터널이 재시작되면 그 사이 Pub/Sub 메시지가 유실될 수 있습니다. 이 경우 setup_watch.py를 수동으로 한 번 실행하면 복구됩니다.

이 정도가 제가 실제로 2주 정도 사용해보면서 발생한 이슈 였습니다.


마치며

새 프로젝트

이번 콘텐츠는 별도로 작성한 코드는 공유하지 않았습니다. AI가 대부분의 코드를 짜주는 요즘 사실 코드를 공유하는 것이 큰 의미가 없을 수도 있고, 이런 방법을 통해 저의 불편함을 해소한 사례를 공유한 것이지 이렇게 사용을 권장드린다는 목적이 아니기 때문입니다.

그리고 사실 더 좋은 방법이 있을지도 모르고요…!