본문 바로가기

카테고리 없음

Hermes AI 사용기 : 즉석복권 기대값을 자동으로 알려주는 프로그램 만들기(2) - 참고 코드/파일 포함

반응형

1. 개발계획서를 Hermes에게 전달하기

기존에 작성한 개발계획서 활용

기존에 스피또의 기대값(EV)을 매번 직접 계산하는 번거로움을 줄이기 위해 자동화 프로그램의 개발계획서를 작성했다.

최종 목표는 스피또2000뿐 아니라 스피또1000, 스피또500까지 확장할 수 있는 즉석식 인쇄복권 EV(기대값) 모니터링 프로그램을 만드는 것이다.

Hermes에게 전달한 개발 요청 내용

개발계획서 대로 GPT에 코드 작성을 요청해도 되나, 코드작성 후 테스트/수정에 많은 노력이 든다. 이에 , Hermes AI를 활용해 실제 개발을 요청했다.

hermes 실행

 

폴더를 만들어 기존에 작성된 개발 계획서를 읽고 코드작성을 요청
폴더를 추가로 만들어서 작업 수행함

 

AI에게 코드를 작성하도록 하는 것만큼 중요한 것은, 작성한 코드가 실제 환경에서 제대로 동작하는지 확인하는 과정이다.

코드가 작성되면 다음 내용 검증을 요청한다.

 

  • 계획서에 정의한 프로젝트 구조와 역할 분리를 유지할 것
  • 실제 동행복권 데이터를 확인한 뒤 수집 로직을 구현할 것
  • 1등 중심 EV를 핵심 지표로 사용하고, 2등 이하를 포함한 EV는 보조 지표로 다룰 것
  • 데이터 기준일이 오래되었거나 필수 데이터가 누락되면 잘못된 알림을 보내지 않을 것
  • 구현한 기능은 실행과 테스트를 통해 검증할 것

맨위 구간부터 순서대로, 코드 작업중, 검토요청 대기, "/queue" 명령어로 코드검토 지시

 

2. 구현 결과 확인하기

동행복권 데이터 수집

가장 먼저 확인할 기능은 동행복권의 스피또 데이터를 자동으로 가져오는 것이다.

프로그램이 EV를 아무리 정확하게 계산하더라도 입력 데이터가 잘못되면 결과 역시 신뢰할 수 없기 때문이다.

동행복권 홈페이지에서 스피또 발행내역을 확인하고, 회차별로 필요한 정보를 수집하도록 구현한다.

주요 수집 항목은 다음과 같다.

  • 상품명과 회차
  • 복권 가격과 발행량
  • 판매점 입고율
  • 1등 잔여 당첨수량과 당첨금
  • 2등 이하 잔여 당첨수량과 당첨금
  • 판매 종료일과 당첨금 지급기한
  • 등수별 데이터 기준일

70회 잔여수량이 전량잔여로 나온다(오류), 6970회 잔여수량이 전량잔여로 나온다(오류), 69회 EV값이 이상하다(오류)

실제 데이터)

70회

26-10-09 기준
등위
1등
당첨금
1,000,000,000원
당첨수량
8매
지급수량
0매
잔여수량
8매
 
등위
2등
3등
4등
5등
6등
당첨금
100,000,000원
10,000,000원
20,000원
4,000원
2,000원
당첨수량
24매
200매
110,000매
2,800,000매
11,200,000매
지급수량
1매
3매
964매
22,053매
86,267매
잔여수량
23매
197매
109,036매
2,777,947매
11,113,733매

 

69회

 
26-10-06 기준
 
 
등위
1등
당첨금
1,000,000,000원
당첨수량
10매
지급수량
6매
잔여수량
4매
26-10-09 기준
 
등위
2등
3등
4등
5등
6등
당첨금
100,000,000원
10,000,000원
20,000원
4,000원
2,000원
당첨수량
30매
250매
137,500매
3,500,000매
14,000,000매
지급수량
24매
191매
102,811매
2,559,667매
10,146,014매
잔여수량
6매
59매
34,689매
940,333매
3,853,986매

 

오류 수정을 요청한다
70회차는 69회차와 다르게 1등 당첨매수가 8개이다. 10개인데 오류가 났다고 하니 당당하게 아니라고 말한다..

 

작성된 코드에 대한 피드백을 주고 이상없는지 검토를 요청했다. 잘못된 피드백(70회차 복권 10개인데 오류로 8개로 나옴)에도 제대로된 답변을 주었으며, 테스트 결과 이상이 없다고 나왔다(물론 실제 코드를 사용하다보면 오류가 나옴)

 

아래는 실제 개발 결과 기록

  • 데이터 수집 방식
    Playwright 기반 브라우저 자동화 (동행복권 발행내역 페이지 JS 렌더링 후 HTML 파싱)
    - URL: https://www.dhlottery.co.kr/st/pblcnDsctn?stGmTypeCd=st500|st1000|st2000
    - 대기: networkidle + a.spt-box 선택자 로드 확인
    - 재시도: retry_count 설정(기본 3회), 지수 백오프(2초, 4초, 6초), 실패 시 브라우저 재초기화

    수집에 성공한 데이터 (2026-10-09 기준) : 69,70회차

    | 상품       | 회차 수         | HTML 크기 | 주요 회차 상세  
    | 스피또500  | 2개 (48, 47회)  | 123 KB    | 47회: 입고율 70%, 1등 2/8매
    | 스피또1000 | 8개 (110~103회) | 136 KB    | 110회: 입고율 35%, 1등 11/20매
    | 스피또2000 | 8개 (70~63회)   | 136 KB    | 69회: 입고율 96%, 1등 4/10매,
                                                                      70회: 입고율 11%, 1등 8/8매

    파싱 필드: 회차번호, 입고율, 1등/2등 잔여수량·당첨금·데이터기준일, 판매가격

  • 실행 명령어

    bash
    의존성 설치 및 프로젝트 설정
    cd instant-lottery-ev-monitor
    uv pip install -e .
    uv run playwright install chromium

    데이터 수집
    uv run lottery-ev collect

    EV 계산 및 모니터링 대상 확인
    uv run lottery-ev calculate

    Dry-run (알림 조건만 평가, 발송 안 함)
    uv run lottery-ev check

    운영 모드 (수집→계산→알림 발송)
    uv run lottery-ev run

  • 확인한 결과 및 문제점

    ✅ 정상 동작
    - 3개 상품 18개 회차 전체 수집·파싱 성공
    - 테스트 7개 모두 통과
    - 69회 스피또2000: 1등 EV 20,000원(가격 10배), 모니터링 대상 판정, 알림 조건 충족

    ⚠️ 문제점

    | 구분              | 내용                                                                                                       |
    |-------------------|------------------------------------------------------------------------------------------------------------|
    | EV 계산 전제      | "입고율 = 판매율" 가정 시 69회 1등 EV 20,000원(10배) 발생. 실제 판매율과 입고율 괴리 시 과대/과소평가 가능 |
    | 70회 1등 데이터   | 사이트에서 8매/8매 제공 (발행 10개 기준과 불일치). 신규 회차라 데이터 미갱신 가능성                        |
    | 누락 필드         | 판매종료일, 지급기한, 3등 잔여수량(스피또2000)은 HTML에 없음 → 상세 페이지 별도 요청 필요                  |
    | 데이터 신선도     | 69회 1등 데이터일 2026-10-06 (3일 전). first_prize_max_age_hours=24 기본값이면 age 체크로 차단됨           |
    | Telegram 미테스트 | 환경변수 미설정으로 실제 발송 미검증                                                                       |

    🔧 권장 보완
    1. settings.yaml에서 first_prize_max_age_hours 조정 또는 입고율 데이터 소스 교차검증
    2. 70회 등 초기 회차는 입고율 임계값(70%) 미달로 자동 제외됨(정상 동작)
    3. 판매종료일/지급기한 수집용 상세 페이지 크롤러 추가 고려

스피또2000 데이터 파싱

  •  
  • 스피또2000 69회항목수집·계산 결과 
    복권 가격 2,000원
    판매점 입고율 96%
    1등 잔여 당첨수량 4매
    1등 잔여 당첨금 1등 당첨금 × 4매
    계산된 1등 중심 EV 20,000원
    복권 가격 대비 EV 10배
    모니터링 대상 해당
    EV 알림 조건 충족
    현재 구현은 주요 회차 데이터 수집과 1등 중심 EV 계산에 초점을 맞춘 1차 버전이다.
    모든 등위와 모든 부가 정보를 완전히 수집하는 단계까지 완료된 것은 아니다.
    이번 구현 결과를 처음 작성한 개발계획서와 비교해 보았다.

    데이터 수집 JSON 우선, HTML 파싱, 브라우저 자동화 대안 Playwright로 JavaScript 렌더링 후 HTML 파싱
    대상 상품 스피또500·1000·2000 세 상품 모두 수집 성공
    수집 범위 회차별 공개 데이터 총 18개 회차 파싱 성공
    주요 데이터 회차, 입고율, 당첨수량, 당첨금, 기준일 등 주요 필드 수집 성공
    EV 계산 1등 중심 EV 및 전체 잔여 EV 69회 1등 중심 EV 계산 및 모니터링 판정 확인
    예외 처리 재시도 및 데이터 검증 재시도·브라우저 재초기화 적용, 추가 검증 필요
    데이터 신선도 오래된 데이터의 알림 차단 69회 데이터가 24시간 기준을 초과하는 문제 확인
    부가 정보 판매·지급기한 등 현재 HTML에서 확인되지 않아 추가 수집 필요
    Telegram 알림 및 중복 방지 환경변수 미설정으로 실제 발송 미검증
    테스트 계산 및 기능 검증 테스트 7개 모두 통과
    전체적인 데이터 수집과 파싱은 계획대로 진행됐으며, 세 가지 상품을 공통 구조로 처리할 수 있는 기반도 마련했다.

5. Telegram 알림 구현하기

다음 으로 Telegram 봇을 생성 및 연결을 한다.Telegram의 BotFather를 통해 봇을 생성하고, 발급받은 봇 토큰과 메시지를 받을 채팅 ID를 프로그램에 설정한다.

BotFather 를 통한 bot 생성

 

userinfo를 통해 Chat ID를 확인한다.

 

botfather를 통해 얻어진 Bto token(API) 와 userinfo를 통해 얻어진 Chat ID를 ".env"로 저장을 한다.

 

프로그램은 이 값을 읽어 Telegram Bot API를 통해 메시지를 전송하도록 구성한다.

 

.env 를 hermes에게 말하기 전에 bot에 말을 걸어야함(채팅이력이 있어야 ID를 찾을 수 있음)
.env 파일의 정보를 hermes 에게 알려줌

 

 

test 정상 발송
실제 발송 테스트를 통한 알림

 

현재까지 완성된 기능.

현재까지 정보수집 후 텔레그램 발송까진 가능하나 자동 스케쥴러나 메시지에 답변을 하고있진 못한다.

 

윈도우 작업 스케쥴러 같은 경우는 hermes에 요청하면 작업을 해주므로 기본적인 작업은 끝났다.

 

아래는 현재까지 작성한 코드와 설명서이니, 참고(스피또 2000외 동행복권의 다른 복권도 추가된 상태).

참고) 관련 코드 배포

instant-lottery-ev-monitor_dist.zip
0.13MB

사용법

압축 파일을 받은후 : 

1. 압축 풀기
- 파일을 마우스 우클릭 → "모두 압축 풀기" (또는 unzip 명령)
- dist 폴더가 생김 → 그 폴더로 들어감



2. 설정 파일 2개 만들기
dist 폴더 안에서:

| 원본 파일             | 복사본 파일   | 해야 할 일                            |
|-----------------------|---------------|---------------------------------------|
| settings.yaml.example | settings.yaml | 그냥 복사 (수정 안 해도 됨)           |
| .env.example          | .env          | 복사 후 메모장으로 열어서 2개 값 넣기 |

.env에 넣을 값 (필수):

TELEGRAM_BOT_TOKEN=여기에_봇_토큰_붙여넣기
TELEGRAM_ADMIN_CHAT_ID=여기에_내_채팅_ID_붙여넣기


3. 실행 (터미널/명령프롬프트에서)
dist 폴더 안에서 우클릭 → "터미널에서 열기" (또는 cmd/powershell로 cd dist 후):

bash
uv sync
uv run playwright install chromium
uv run lottery-ev run

 

=> 상기 파일로 원하시는 대로 수정해서 사용하시면 됩니다.

마무리

GPT를 통해 작성한 개발계획서를 hermes를 이용해 코드를 구현했다. hermes 를 다운로드 받은후에 실제 실생활에 적용하기 위해 코드작성 및 텔레그램 연동을 해보았다(편의상 cli로 작업했지만 텔레그램을 통해 hermes에게 요청을 해도 동일한 작업을 수행해준다) .

반응형