factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기lotto draw for everyone
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
로또 6/45 번호 생성기와 전 회차 통계 사이트. 주소는. 이 문서는 작업 인수인계서다. 회사 PC, 집 PC, Claude 채팅, VS Code 등 어디서 작업하든 이 파일 하나만 읽으면 "지금 어디까지 왔고, 다음에 뭘 해야 하는지"를 알 수 있도록 쓴다. 작업을 마칠 때마다 맨 아래 진행 기록에 한 줄씩 추가한다. Claude에게: 작업을 시작하기 전에 이 문서를 끝까지 읽을 것. 작업이 끝나면 "진행 기록"과 "할 일"을 갱신하는 것까지가 작업이다. 1. 지금 상태 한눈에 보기 (2026-10-01 기준)README 전문 보기 ↗
로또 6/45 번호 생성기와 전 회차 통계 사이트. 주소는 https://www.lottodraw.kr.
이 문서는 작업 인수인계서다. 회사 PC, 집 PC, Claude 채팅, VS Code 등 어디서 작업하든 이 파일 하나만 읽으면 "지금 어디까지 왔고, 다음에 뭘 해야 하는지"를 알 수 있도록 쓴다. 작업을 마칠 때마다 맨 아래 진행 기록에 한 줄씩 추가한다.
Claude에게: 작업을 시작하기 전에 이 문서를 끝까지 읽을 것. 작업이 끝나면 "진행 기록"과 "할 일"을 갱신하는 것까지가 작업이다.
| 항목 | 상태 |
|---|---|
| 사이트 운영 | ✅ 정상 (GitHub Pages, www.lottodraw.kr) |
| 매주 당첨번호 자동 갱신 | ✅ 정상 (최근 1244회차까지 반영, 2026-10-04). 토요일 밤 추첨 직후 반영 + 네이버·Bing 즉시 색인 요청 추가(2026-10-04, 첫 토요일 확인 필요) → 3번 |
| 블로그 (글 16편, 한국어·영어) | ✅ 공개 (2026-10-02). 애드센스 대응으로 쓴 글. 원고는 content/blog/ → 4-3번 |
| 무료 기능 (생성기, 통계, 당첨번호, 실수령액, TOP 50 · 회차별 그래프) | ✅ 공개 중 |
| 유료 기능 (5개월 통계, 상세 분석 4종, TOP 50 그래프 보조지표·그림도구) | ✅ 무인 판매 중 (2026-10-02~). 카카오뱅크 사업자 계좌 · 휴대폰(MacroDroid 프로) 입금 알림으로 자동 발급 · 텔레그램 알림 · 매일 실서버 점검. 실제 1,500원 입금으로 1분 안에 발급 확인. 키 메일(Resend) 켜짐(2026-10-05) |
| 회원 (구글 로그인 · 좋아요 ♥/$. 가입 무료 체험은 2026-10-11 끝) | 🔄 코드 완성 (2026-10-06). 구글 클라이언트 ID 를 넣으면 켜진다 → 4번 설치 순서 8 |
| 내 번호 저장 · 추첨 결과 메일 (회원) | 🆕 코드 완성 (2026-10-17, 메일은 2026-10-18 "추첨 결과 메일"로 바꿈). 머지하면 deploy-worker 가 배포하고 저절로 켜진다(새 비밀값 없음). 첫 일요일 메일 확인 필요 → 4-5번 |
1등 판매점 통계 (statistics-stores.html) | 🆕 2026-10-17. 262~1245회 1등 · 2등 판매점, 매주 자동 갱신. 머지 뒤 색인 요청 필요 → 4-6번 |
당첨번호 중복 (statistics-repeat.html) | 🆕 2026-10-18. 회차와 회차를 통째로 견준 페이지(6개가 모두 같은 회차 0쌍 · 5개 21쌍, 생일 문제), 매주 자동 갱신. 머지 뒤 색인 요청 필요 → 4-8번 |
| 검색 노출 | 🔄 "로또 통계" 1면 목표 (경쟁: superkts.com). 화면·메뉴는 지금 그대로 두고 푼다 → 4-4번 |
| 애드센스 | ❌ "가치 있는 콘텐츠 부족"으로 반복 반려 → 4-2번. 2026-10-18 스팸 정책 점검: 원인은 회차 1,246쪽(숫자 빼면 97% 같음) → noindex 없이 회차마다 다른 사실 · 메모로 보강 → 4-7번 |
| 유료화 | 🔄 카드 결제는 국내외 모두 업종에서 막힘 → 계좌이체 직접 판매로 전환 (페이앱 카드는 심사 신청 가능) → 4번 |
| 파일 | 내용 |
|---|---|
index.html | 홈. 번호 생성기 + 통계 요약 + 잠긴 상세 분석 4종. 제목 줄 오른쪽에 다음 회차 판매 마감 · 추첨 방송까지 남은 시간(2026-10-13, js/draw-countdown.js — 휴대폰은 제목 아래 세 줄. 다른 페이지는 메뉴 아래 한 줄 띠). 생성 이력 / 보렐의 법칙 카드는 PC · 휴대폰 모두 끝까지 펼쳐 보인다(2026-10-11 — 예전에는 높이를 12vh · 6vh 로 묶어 안에서 스크롤). PC(두 칸)에서는 두 카드의 위아래 끝을 맞춘다(접은 카드는 늘리지 않음, 본문 첫 · 끝 여백도 같게). 생성 과정 로그는 번호 생성 칸의 "번호 생성" 단추 아래(2026-10-11 — 생성 이력 카드에서 옮김. 생성 전에는 안내 한 줄, 쪽 넘김은 로그 제목 줄 오른쪽의 작은 ‹ 1 / 3 ›. PC 는 제목 + 5줄 자리를 미리 잡고, 긴 까닭이 두 줄로 접혀 넘치면 상자 안에서만 스크롤 — 줄 수 · 쪽이 바뀌어도 단추와 아래 카드가 움직이지 않는다. 번호를 못 만든 오류 때는 "혹시 모르죠…" 문장을 감추고 그 자리(줄 + 여백)를 오류 문장 칸이 이어받아 단추가 움직이지 않는다. PC 로그 상자는 마지막 쪽이면 고른 번호 줄이 보이게 끝으로, 쪽을 넘기면 처음부터. 휴대폰 쪽 넘김 단추는 34×28px). 회원 기능(2026-10-11, 로그인하면 — 직전 당첨 조합 제외 · 5게임은 이용권이 있어도, 서버 로그인이 꺼져 있으면 잠그지 않음 · 잠금은 화면에서만): "번호 생성" 옆 5게임(용지 한 장 A.gen-sliders subgrid 로 이름 · 막대 · 값 칸을 맞춘다. AC값 통계 페이지의 "AC값 조건으로 번호 뽑으러 가기"가 index.html#gen-ac 로 와서 그 줄을 잠깐 밝힌다), 내 설정 저장 · 불러오기(고정수 · 제외수 · 켠 패턴 · 막대 칸 · AC값을 계정에 — POST /api/me/generator, 서버가 다듬어 u:<계정>.gen 에, /api/me 로 본인에게만, 탈퇴하면 함께 지움. 2026-10-17 부터 카드마다 따로: 고정수/제외수 카드는 번호 · 두 막대, 배제할 특수 패턴 카드는 켠 패턴만 — 서버에는 한 덩어리라 저장할 때 내 정보를 새로 받아 그 카드 몫만 바꿔 보낸다(SET_PARTS), 저장한 설정이 없으면 화면 전체를 저장). 특수 패턴 기본값(2026-10-17, DEFAULT_PATTERNS): 16개 중 12개를 켜고 4 · 8(모두 1numberHistory_ · clickCount_ 칸도 함께 치운다. 지운 뒤 초점은 카드 제목으로) · 복사(2026-10-12 "번호 복사"에서 줄임, 화면 읽기 이름은 "번호 복사". 머리줄 "로또 6/45 번호 n조합 (날짜) — lottodraw.kr" + 한 줄에 한 조합, 최근 것부터. 누르면 단추 폭 그대로 "완료" · "실패"를 잠깐 보이고 긴 문장은 화면 읽기 프로그램에만) · 공유(2026-10-12 — 휴대폰 공유 창(Web Share: 카카오톡 · 문자 등)으로 "내 로또 6/45 번호 n조합 (날짜)" + 복사와 같은 줄 + https://lottodraw.kr/. 이 기능이 없는 브라우저(PC 대부분)는 단추를 숨긴다. 닫으면 그만, 막히면 복사로 대신) · 출력(생성 이력만 — 용지 한 장 = 5게임 A~E 로 묶은 인쇄 종이. 인쇄 규칙은 가 아니라 머리의 에 둔다: 배포 직후 옛 를 쥔 브라우저에서 홈 전체가 찍혔다. 은 인쇄 창을 닫고 페이지를 다시 만질 때(pointerdown · keydown) 푼다 — afterprint 로 풀면 안드로이드 크롬에서 홈 전체가 찍힌다: 가 곧바로 돌아오며 beforeprint · afterprint 를 먼저 보내고, 시스템 인쇄 창이 미리보기를 그릴 때(용지 · 프린터를 바꿀 때마다) beforeprint 를 다시 보낸다. 단추 없이 시작한 인쇄는 평소 화면 — Ctrl+P 는 키라 먼저 풀린다), 이력이 없으면 단추는 꺼짐. 379px · 339px 이하에서는 단추 좌우 여백(339px 이하는 횟수 글자도 12px)을 줄여 320px 에서도 "오늘 n회 생성"(두 자리까지)과 단추 넷이 한 줄("완료" · "실패"가 떠도 그대로). 생성 이력(오늘 최근 100개, 최근 것이 1쪽 맨 위)과 과정 로그(한 번 생성할 때의 시도, 최근 50줄 — 처음엔 마지막 쪽)는 한 쪽에 씩, 넘치면 카드 안에서 "‹ 이전 · 1 / N · 다음 ›"으로 쪽을 넘긴다(창 폭이 경계를 넘으면 보던 줄이 든 쪽으로 다시 그린다). 통계 카드 순서: 많이 나온 번호 · 보너스 · 연속번호 · 합계 · 1등 당첨자 수 · 최근 50회 · 궁합수 · 미출수 · (2026-10-11 3·4번에서 뒤로) · AC값 · 끝수 — 와 생성기 가 같은 순서(5개월 통계는 미출수 카드가 없어 AC값이 홀짝 앞, 잠금 미리보기와 같게). 쪽을 넘기면 화면 읽기 프로그램에 "생성 이력 2/3쪽"을 읽어 주고, 짧은 마지막 쪽도 빈 줄로 채워 쪽 단추가 제자리에 있다 |
| 파일 | 역할 |
|---|---|
lotto-data.json | 전 회차 당첨 기록 원본. 모든 페이지의 숫자가 여기서 나온다 |
favicon.svg · favicon.ico · apple-touch-icon.png | 탭 아이콘(사이트 남색 바탕 + 노란 로또공 7). 모든 페이지 머리말에 세 줄 — 생성기 shell() 과 손으로 관리하는 페이지(index · about · top-prize · tax · statistics · ranking · contact · privacy · terms · mypage · admin). ico 는 16·32·48px(구글 검색 결과 아이콘은 48의 배수) |
prize-data.json | 회차별 2~5등(당첨 게임 수 w2~w5 · 1게임당 금액 a2~a5) · 판매액(sales). 회차 하나에 한 줄. 같은 동행복권 응답에서 tools/update-lotto-data.js 가 받는다(1회부터 있음). lotto-data.json 은 모든 페이지가 받으므로 따로 둔다 — 생성기 · TOP 50 만 읽는다 |
js/lotto-stats.js | 통계 계산 |
js/stats-render.js js/insights.js js/details.js | 통계를 화면에 그리기. details.js 는 상세 분석 4종(연속번호가 나온 회차 · 번호별 동반 출현 · 내 번호 성적표 · 1등 당첨금 추이 — 성적표 카드는 2026-10-21 "내 번호 과거 대조" 자리에, 계산은 js/report.js 그대로, 2~5등 금액 prize-data.json 은 처음 누를 때 받는다. 처음 열면 마지막 회차의 2등 조합(당첨번호 앞 5개 + 보너스) 예시가 펼쳐져 있다(노란 줄로 "예시 — n회 2등 번호…"를 밝히고, 입력 칸 안내도 같은 번호. 내 번호를 넣으면 예시 줄은 사라진다). 카드에는 요약 · 등수별 횟수 · 가장 좋았던 회차 · 아까웠던 회차 5개, 당첨 회차 전체 · 연도별은 report.html?n= 로 이어 본다). 카드는 제목 · 안내 · 본문 · 주석 네 칸(잠긴 카드는 제목 · 설명 · 단추 세 칸)이고 한 줄의 카드끼리 칸마다 높이를 맞춘다(.detail-card subgrid). 연속번호 · 동반 출현 · 1등 당첨금 목록은 40개까지 그려 두고 12 · 10 · 20개는 늘 보이며, 옆 카드가 길면(성적표 결과 등) fitAll() 이 남는 높이만큼 더 연다(카드는 늘리지 않음, 1등 당첨금 제목 옆 "최근 n회차"도 따라 바뀜) |
cpi-data.json | 월별 소비자물가지수(총지수). 그래프 "물가 반영"이 쓴다. tools/update-cpi.js 가 받는다(손으로 고치지 않는다). credit·link 가 그래프 아래 출처 줄에 그대로 나온다(지금은 OECD, DBnomics 경유) |
tools/update-cpi.js · .github/workflows/update-cpi.yml | 물가지수 받기. 매월 7일 10:20 KST 예약 실행 + 이 두 파일을 고쳐 푸시하면 그 브랜치에서 한 번. 받는 곳: ECOS(비밀값 ECOS_API_KEY 가 있을 때) → OECD → FRED → DBnomics. 1회 달(2002-12)부터 빠짐없고 마지막 달이 6개월 안쪽일 때만 저장 |
min-wage.json | 최저임금(시간급). TOP 50 그래프의 2·3등 비교선(2등 ↔ 연봉, 3등 ↔ 월급). 손으로 고친다 — 다음 해 최저임금은 매년 8월 5일까지 고시되니, 그때 에 한 줄() 더하고 을 그 해 12월 31일로 바꾼다. 월급 = 시급 × (209시간 — 주 40시간 + 주휴, 지금 기준을 모든 해에 똑같이), 연봉 = 월급 × 12. 회차 날짜에 적용되던 시급을 쓰고(2002이듬해 8월, 2005-09-0112월), 뒤 회차는 선을 그리지 않는다. 그래프 선은 계단 대신 직선( — 기간 가운데 날짜에 그 기간 금액, 사이는 날짜 비율). · 가 출처 줄에 나온다. 시험: ( · ) |
CNAME: 사이트 주소(www.lottodraw.kr)를 GitHub Pages에 알려주는 파일ads.txt: 구글 애드센스 광고 인증 파일naver….html: 네이버 서치어드바이저 소유 확인 파일. 지우면 안 된다df151d56acb974ec33c521ed980fa1f2.txt: IndexNow 열쇠 파일(내용도 같은 값). 네이버·Bing 이 색인 요청이 우리 사이트에서 온 것인지 이 파일로 확인한다. 공개돼도 되는 값이다. 지우거나 바꾸면 색인 요청이 거절된다 (바꾸려면 tools/indexnow.js 의 KEY 도 같이)robots.txt sitemap.xml: 검색엔진용 안내 파일_config.yml: GitHub Pages(Jekyll) 설정. 블로그 원고(content/)가 /content/blog/…html 이라는 중복 페이지로 올라가지 않게 뺀다</head> 바로 앞에 비콘 스크립트 한 줄이 있다. DNS가 "DNS only"(프록시 꺼짐)라 클라우드플레어가 자동으로 넣어주지 않으므로 직접 심은 것이다. 생성 페이지는 tools/build-static-stats.js의 CF_BEACON에서, 손으로 관리하는 페이지(index about contact privacy terms statistics tax top-prize report)는 각 파일에 직접 들어 있다. 새 페이지를 손으로 만들면 이 줄도 복사해 넣을 것?v=): 손 관리 페이지(tools/asset-version.js 의 PAGES)의 css/… · js/… 주소 끝 ?v= 는 그 파일 내용의 sha1 앞 8자리다. js/i18n.js 가 불러오는 account.js · theme.js 의 지문은 i18n.js 안 LOAD_V 줄에 같은 도구가 적는다(2026-10-27 — 배포 직후 옛 theme.js 가 쥐어져 홈 메뉴 "판매점 지도"가 안 보였다). node tools/build-static-stats.js 가 끝에 맞춘다 — css · js 를 고쳤으면 빌드를 돌려 커밋할 것(안 돌리면 배포 직후 10분 동안 옛 파일과 섞일 수 있다). 두 작업이 같은 파일을 고쳐 ?v= 줄이 부딪히면 빌드를 다시 돌리면 된다. 새 손 관리 페이지는 PAGES 에 넣는다GitHub Actions란? GitHub가 빌려주는 임시 컴퓨터가 정해진 시간에 저장소의 대본(
.github/workflows/*.yml)대로 명령을 실행해 주는 기능이다. 내 컴퓨터가 꺼져 있어도 돌아간다.
① 토요일 낮 12:07·16:07 예약 (draw-night)
· GitHub 예약은 2시간 반~5시간 늦게 시작한다(2026-09 기록). 그래서 일찍 시작해 기다린다
· 20:40 까지 자다가 1분마다 동행복권 조회
· 한 번 실행은 5시간 반까지 — 그 전에 결과가 안 나오면 자기 자신을 다시 실행해 이어서 기다린다
↓
② 새 회차의 번호와 1등 당첨자 수가 나오면 update-lotto-data 를 바로 실행 (보통 토요일 21시 전후)
· 1등 당첨자 수까지 기다리는 이유: 추첨 직후 API 가 1등 0명/0원을 줄 때가 있다(1228회).
그대로 올리면 회차 페이지에 "1등이 없어 이월"이라고 잘못 나간다
· 자정까지 안 나오면 그만둔다 → 아래 일요일 예약이 받는다
↓
③ 동행복권에서 새 회차를 받고, 최근 3회차를 다시 확인 → 바뀐 게 없으면 여기서 끝
↓
④ 통계 페이지, 회차 페이지, 블로그, 사이트맵을 새 데이터로 다시 생성
↓
⑤ "github-actions[bot]" 이름으로 저장소에 저장(커밋) → GitHub Pages에 재배포 요청 → 사이트 반영
↓
⑥ 사이트에 반영된 것을 확인한 뒤 바뀐 페이지를 네이버·Bing 에 알림 (IndexNow)
안전망: 일요일 03:10 · 월요일 09:10 예약으로 ③~⑥ 을 한 번 더 돈다 (1등 금액이 늦게 확정되는 경우 보정).
lotto-data.json 파일로 저장해 두고, 사이트는 그
파일만 읽는다.draw-night 이 몇 시간씩 "실행 중"(노란 점)인 것이 정상이다(기다리는 중).
겹친 예약이 회색 "Cancelled" 로 남는 것도 정상이다(기다리는 실행은 하나만 남긴다).update-lotto-data → Run workflow 버튼. 바뀐 게 없어도
최신 회차 페이지들을 네이버·Bing 에 다시 알린다. 토요일 낮에 draw-night 을 수동 실행하면 추첨까지 기다린다.html)에 있는 대본만 돈다.결론: 카드 결제는 국내외 어디서도 막혀 있다. 그래서 내 계좌로 직접 받고, 입금되면 사람 손 없이(새벽에도) 서버가 서명한 이용권 키를 바로 내주는 방식으로 바꿨다. 입금 확인 · 키 발급 · 점검이 전부 자동이다. 사람이 하는 일은 드물게 오는 환불 문의를 확인하는 것 하나뿐이다. 키 발급 뒤 단순 변심 환불은 없다(약관 4조, 2026-10-02 개정). 코드는 완성돼 있고, 남은 것은 처음 한 번의 설정(아래 설치 순서)뿐이다.
| 수단 | 판정 | 이유 |
|---|---|---|
| Polar | ❌ | "복권 관련 상품" 거절, 이의신청도 거절 (2026-09-27) |
| 토스페이먼츠 · 나이스페이 등 카드 PG | ❌ | 카드사 공통 등록불가 업종에 "로또번호 생성 서비스"가 그대로 적혀 있다 (나이스페이 등록불가 업종). 토스페이먼츠 약관 제17조도 복권을 판매금지 상품으로 둔다. 사업자등록을 해도 업종에서 막힌다 |
| 카카오페이 직접 연동 | ❌ | 가맹 불가 업종에 "투자/로또정보제공업" 명시, 비사업자 불가 (카카오페이 가맹 안내) |
| 포트원 | ❌ | PG를 묶어 주는 곳일 뿐 심사는 각 PG가 한다. "사행성(복권)" 입점 불가 (포트원 고위험 업종) |
| 네이버 스마트스토어 · 네이버페이 | ❌ | 네이버페이 취급불가에 "복권", 그리고 2025-11-03부터 정보성·비실물 상품 판매 금지. README 옛 계획의 A2(스마트스토어)는 불가로 바뀌었다 |
| Paddle · Lemon Squeezy · Gumroad · Stripe · PayPal | ❌ | 전부 약관에 lottery 금지 (Polar와 같은 이유). Stripe는 한국 사업자 가입 자체가 안 된다 |
| 구글 플레이 결제 | ⏸️ 나중에 | 웹사이트에서는 못 쓰고 안드로이드 앱(TWA)으로 감싸야 한다. 로또 분석 앱의 인앱결제는 실제로 판매 중이다. 다만 사업자등록번호 + 통신판매업 신고번호, 테스터 12명 × 14일 비공개 테스트, 수수료 15%(2026-12-31부터 10%)가 필요하다. 판매가 검증된 뒤 검토 |
| 텔레그램 결제 | ❌ | 디지털 상품은 Telegram Stars만 허용. 사이트를 미니앱으로 다시 만들어야 하고, 수수료·환전 손실 약 35%, 정산이 TON(코인)으로 나온다. 국내 로또 이용자층과 맞지 않는다 |
| 비트코인 · 이더리움 · USDT | ❌ | 기술적으로는 가능(직접 지갑, BTCPay 등)하지만, 2025-02부터 업비트는 본인 지갑·인증된 거래소로만 출금을 허용해 구매자가 내 지갑으로 보내기가 사실상 어렵다. $2짜리에 수수료도 맞지 않는다 |
| 페이앱(PayApp) | 🔶 신청 가치 있음 | 비사업자도 가입 가능(카드 4%). "로또번호 생성 서비스"가 불가가 아니라 '리스크업종'(심사) 으로 분류된 유일한 곳 (페이앱 업종 안내). 통과하면 카드 결제를 켤 수 있도록 코드에 넣어 뒀다 |
| 계좌이체 (내 우리은행 계좌) | ✅ 채택 | 심사·수수료가 없다. 업계 1위 로또 분석 서비스도 카드 없이 무통장입금과 인앱결제만 받는다 |
구매자: 이용권 고름 → 입금자명 적고 주문
→ 화면에 내 계좌와 "주문마다 다른 금액"이 뜸 (예: 5,900원이 아니라 5,866원)
→ 계좌이체 (모바일은 "토스 앱으로 보내기" 버튼)
내 휴대폰: 은행 입금 알림을 받으면 그 내용을 서버로 그대로 넘김 (MacroDroid / 아이폰 단축어)
서버: 알림 속 금액 5,866원 = 입금 대기 주문 하나 → 그 주문이라고 보고 키 발급
구매자: 열어 둔 화면이 10초마다 확인하다가 키를 받아 바로 잠금 해제 (보통 1분 안)
[email protected] 로 주문번호·돌려받을 계좌·소명자료를 받는다(문의 페이지 "환불 신청").
확인되면 관리자 → 그 주문 → "환불 처리(키 정지)" 를 누르고, 계좌이체는 돈을 직접 보낸다(카드는 결제 취소까지 자동).
약관에는 "이 밖에 법률이 청약철회를 인정하는 경우에는 그에 따른다"는 한 줄만 남겼다(법이 정한 권리는 약관으로 못 없앤다).
최종 문구는 법률 전문가에게 한 번 확인받기를 권한다.worker/test/live-smoke.mjs). 돈은 오가지 않는다. 실패하면 텔레그램과 GitHub 메일로 온다.
사람이 시험 구매를 할 필요가 없다.worker/src/keys.js 첫머리.| 이용권 | 가격 | 기간 |
|---|---|---|
| 1일 | 1,500원 · 또는 300포인트(로그인 회원) | 키 받은 때부터 24시간 |
| 이번 회차 (2026-10-21, 추천 카드) | 2,900원 | 키 받은 때 판매 중인 회차의 토요일 밤 12시까지. 토요일 20:00(판매 마감) 뒤에 발급되면 다음 토요일 밤 12시까지 |
| 1개월 | 5,900원 | 키 받은 때부터 30일 |
| 평생 | 12,900원 | 제한 없음 |
plans.js 에 sale: false 로 남아 이미 판 키 · 주문 기록과
관리자 "직접 발급"에만 쓰인다(/api/config 에는 나오지 않고, 주문하면 bad_plan).worker/src/plans.js 의 roundEndsAt 으로 입금이 확인돼 키를 발급하는 때 정한다. 결제 카드에는
"제1247회 · 10월 24일(토) 밤 12시까지 · 남은 시간 3일 08:59:59"를 1초마다 줄여 보여 준다(js/premium.js, 같은 셈). 키 종류 번호 6.POST /api/me/point-pass — 쓸 수 있는 포인트(total − spent)에서
POINTS.dayPass(300)를 쓰고 24시간 키(키 종류 7 pday)를 준다. 랭킹 점수는 그대로. 그 키가 살아 있는 동안은 다시 못 쓴다. 키는 0원 주문(method: 'points')으로
남아 관리자 주문 목록 · 정지가 같은 길이고, 계정에도 붙어(ppass) 다른 기기에서 로그인하면 저절로 들어간다. 발급이 실패하면 포인트를 돌려준다.바꾸려면 worker/src/plans.js 와 js/premium-config.js 두 곳을 같이 고친다(테스트가
둘이 다르면 실패한다). 코드 없이 금액만 바꾸려면 Worker 비밀값 PRICES 에
{"day":1500,"round":2900,"month":5900,"lifetime":12900} 형식으로 넣는다 — 결제 페이지가 서버 값으로 덮어쓴다.
포인트 값은 worker/src/community.js 의 POINTS.dayPass(이용약관 7조 문구도 같이).
Cloudflare API 토큰 만들기: Cloudflare 대시보드 → My Profile → API Tokens →
Create Token → 템플릿 "Edit Cloudflare Workers" → Zone Resources 에 lottodraw.kr 선택 → 만들기.
계정 ID는 대시보드 오른쪽(Workers & Pages 화면)에 있다.
GitHub 저장소 Secrets 넣기: 저장소 → Settings → Secrets and variables → Actions → New repository secret
| 이름 | 값 |
|---|---|
CLOUDFLARE_API_TOKEN | 1번 토큰 |
CLOUDFLARE_ACCOUNT_ID | 1번 계정 ID |
ADMIN_TOKEN | 관리자 페이지 비밀번호. 20자 이상 아무 문자열 (비밀번호 관리자로 생성 권장) |
BANK_NAME | 우리은행 |
BANK_ACCOUNT | 받을 계좌번호 (예: 1002-123-456789) |
BANK_HOLDER | 예금주 이름 |
TELEGRAM_BOT_TOKEN · TELEGRAM_CHAT_ID | (강력 권장) 휴대폰으로 받는 알림: 휴대폰 연결 끊김, 자동 확인 못 한 입금, 자동 점검 실패, 새 주문. @BotFather 로 봇 생성 → 봇에게 말 걸기 → https://api.telegram.org/bot<토큰>/getUpdates 에서 chat id 확인. 없으면 관리자 페이지를 가끔 봐야 한다 |
배포: 이 브랜치를 html 에 합치면 deploy-worker 가 저절로 돈다(또는 Actions 탭 →
deploy-worker → Run workflow). 첫 배포 때 저장소(KV)가 자동으로 만들어지고
api.lottodraw.kr 이 연결되며, 이어서 자동 점검이 서명 키와 입금 알림 열쇠를 만들고
주문부터 환불까지 한 바퀴 돌려 본다. Actions 탭에 초록 체크가 뜨면 서버 쪽은 끝이다.
lottodraw-api → Settings →
Domains & Routes → Add → Custom domain → api.lottodraw.kr.휴대폰 입금 알림 연결 (한 번, 약 5분): https://www.lottodraw.kr/admin.html 에
ADMIN_TOKEN 입력 → "입금 알림 연결" 카드의 안내대로 설정한다.
admin.html (검색 제외, 메뉴에 없음). 토큰은 그 브라우저에만 저장된다. 방문자 통계 비콘은 일부러 넣지 않았다./api/tap 으로 보내고(스크립트를 돌리는 로봇 · 광고 차단기는 빠진다), 뒤의 셋은 서버가 센다(화면에서 보내면 거절). 저장은 공유 · 출력 집계와 같은 e:<날짜>.https://api.lottodraw.kr/api/hooks/deposit (머리글 Authorization: Bearer 열쇠). 열쇠는 관리자 페이지에서 복사한다. 바꾸려면 GitHub Secret DEPOSIT_HOOK_SECRET 을 넣으면 그 값이 우선한다..github/workflows/deploy-worker.yml 첫머리, worker/src/index.js.cd worker && npm test (Worker 와 브라우저 키 확인을 같이 검사).| 날짜 | 내용 | 결과 |
|---|---|---|
| 2026-09-27 | Go live 심사 | 거절 ("lottery-related products are not supported") |
| 2026-09-27 | 1차 이의신청 | 거절 |
| 2026-09-28 | 2차 이의신청 (사람 검토) | 대기 중 — 승인돼도 카드 결제 대안 하나가 늘 뿐, 계좌이체 구조는 그대로 둔다 |
이의신청용으로 넣은 영어 전환은 그대로 쓴다 (4-1번).
Polar 설정값과 결제 링크는 커밋 6017b78 에 남아 있다.
머리글의 KO / EN 단추로 바뀐다. https://www.lottodraw.kr/?lang=en 처럼
주소로 바로 열 수도 있고, 고른 언어는 그 브라우저에 기억된다.
문장을 고칠 곳은 두 군데뿐이다.
js/i18n-dict.js — 회차가 바뀌어도 그대로인 문장(메뉴, 버튼, 안내).
HTML 에는 data-i18n="키" 만 붙어 있고 한국어 원문도 그대로 남아 있다.tools/build-static-stats.js — 회차마다 숫자가 달라지는 해설.
pEn(한국어, 영문) 처럼 영문을 나란히 적어 두면 생성기가
data-i18n-en 속성에 같이 찍는다.주의할 점:
I18N.t() 로 꺼내 쓰는 키는 사전에 ko 도 적어야 한다.
화면에 붙은 문장과 달리 HTML 에 원문이 없기 때문이다./en/ 주소로 영어 페이지를 따로 생성해야 한다 (같은 사전을 쓰므로 번역을
다시 할 필요는 없다).사유: "가치 있는 콘텐츠가 부족함". 여러 번 같은 사유로 반려됐다.
기술적인 문제가 아니다. ads.txt, robots.txt, 광고 코드, 소유 확인
메타태그는 모두 정상인 것을 확인했다.
| 페이지 | 본문 글자 수 |
|---|---|
round/ 회차 페이지 × 1,243쪽 | 각 525자 (대부분 숫자) |
top-prize.html | 150자 — 표를 JS로 그려서 크롤러에게는 거의 빈 페이지 |
tax.html | 767자 |
about.html | 1,239자 |
probability.html | 1,199자 |
| 통계 12쪽 | 950 ~ 3,306자 (표 안 숫자 포함) |
심사자에게 이 사이트는 "같은 틀에 숫자만 바뀐 1,243쪽 + 설명 몇 장" 으로 보인다. 사람이 쓴 글은 다 합쳐도 원고지 40매가 안 된다. 회차 페이지는 검색 유입을 노리고 만든 것이지만, 심사에서는 대량 생성 콘텐츠로 읽힌다.
top-prize.html 정적화. → 2026-10-02. 스크립트가 그리는 표와 글자 하나까지 같은 표를
<!-- seo:rows --> 표식 사이에 미리 박는다. 화면은 그대로(스크린샷 비교로 확인), JS 없이 읽으면 111자 → 1,470자noindex 는 여전히 검색 유입과 맞바꾸는 마지막 수단 — 사용자 결정: 검색 유입을 잃지 않는다(2026-10-13)글을 다 써도 복권 사이트라는 이유로 반려될 수 있다. 구글도 복권 관련 콘텐츠의 광고를 제한적으로만 허용한다. 그때의 대안은 카카오 애드핏 — 승인 기준이 훨씬 느슨하고 국내 사이트에 맞는다. 단가는 애드센스보다 낮다.
글을 쓸 때도 문구 규칙은 그대로다. 예측·적중률·추천 번호는 쓰지 않는다 (아래 문구 규칙).
메뉴의 블로그(blog/index.html)에 사람이 쓴 글 16편이 있다. 4-2번의 "가치 있는
콘텐츠 부족" 반려에 대응해 2026-10-02에 올렸다. 머리글의 KO / EN 으로 영어도 된다.
content/blog/01-is-number-34-special.md ← 한국어 원고. 글은 여기서 고친다
content/blog/en/01-is-number-34-special.md ← 영어 원고. 파일 이름이 같아야 짝이 된다
↓ node tools/build-static-stats.js (tools/build-blog.js 를 불러 쓴다)
blog/index.html ← 목록: 카테고리 단추, 앞부분 미리보기
blog/is-number-34-special.html ← 글: 목차, 이어지는 페이지, 이전·다음 글
sitemap.xml ← 블로그 주소 17개(목록 + 글 16편)가 같이 들어간다
blog/ 의 HTML 은 직접 고치지 않는다. 생성기가 다시 만들면 덮어쓰인다.node tools/build-static-stats.js 를 돌려 blog/ 와 같이 커밋한다.
잊어도 다음 일요일 자동 갱신 때 반영된다(워크플로가 blog/ 도 다시 만들어 커밋한다).content/)는 사이트에 올리지 않는다. 그대로 두면 GitHub Pages(Jekyll)가 원고를
/content/blog/…html 이라는 중복 페이지로 바꿔 올리기 때문에 _config.yml 에서 뺐다.머리말(맨 위 --- 사이):
---
title: 34번이 186회 나온 게 특별한가 — 표준편차로 읽는 출현 횟수
slug: is-number-34-special ← 주소 blog/<slug>.html. 한 번 정하면 바꾸지 않는다
category: 통계 읽기 ← 당첨 이후 · 통계 읽기 · 번호 고르기 · 확률 기초
description: 목록과 검색 결과에 나오는 요약 한두 문장
date: 2026-10-01 ← 화면에는 안 보인다. 사이트맵·검색엔진용
pick: 3 ← 흥미도 1~3. 클수록 목록 위쪽에 올 가능성이 크다 (빼면 1)
related: [frequency] ← 글 끝 "이 글과 이어지는 페이지"
updated: 2026-11-01 ← (선택) 크게 고친 날. 사이트맵·검색엔진에 갱신일로 간다
---
title 과 description 두 줄뿐이다.related 에 쓰는 이름: frequency(많이 나온 번호) · gap(미출수) · pair(궁합수) ·
ac(AC값) · sum(합계) · even-odd(홀짝) · low-high(저고) · consecutive(연속번호) ·
prize-stats(1등 당첨자 수) · prize-tiers(2등·3등 당첨금) · probability(확률) · tax(실수령액) · top-prize(TOP 50) ·
generator(번호 생성기). 새 이름이나 새 카테고리는 tools/build-blog.js 맨 위의
RELATED · CATEGORIES 에 더한다.## 소제목(목차가 저절로 생긴다), 빈 줄로 나눈 문단(문단 안에서 줄을 바꾸면
줄바꿈), - 목록, 1. 목록, > 인용, | 표 |, **굵게**, `코드`, [링크](/tax.html).
링크는 사이트 뿌리 기준(/statistics-frequency.html, /blog/why-jackpots-split.html)으로
쓰면 생성기가 알맞게 고쳐 단다.한국어 블록 하나에 영어 블록 하나가 짝지어져 data-i18n-en 속성으로 들어간다.
그래서 소제목·문단·목록 항목·표 칸·인용의 수와 순서가 한국어와 똑같아야 한다.
어긋나면 빌드가 아래처럼 경고하고 그 글의 영어만 뺀다 (영어 화면에서 그 글만 한국어로 보인다).
! 블로그: en/04-why-jackpots-split.md 의 구조가 한국어와 다르다 — 7번째 블록: 한국어 p, 영어 h2. 이 글의 영어는 뺀다
빌드를 멈추지 않는 것은 일부러다. 매주 도는 자동 갱신이 원고 하나 때문에 서면 안 된다.
흥미도(pick) + 0~1.6 사이 무작위 값으로
줄 세운다. 흥미도 높은 글이 대체로 위에 오고, 이웃한 단계끼리는 섞인다.
지금 흥미도: 3 = 도박사의 오류 · 의사난수와 셔플 (기대값·전망 이론 글은 구매 의욕을 꺾을 수 있어 1),
2 = 34번 · 당첨금 쪼개짐 · 명당 · 궁합수 · 연속 번호, 1 = 나머지(세금·수령·용어 등 실용 글).
섞는 폭은 tools/build-blog.js 의 PICK_JITTERjs/views.js 가 카드마다 data-n 을 적고 ld:views 를 알리면 목록 스크립트가 단추를 연다(서버가 안 되면 숨은 채).
고른 정렬은 기억하지 않는다(다시 오면 기본 순서)slug 를 바꾸면 옛 blog/ 페이지는 생성기가 지운다js/views.js 가 Worker 에서 받아 채운다 — HTML 에는 빈 자리(.post-views[data-post])만 있다.
POST /api/view 로 보내고 센 뒤의 수를 받는다. 같은 브라우저의 같은 글은 하루 한 번
(센 날을 localStorage ld_viewed 에 둔다 — 새로 고침으로는 오르지 않는다). 자동화 브라우저(navigator.webdriver)와
스크립트를 돌리는 검색 로봇 · 측정 도구(Googlebot · Yeti · HeadlessChrome · Lighthouse 등, Worker BOT_UA)는 세지 않는다.
우리 사이트(Origin)에서 온 것만, 같은 IP 1분 60번까지(VIEW_LIMIT). 광고 차단기 · 저장소를 막은 브라우저에서 연 것은 빠질 수 있다.GET /api/views?ids=글,글…(100개까지, 누구나, 60초 캐시). 목록은 카드의 글 이름을 모아 한 번에 읽는다.v:<글> 숫자 한 줄. 누가 읽었는지는 남기지 않는다(개인정보 처리방침 1번).js/views.js 의 MIN 을 올린다.vbase) + 직접 센 수(v:<글>). 같은 때에서 잘라 두 번 세지 않는다.
Actions → seed-views → Run workflow(tools/seed-views.js): apply 를 끄면 표만(Actions 요약에 글별 페이지뷰 · 방문 표), 켜면 넣는다.
시작값은 통째로 갈아 끼워 다시 돌려도 두 번 더해지지 않는다. 비밀값은 CF_ANALYTICS_TOKEN(권한 "Account Analytics: Read", 없으면
배포용 을 써 본다) · · . Cloudflare 를 못 읽으면 칸에 대시보드에서 읽은 수를 JSON 으로.
관리자 API: (글별 직접 센 수 · 시작값), ().
페이지뷰는 새로 고침도 세서 하루 한 번만 세는 직접 센 수보다 조금 후하다목표: 구글에서 "로또 통계"로 superkts.com/lotto/stat/ 보다 위에 뜨는 것. 조건: 지금 보이는 화면·메뉴 구성은 바꾸지 않는다.
/lotto/stat/ "로또 통계", /lotto/stat/number, /lotto/recent/10,
/lotto/stat/hi100·lo100, /lotto/download 엑셀). 표가 전부 HTML 글자로 박혀 있다.statistics.html. 9-15 전까지 무료 "로또 통계" 페이지였고 구글에는 아직 그 제목으로 색인돼 있다.
지금은 유료 결제 페이지라, 이 주소가 "로또 통계"로 노출되면 결제 화면으로 들어오게 되고 홈과 같은 검색어를 두고 다툰다.top-prize.html 표가 JS 로만 그려져 검색 로봇에게 빈 표였다 → 2026-10-02 고침(화면 변화 없음).구글에서 lottodraw.kr 을 치면 AI 요약이 "16가지 특수 패턴을 제외해 번호를 생성하는 도구"라고만 소개했다.
머리글 문구("특수 패턴을 걸러내는 로또 6/45 번호 생성기"), 홈 설명, About 첫 문장이 모두 생성기 이야기였기 때문이다.
지금은 기능이 훨씬 많으므로 사이트를 "로또 데이터 플랫폼" 으로 정의하고, 검색엔진이 읽는 자리마다 같은 말을 쓴다.
| 자리 | 문구 | 고치는 곳 |
|---|---|---|
| 모든 페이지 머리글 | "당첨번호부터 통계·당첨금까지, 로또 데이터 플랫폼" | js/i18n-dict.js brand.tag + 손으로 관리하는 페이지의 brand-tag + build-static-stats.js 틀(생성 페이지) |
| 홈 설명(meta · og · twitter) | "lottodraw.kr은 로또 데이터 플랫폼입니다. …" + 통계 · 당첨금 TOP 50 · 실수령액 · 생성기 | build-static-stats.js updateHome (SITE_KIND) |
| 홈 통계 칸 아래 안내 문단 | 같은 첫 문장. 구글이 홈 검색 결과 설명으로 이 문단을 가져다 쓴다 | 같은 곳. 아래 목록 "통계와 기능 자세히 보기"에 TOP 50 · 실수령액 · 블로그 추가 |
| 홈 구조화 데이터 | WebSite.description 에 기능을 하나씩 다 적는다 | 같은 곳 |
| About | 제목 · 설명 · 첫 문단 · 주요 기능 목록 | about.html (영문은 사전 about.*) |
홈 제목("로또 통계 분석 · 번호 생성기")은 "로또 통계" 검색어를 맡고 있어 그대로 두었다.
새 기능을 만들면 About 주요 기능 목록과 WebSite.description 에 한 줄씩 더한다.
구글 요약이 바뀌는 데는 다시 긁어 갈 때까지 몇 주 걸린다 — Search Console 에서 홈 · About 색인 생성 요청을 하면 앞당겨진다.
statistics.html?) 몇 위로 노출되는지 본다.
statistics.html 이 잡혀 있으면 아래 "결정할 것" 1번을 검토한다. 2~4주마다 같은 화면을 적어 둔다.top-prize.html 색인 생성 요청. 네이버 서치어드바이저에 사이트맵 다시 제출.Search Console → 실적 → 검색결과 → 기간 3개월 → + 새 필터 → 검색어 → "로또 통계"(검색어 포함) → 아래 페이지 탭. 2~4주마다 한 줄씩 적는다. 이 표가 "결정할 것"을 고르는 근거다.
| 날짜 | 노출되는 주소 | 노출수 | 클릭수 | 평균 게재순위 | 메모 |
|---|---|---|---|---|---|
| (첫 기록) | 머지 직후 한 번 |
| 안 | 화면 변화 | 효과 |
|---|---|---|
1. statistics.html 에 noindex | 없음 (검색 결과에서만 빠진다) | "로또 통계" 신호가 홈 하나로 모인다. 대신 결제 페이지가 검색에 안 나온다 |
| 2. 통계 12쪽 맨 아래에 "이 통계와 이어지는 글"(블로그 링크) | 페이지 맨 아래 목록 한 줄 추가 | 블로그 ↔ 통계 내부 링크. 아래 7번 할 일 10 |
3. draws.html 에 "엑셀(CSV) 내려받기" 단추 | 단추 하나 추가 | "로또 당첨번호 엑셀" 검색어 (superkts /lotto/download 가 1면) |
| 4. 무료 "로또 통계" 허브 페이지 + 메뉴 개편 | 메뉴가 바뀐다 | "로또 통계" 전용 착지점. 보류(2026-10-02). 만들어 둔 것이 커밋 692f3b5 에 있다(되돌림 revert 커밋 앞) |
로그인한 회원 기능 두 가지. 결제 서버(worker/)에 붙였지만 결제와는 따로 돈다.
lotto-data.json 을 받아 그때그때 맞춘다. 그래서 토요일 밤 봇이 당첨번호를 갱신하면 따로 할 일 없이
등수(1~5등 · 낙첨), 맞은 번호(색칠), 최근 4/12/52회 · 전체 누적 횟수가 나온다. 추첨 전 회차는 "추첨 전".ms:). 켠 회원 가운데 그 회차 번호를 내 번호에 저장한 회원에게만 보낸다
(보낼 것이 당첨번호뿐인 주에는 보내지 않는다)./round/<회차>.html — 등수별 당첨금 · 당첨 게임 수)와 마이페이지 링크, 수신 거부 · 문의.
제목 "[lottodraw.kr] 1246회 당첨번호와 내 번호 결과". 글자 메일(HTML 아님). 등수는 서버가 rankOf 로 맞춘다(마이페이지 화면과 같은 규칙).17 * * * *). 사이트의 lotto-data.json 맨 앞 회차가 그 회차가 된 뒤에만 보낸다(토요일 밤 갱신 —
늦으면 기다린다). 밤 9시 ~ 아침 9시는 보내지 않는다(광고성 메일 야간 전송 제한(21시List-Unsubscribe + List-Unsubscribe-Post 한 번 누르기)도 된다. 링크에는 구글 계정 번호 대신 회원 참조값과
서명(HMAC, 비밀값은 회원 저장소 mailkey 에 처음 쓸 때 만든다)만 들어간다.mr:<회차> 에 둔다. Resend 에는 같은 묶음은 한 번만 보내라는 표시(Idempotency-Key result-<회차>-…)를 붙인다. 예전 생성 번호 메일 기록(mw:)은 같은 회차 결과 메일을 보낼 때 치운다.waitUntil 로 돌고 오류를 삼킨다. 결제용 KV 는 읽지도 쓰지도 않는다(시험이 확인).
Resend 가 실패하면 다음 시간에 다시, 세 번 연달아 실패하면 그 회차는 멈추고 텔레그램으로 알린다. 다 보내면 "발송 끝: n통"도 텔레그램으로(0통이면 알리지 않는다).RESEND_API_KEY · MAIL_FROM)과 구글 로그인이 켜져 있으면 저절로 켜진다. 선택: WEEKLY_MAIL_DAILY(하루 몇 통, 기본 80), WEEKLY_MAIL_FROM(보내는 사람, 기본 MAIL_FROM) — 이름은 처음 그대로 둔다.worker/src/index.js 의 resultMail · resultText, 저장은 community.js 의 mailPrepare · mailCommit. 시험: worker/test/mynumbers.test.mjs.| 한도 (무료) | 이 기능이 쓰는 양 | 판단 |
|---|---|---|
| Workers KV 쓰기 하루 1,000회 (결제가 쓴다) | 0회. 내 번호 · 구독 · 발송 기록은 전부 회원 저장소(Durable Object Community, SQLite)에 둔다 — 좋아요 · 랭킹과 같은 곳. KV 는 손대지 않는다 | 결제 한도에 영향 없음 |
| Durable Object 쓰기 하루 100,000행 | 번호 저장 · 지우기 1번에 1행(회원 한 명의 번호를 한 줄 k:<계정> 에 모은다), 메일 켜기 · 끄기 2행, 메일 1통에 1행(지난번 번호) + 묶음마다 2행. 회원 1,000명이 하루 다섯 번씩 저장해도 5,000행 | 5% |
| Durable Object 읽기 하루 5,000,000행 | 마이페이지를 열 때 4행(세션 · 계정 · 내 번호 · 구독), 메일 묶음(100명)마다 약 200행 | 매우 여유 |
| Durable Object 저장 5GB | 회원 한 명 최대 600게임 ≈ 30KB → 1,000명이 꽉 채워도 30MB | 매우 여유 |
| Workers 요청 하루 100,000회, 예약 실행 CPU 10ms | 마이페이지 열 때 API 2번. 메일 번호 만들기는 회원 저장소 안에서 하고, 예약 실행은 당첨번호 파일 앞 1KB 만 읽는다 | 여유 |
| Resend 하루 100통 · 한 달 3,000통 (키 메일과 함께) | 결과 메일은 하루 80통까지(20통은 키 메일 몫). 일 80 + 월 80 = 한 주 160명까지(그 회차 번호를 저장한 구독자 수). 한 달로는 160 × 4.3 ≈ 690통 | 받을 회원이 160명을 넘으면 월요일 저녁까지 다 못 보낸다 → 텔레그램 경고. 그때 Resend Pro(월 $20, 5만 통, 하루 한도 없음)로 바꾸고 WEEKLY_MAIL_DAILY 를 올린다 |
(무료 한도 값은 2026-10 Cloudflare · Resend 문서 기준. 바뀌면 이 표를 고친다.)
/wnprchsplcsrch/home) 화면이 부르는 공개 조회
https://www.dhlottery.co.kr/wnprchsplcsrch/selectLtWnShp.do?srchWnShpRnk=all&srchLtEpsd=<회차>(GET, 로그인 없음, JSON).
한 회차의 1등 · 2등 판매점이 한 번에 온다. 262회(2007-12-29)부터 있고 그 앞은 빈 목록이다. 1등은 자동 · 수동 · 반자동이 나오고 2등은 최근 회차만 방식이 나온다.
1245회 1등 10곳 = 1등 당첨자 10명, 2등 91곳 = 2등 91게임(prize-data.json)으로 한 줄이 한 게임임을 확인했다.Disallow: /resources/, Disallow: /winImages/ 뿐 — 판매점 조회는 막혀 있지 않다.stores-data.json(전 회차 판매점 목록)이 올라간다. 저작권법의 데이터베이스 제작자 보호(제93조)는 "상당한 부분"을 복제하는 것을 막는데,
공공 수탁사업자가 공개한 당첨 사실 자료라 문제 될 가능성은 낮다고 보지만 확실하지 않다. 걱정되면 저장소를 그대로 두고 이 파일만 빼는 방법(생성기가 매주 전체를 다시 받는 대신 집계만 남기기)도 있다.
동행복권이 막거나 요청하면 바로 멈춘다(워크플로에서 "1등 판매점 수집" 단계를 지우면 끝, 페이지는 마지막 자료로 남는다).--slow, STORES_MAX_MINUTES 로 시간 상한 — 끊겨도 받은 데까지 저장되고 다음 실행이 잇는다).1등이 자주 나온 곳은 많이 팔린 곳일 가능성이 크다. 판매점별 판매량은 공개되지 않으므로 같은 판매점의 2등 횟수를 판매량의 대리 지표로 쓴다 (2등은 한 게임 6/8,145,060 — 1등보다 6배 잘 나오고, 1등과는 다른 게임에서 나오며, 팔린 게임 수에 비례해 쌓인다). 1등 횟수 묶음별 평균 2등이 함께 올라가면 "운 좋은 곳"보다 "많이 팔린 곳"이라는 설명이 맞다. 문장은 자료에 따라 조건을 건다(함께 올라가지 않으면 단정하지 않는다). 순위 표 아래에는 "지난 기록일 뿐, 앞으로 1등이 나올 곳을 뜻하지 않는다".
애드센스 "가치 있는 콘텐츠 부족" 반려와 구글 스팸 정책(대량 생성 콘텐츠 남용 · 출입구 페이지 · 얇은 콘텐츠)에
생성 페이지가 걸리는지 실측했다. 2026-10-13 에 한 번 했고(PR #77), 그사이 html 이 많이 바뀌어 PR #77 은 닫고
2026-10-18 최신 코드(1246회 · 1등 판매점 포함)에서 다시 했다. 측정 도구는 일회용이라 저장소에 넣지 않았다.
| 종류 | 쪽수 | 본문 글자 | 숫자 | 사람이 읽는 문장 | 페이지끼리 같은 정도 | 제목 · 설명 | 사이트맵 | 들어오는 링크(중앙) |
|---|---|---|---|---|---|---|---|---|
| 회차 | 1,246 | 약 740 | 약 270 | 약 280 (전부 공통 문장) | 숫자 빼면 97% (문장 틀 5가지뿐) | 모두 고유 | 모두 | 3 |
| 통계 (12종 + 1등 판매점) | 13 | 약 940 | 약 300 | 약 390 | 56% (주로 "다른 통계" 목록) | 모두 고유 | 모두 | 15 |
| 2·3등 통계 | 1 | 3,290 | 1,160 | 1,770 | — | 고유 | 들어 있음 | 거의 모든 페이지 |
| 블로그 글 | 16 | 약 2,060 | 약 250 | 약 1,650 | 4% | 모두 고유 | 모두 | 3 이상 |
글자 수는 <main> 안, 공백 · 그림(SVG) 글자 제외. "사람이 읽는 문장"은 표 밖 문단 중 한글 15자 이상인 것. "같은 정도"는 숫자를 #로 바꿔 같은 종류 페이지 절반 이상에 나오는 블록의 비율, 회차 "숫자 빼면 97%"는 5글자 조각 겹침.
중복 제목 · 설명 0, 설명 빠짐 0, 깨진 내부 링크 0, 사이트맵 누락 · 잘못 들어감 0, canonical 이상 0 — 바로 고칠 것이 없었다.
| 종류 | 스팸 정책 | 애드센스 · 품질 | 근거 |
|---|---|---|---|
| 회차 | 중 | 상 | 틀로 찍은 1,246쪽 = 생성 페이지의 대부분. 다만 실제로 찾는 정보(회차 당첨번호)와 진짜 자료(등수별 표)가 있고 다른 곳으로 몰아가지 않아 "순위 조작 목적" · 출입구 페이지로 보기는 어렵다 |
| 통계 13쪽 | 하 | 중 | 주제가 다 다르고 계산기 · 분포 표 · 그래프가 있다. 설명 문장이 짧은 쪽이 있다 |
| 2·3등 · 블로그 | 하 | 하 | 고유한 글 |
정책 문구는 구글 공식 문서를 직접 열지 못했다(작업 환경 네트워크가 developers.google.com 을 막음). 검색 결과 요약과
알려진 공식 문서 내용으로 판단했다 — 대량 생성 콘텐츠 남용은 "순위 조작이 주목적 + 더해 주는 가치가 적은 많은 페이지"(만드는 방법은 묻지 않음),
출입구 페이지는 "비슷한 검색어로 순위를 얻으려고 만든, 실제 목적지로 보내는 중간 페이지".
| 안 | 검색 유입 | 애드센스 | 작업량 | 매주 자동 갱신 | 결정 |
|---|---|---|---|---|---|
| (a) 회차마다 고유 정보 보강 | 잃지 않음(주소 · 제목 그대로), 회차 사이 링크로 오히려 도움 | 도움(보장은 아님) | 생성기 수정 + 메모 원고 | 그대로 — "당시" 기준이라 옛 회차가 매주 바뀌지 않음 | ✅ 채택 |
| (b) 오래된 · 정보 적은 회차 noindex / 사이트맵 제외 | 그 회차 유입이 사라짐 | 도움 | 작음 | 조건만 넣으면 됨 | ❌ 사용자 결정(2026-10-13): 유입을 잃지 않는다 |
| (c) 묶음 페이지로 합치고 canonical | 주소가 바뀌어 순위를 다시 쌓는 동안 줄어듦 | 도움 | 큼(새 페이지 · 이동) | 묶음 갱신 규칙 필요 | ❌ 같은 이유 |
(a) 의 주의점: 틀은 같고 숫자만 바뀐 문장을 늘리면 오히려 대량 생성 쪽 위험이 커진다. 그래서 문장 대신 표 칸 · 링크로, 문장은 "해당될 때만"으로, 그리고 사람이 쓴 메모로 넣었다. 후보마다 회차별로 값이 몇 가지로 갈리는지 재서 골랐다 (직전 출현 간격 1,244가지 · 가장 많이 겹친 지난 회차 974가지 · 당시 1인당 순위 1,232가지 → 채택, 판매액 증감 · "그 해 몇 번째"는 뺐다).
| 측정 (회차 1,246쪽) | 전 | 후 |
|---|---|---|
| 모든 회차에 같은 설명 문장 | 약 280자 | 약 180자 (세금 설명을 한 줄 + 링크로, "당첨 게임 수는 따로 셉니다" 삭제) |
| 페이지끼리 같은 정도 (숫자 포함) | 39% | 30% |
| 같은 정도 (숫자 무시) | 97% | 96% — 같은 칸에 다른 자료를 담는 자료 페이지라 뼈대는 그대로 |
| 회차로 들어오는 링크(중앙) | 3 | 8 |
| 회차만의 문장이 있는 쪽 | 0 | 49 (기록 · 이월 · 5개 일치 · 메모 9개) → 메모를 23개로 늘려 58쪽(2026-10-18) |
그 밖에: 1회 "1~1회 출현" → "1회 출현", 사이트맵 회차 lastmod 를 2026-10-18 로(ROUND_FACTS_SINCE). 같은 자료로 두 번 돌리면 바뀌는 쪽 0.
tax.html 설명이 208자로 검색 결과에서 잘릴 수 있다 — 다른 세션이 1등 평균 두 기준을 넣어 일부러 쓴 문장이라 손대지 않았다(필요하면 줄일 것).
content/round-notes.md)를 조금씩 늘린다 — 사람이 쓴 고유 내용이 가장 강한 신호다.사용자 질문 "지금까지 완전히 같은 번호가 나온 회차가 있나?"에서 시작했다. 답은 없다(1~1246회, 보너스까지 7개로 봐도 없다). 한 번 답하고 끝내기보다 매주 바뀌는 숫자라 통계 페이지로 만들고, 설명(생일 문제)은 이미 다룬 블로그 09 에 한 문단 + 링크로 붙였다.
statistics-repeat.html): 회차 쌍 N(N−1)/2 개를 모두 견준다. 같은 번호 k개 쌍의 기대 = 쌍 수 × C(6,k)·C(39,6−k)/C(45,6).
1246회 기준 실제/기대: 6개 0/0.10 · 5개 21/22.3 · 4개 1,001/1,058 · 3개 17,361/17,406. "지금까지 한 번이라도 같았을 확률"은 생일 문제 곱
(1 − 1/T)(1 − 2/T)… 으로 9.1%, 50%를 넘는 회차는 3,361회(매주 한 번이면 2067년 무렵). 다음 회차가 지난 회차 중 하나와 똑같을 확률 1,246/8,145,060 ≈ 1/6,537.REPEAT_SINCE) ·
5개 일치 회차 21쪽의 "눈여겨볼 점" 문장(2등이 되는 786회는 한 문장 더) · 블로그 09 한 · 영(related: repeat, updated: 2026-10-18) · 사이트맵.생성기 · 통계와 따로 둔 페이지 store-map.html. 생성기 페이지에 기능을 더 얹지 않으려고 나눴다(사장님 결정).
가는 길(2026-10-27 메뉴 맨 오른쪽으로 다시 — 아래): 생성기 제목 아래 "판매점 지도 →"(PC), 휴대폰은 오른쪽 아래 낮/밤 단추 위 동그란 MAP 단추,
모든 페이지 바닥글 아래 큰 띠("🗺️ 로또 판매점 지도 보러 가기", 다른 사이트 광고 띠처럼). MAP 단추 · 띠는 js/theme.js 가 붙인다(지도 페이지 자신에는 없음).
홈 "사용법 보기"에 판매점 지도 · 낮/밤 · 채팅 단계를 더했다(숨겨진 단계는 빼고 센다).
js/vendor/, BSD — 사이트에 직접 둔다, CDN 의존 없음) + OpenFreeMap "positron" 바탕(키 · 요금 없음, 상업 사이트 가능, © OpenStreetMap).
바탕 글자는 한글 이름(name:ko)으로 바꿔 그린다. 큰 나라 이름은 위쪽 도구와 겹쳐 감춘다.building 의 render_height), 줌 15를 넘으면 지도가 저절로 55° 기울고 13 밑으로 나가면 다시 평평해진다.
3D 단추로 손으로 기울이기/펴기(손으로 2D 를 고르면 13 밑으로 나갈 때까지 저절로 기울이지 않는다). 두 손가락으로 돌리기 · 기울이기도 된다.
모양 값은 js/store-map.js 의 whiteModel() · RISE 에 모여 있다.store-map-data.json 그대로). "내 위치" 단추는 이 기기 안에서만 쓰고 서버로 보내지 않는다(위치정보법 신고 대상 아님 — 아래).store-map-data.json(생성기가 stores-data.json 으로 매주 만든다, 약 0.5MB). stores-data.json 의 판매점에 좌표(소수 5자리)를 더했다 — 사업장 위치라 개인위치정보가 아니다.
처음 한 번 좌표까지 전 회차를 다시 받았고, 그 뒤로는 평소 갱신(새 회차 + 최근 3회차)이 새로 나온 판매점의 좌표를 채운다. 좌표가 있는 판매점이 1,000곳 아래면 지도 페이지 · 링크를 만들지 않는다.tools/update-stores.js 의 place). 2026-10-26 전체 다시 받기 때 시 · 군이 광주로 들어간 것을 고쳤다.store-map-all.json(약 130KB)을 받는다 — 첫 화면은 가볍게. 카드에는 "262회부터 1등 · 2등 기록이 없는 판매점"과 지도 링크.
켜 두면 이름 찾기에도 나온다(1등 · 2등 판매점 다음에).
| 하는 일 | 신고 | 근거 |
|---|---|---|
| 판매점 위치를 지도에 보여 주기 | 필요 없음 | 판매점은 사업장이다. 개인위치정보는 "특정 개인"의 위치만 — 법인 · 장소 정보는 빠진다(법 제2조, 방통위 해설서) |
| "내 위치" 단추(지도에 내 위치 점만, 서버로 안 보냄) | 필요 없음 | 위치정보를 이용자 단말기 안에서만 쓰고 사업자 시스템으로 보내지 않으면 신고 대상에서 빠진다(위치정보센터 안내) |
지역 공유 링크(?area=서울+노원구, 2026-10-28) | 필요 없음 | 지역 이름(시군구)만 주소에 넣는다. 내 위치 · 지도 좌표를 넣거나 서버로 보내지 않는다 |
| GPS 현장 인증 — 휴대폰 위치를 서버로 보내 "판매점 100m 안"인지 확인 | 필요함 — 위치기반서비스사업 신고 | 회원 계정과 이어진 위치 = 개인위치정보(법 제9조). 신고 없이 하면 처벌 규정이 있다(1년 이하 징역 또는 1천만 원 이하 벌금이라는 해설) |
| GPS 확인을 휴대폰 안에서만 하고 서버엔 "통과"만 보냄 | 신고 부담은 줄지만 조작이 너무 쉽다(브라우저 개발자 도구로 통과값을 보낼 수 있다) | 현장 인증의 의미가 없어 권하지 않는다 |
브랜치란? 같은 저장소 안의 별도 작업 공간이다. 실제 사이트는
html브랜치 하나에서 나온다.
html이 실제 사이트다. 여기에 올라간 것이 곧바로 배포된다.claude/… 브랜치에서 고친 뒤 Pull Request(변경
제안서)를 만든다. GitHub에서 Merge 버튼을 눌러야 html에 합쳐진다.봇이 매주 html 브랜치에 직접 저장한다. 그래서 GitHub에 있는 파일이 항상
내 컴퓨터(Dropbox 날짜 폴더)의 파일보다 최신이다.
로컬에 있던 옛 파일을 GitHub 웹 업로드로 올리면 봇이 넣은 최신 회차가 이전 상태로 되돌아간다. 에러도 나지 않는다. 특히 조심할 파일:
lotto-data.json · prize-data.json · index.html · draws.html · statistics-*.html ·
sitemap.xml · round/ · blog/ · tax.html · top-prize.html · probability.html
수정할 파일은 항상 GitHub에서 최신본을 받아서 고친다.
css/site.css 맨 위 "낮/밤 모드" 주석의 변수를 쓴다:
바탕 --bg · 카드/창/입력칸 --surface · 옅은 바탕 --soft --soft-2 · 글자 --fg --text --muted --faint · 선 --line --line-soft --line-strong ·
파랑 글자/선 --brand · 흰 글자를 얹는 파란 바탕 --brand-bg · 강조 바탕 --hl --tint-*.var(--surface, #fff) 처럼 원래 색을 기본값으로 둔 변수로 바꿨고, 낮에는 이 변수들을 정의하지 않는다.
그래서 낮 화면은 바꾸기 전과 픽셀까지 같다(17쪽 × PC · 휴대폰으로 견줘 확인). 밤 값은 :root[data-theme="dark"] 한 곳.<style> 도 같은 변수를 쓴다(tools/build-static-stats.js).build-static-stats.js 의 firstPrizeAvg() · prize-chart.js 의 summarize(…, weight)Dropbox 260914 클로드 폴더의 README와 CLAUDE.md는 실제로 적용되지 않은 초기
계획이다(Python, templates/ 폴더, Cloudflare 배포 기준). 지금 구조와 다르니
그 문서의 파일 경로나 배포 설명을 따르지 말 것. 이 README가 기준이다.
새 작업은 맨 위에 추가한다. 형식: 날짜 | 어디서(회사/집, 채팅/VS Code) | 한 일
| 날짜 | 어디서 | 한 일 |
|---|---|---|
| 2026-10-27 | Claude Code 웹 | 판매점 지도 8차 — 0등 · 내 기록 · 답글 알림(#139~) — ① 0등(동행복권 인터넷)을 다른 판매점과 같은 규칙의 지도 층으로(붉은 버블 / TOP 50 붉은 별), 카드에 1등 · 2등 회차 ② 칩 "📍 내 기록": 다녀온 곳만 지도 + 목록, 내 댓글 목록 ③ 판매점 댓글에 답글(한 단계) + 답글 알림(마이페이지 "답글 알림 · 내 댓글", 머리글 빨간 점) ④ 휴대폰 댓글 안내 문구 11px. 다음에: 다녀왔어요 GPS 50m 인증 + 점수(위치기반서비스사업 신고 뒤). 워커 시험 85개 통과 |
| 2026-10-27 | Claude Code 웹 | 판매점 지도 7차 — TOP 50 · 근처 찾기 · 댓글(#121~#130) — ① TOP 50 칩(1등 칩 왼쪽): 켜면 원은 감추고 TOP 50 만 노란 반짝이 별(사장님이 준 모양, 투명도 0.75) + 숨 쉬듯 빛나는 별 테두리, 평소엔 원 안에 1등 횟수 ② 바탕 지도의 도로 번호판(흰 네모) 감춤 ③ 카드의 1등 · 2등 회차는 토글로 하나씩, 휴대폰 카드 절반 크기(250px · 화면 38%) ④ 상호 이름표: 화면 안 판매점이 7곳 이하(휴대폰 기준, PC 15곳)일 때 모든 점 · 별 아래 ⑤ 이 근처 판매점 찾기: 지도 위 "⟳ ○○구 근처 판매점" → 화면 안 목록(1등 많은 순), "📍 내 위치 기준"이면 가까운 순 + 거리(위치는 기기 안에서만) ⑥ 판매점 댓글("다녀왔어요" 아래, 로그인 · 별명 회원, 다녀온 곳으로 표시한 사람은 "✓ 실방문자"): 블로그 댓글과 같은 서버 길 · 규칙(/api/comments, 글 이름 shop-판매점번호), 관리자 댓글 목록에서 store-map.html?shop=번호 로 그 카드, 개인정보 처리방침에 "판매점 댓글"(시행일 10-27) ⑦ 가는 길: 생성기 제목 아래 단추 → 메뉴 맨 오른쪽 "판매점 지도"(js/theme.js 가 붙인다). js/i18n.js 가 부르는 theme.js · account.js 에도 지문(LOAD_V) — 배포 직후 옛 theme.js 때문에 홈에 단추가 안 보였다 ⑧ 공유 이미지: 지도 OG 를 기본 OG 짜임으로, TOP 50 OG + 공유 주소 store-map-top50.html(별로 열림), 낮/밤 · 한/영은 사이트 값(지도 도구 줄에 KO · EN), 바닥글 띠 배경 다시 찍기(밤 모드는 TOP 50 별). 워커 시험 84개 통과 |
| 2026-10-27 | Claude Code 웹(밤 리뷰) | 회원 자료 백업 리뷰 · 고침(#115 머지 뒤) — ① 되살리기 묶음을 글자 수가 아니라 UTF-8 바이트로 재어 900KB씩(한글 댓글이 많으면 1MB 를 넘겨 413 으로 매번 같은 곳에서 멈추던 것). 서버도 본문을 바이트로 잰다. ② 회원이 있는 저장소에는 확인 없이 덮어쓰지 않는다 — 서버가 409, 화면이 "덮어쓰기"를 적게 한 뒤에만(백업 뒤 탈퇴한 회원 · 메일 구독이 되살아나기 때문). ③ 메일 발송 기록(mr: · mw: · mday)은 백업에서 빼고 되살릴 때도 건너뛴다(옛 기록이면 결과 메일을 또 보낸다). ④ 되살리기 끝에 POST /api/admin/restore/finish 가 회원 기록(u:) 기준으로 별명 색인 n: · 랭킹 색인 b: · 회원 수를 다시 맞춘다(나눠 받는 사이 별명이 바뀌면 어긋났다). ⑤ 랭킹 줄을 만드는 중이면 끝난 뒤에 비움, 되살리는 동안 단추 잠금, 확인창 시각을 한국 시간으로. 워커 시험 83개 통과, 가짜 API 로 409 → 덮어쓰기 → 마무리까지 브라우저 확인 |
| 2026-10-27 | Claude Code 웹(밤 작업) | 회원 자료 백업 · 되살리기 — 관리자 페이지 회원 명부 아래 "회원 자료 백업"(접힘). 내려받기: Worker GET /api/admin/backup?after= 가 회원 저장소(Community)의 줄을 1,000줄씩 내주고 화면이 끝까지 이어 받아 한 파일로(회원 수 상한 없음, 회원 명부의 2,000명 제한과 별개). 로그인 세션 는 빼고, 채팅은 다른 저장소라 처음부터 없다. : 같은 파일을 골라 확인창 뒤 700KB · 1,000줄씩 (이 길만 본문 1MB 까지)로 덮어쓴다 — 파일에 없는 줄은 지우지 않고, 되살린 뒤 랭킹 줄 · 조회수 시작값 · 메일 비밀값은 다시 읽는다. 이메일이 들어 있으니 비밀번호 관리자 · 암호 건 폴더에만 두라는 안내를 화면에. 주문 KV 는 넣지 않았다(할 일 3-1). 워커 시험 2개 추가(1,500줄로 끊어 읽기 · 세션 제외 · 빈 저장소에 되살려 회원 · 별명 · 다시 로그인, 1,000줄 · 1MB 넘으면 거절) — 전체 79개 통과. 가짜 API 로 관리자 화면 PC 1440px · 휴대폰 390px 확인(관리자 페이지는 원래 밤 모드가 없다) |
자세한 이유와 선택지는 4-4번. 화면은 바꾸지 않는 것이 전제다.
① 머지 당일 (10분)
https://www.lottodraw.kr/top-prize.html → 색인 생성 요청sitemap.xml 다시 제출https://www.lottodraw.kr/sitemap.xml) · 웹 페이지 수집(top-prize.html)② 이번 주 (15분) — 판단 근거 모으기
statistics.html(결제 페이지)이 잡혀 있다 → "결정할 것" 1번(noindex, 화면 변화 없음) 진행.
Claude 에게 "4-4 결정할 것 1번 해줘" 라고 하면 된다③ 매주 꾸준히 — 순위에 가장 큰 일
④ 4~8주 뒤 — 다시 판단
692f3b5)을 화면을 덜 바꾸는 방식으로 다시 검토store-map-data.json 이 새 회차로 바뀌었는지(매주 갱신에 지도 파일을 넣은 뒤 첫 확인)blog/lotto-store-extremes.html 색인 요청https://www.lottodraw.kr/store-map.html → 색인 생성 요청 · 네이버 서치어드바이저 웹 페이지 수집update-lotto-data → Run workflow (또는 Claude 가 실행) → 마지막 단계 "네이버·Bing 색인 요청" 로그에 네이버: HTTP 202·Bing: HTTP 200/202 가 찍히는지draw-night 이 초록 체크로 끝나고, 이어서 update-lotto-data 가 21시 전후에 돌았는지. 사이트 round/1245.html 이 토요일 밤에 떠 있는지deploy-worker 가 초록 체크인지. 관리자 페이지 설정 목록에 "✔ 추첨 결과 메일 — 구독 n명"update-lotto-data 의 "1등 판매점 수집" 단계가 초록인지, 새 회차 1등 판매점이 페이지 맨 아래에 나오는지. 추첨 직후에 아직 안 올라왔으면 "다음에 다시"가 찍히고 일요일 · 월요일 예약이 채운다stores-data.json 을 두는 것이 괜찮은지 — 4-6번 "조심할 점"statistics-frequency.html · statistics-gap.html · about.html (제목 · 설명을 고쳤는데 IndexNow 는 데이터가 바뀔 때만 돌아 자동으로 알려지지 않는다. 구글은 Search Console URL 검사 → 색인 생성 요청)lottodraw 클릭 21 · 노출 53 / 페이지 statistics-frequency 노출 2,068 · 클릭 28 · statistics-gap 노출 280 · 클릭 32 · about 노출 29 · 클릭 16lottodraw 브랜드 클릭이 계속 about 으로 가나(제목을 바꿨으니 CTR 55% 가 떨어지지 않았나). 노출이 늘었는데 클릭이 그대로면 순위 문제 → 바깥 링크 쪽이 작업 환경에서는 Search Console 에 들어갈 수 없다. 머지 뒤 직접 본다. 첫 기록은 머지 직후, 그다음은 4주 · 8주 뒤. 숫자는 4-7번 아래에 적는다.
round/ 가 대부분인지 본다. 4주 뒤 줄었는지 비교/round/ 로 회차 페이지의 클릭 · 노출, 같은 방법으로 /blog/ · statistics-. "비교" 탭으로 머지 전후를 본다deploy-worker 가 초록 체크인지(VIEW_LIMIT 제한이 새로 생긴다)js/views.js 의 MIN. 지금은 1 이상이면 보인다seed-views 를 apply 끄고 돌려 표 확인 → apply 켜고 다시 (2026-10-18 — 배포용 토큰으로 읽혔다, 글 16편 · 페이지뷰 117)LICENSE_PRIVATE_JWK Update → Run workflow. 비밀번호 관리자에도 보관ADMIN_TOKEN·입금 알림 열쇠·텔레그램 봇 토큰을 비밀번호 관리자에 옮기기. 대화에 남은 값이 걱정되면 텔레그램은 BotFather /revoke, 열쇠는 Secret DEPOSIT_HOOK_SECRET 로 바꾸고 MacroDroid 헤더도 같이 바꾼다
3-1. [ ] 회원 자료 백업 (2026-10-13 기록, 2026-10-27 화면 · 서버 만듦) — 관리자 페이지 회원 명부 아래 "회원 자료 백업" 에서 내려받기 · 되살리기(세션 · 채팅 제외, 1,000줄씩). 남은 것(내 몫):
deploy-worker 초록 체크 → 관리자 페이지에서 한 번 내려받아 파일이 열리는지 · 회원 수가 명부와 같은지 본다. 받은 파일은 비밀번호 관리자 · 암호 건 폴더에만(이메일이 들어 있다)order: 등)도 같이 받을지 — 지금은 빠져 있다. 관리자 페이지 주문 기록이 매출 장부 역할이라 함께 두면 좋지만, 구매자 연락처가 더 들어간다site.cssindex.html<style>site.cssbody.is-printingwindow.print()js/stats-render.jsSTATS_ORDERstatistics.htmldraws.html | 전 회차 당첨번호 목록 |
round/1.html … | 회차마다 한 페이지 (검색 유입용). 등수별 당첨금 표(1~5등 당첨 조건 · 당첨 게임 수 · 1게임당 금액 · 세후(지금 세법)) + 총 판매액 — prize-data.json 에 그 회차가 집계돼 있을 때만(추첨 직후 5등 0게임이면 표를 뺀다). 설명(meta)에 2등 게임 수 · 금액. 회차마다 다른 사실(2026-10-18): 번호 분석 표에 직전 회차와 같은 번호 · 가장 많이 겹친 지난 회차 · 당시 1인당 1등 순위, 번호별 출현 기록에 직전 출현 회차(링크) · 간격, 해당될 때만 "이 회차에서 눈여겨볼 점"(이월 연속 · 당시 기록 · 지난 회차와 5개 이상 같음 + 사람이 쓴 메모 content/round-notes.md). 모두 "그 회차 당시" 기준이라 새 회차가 나와도 옛 회차는 바뀌지 않는다 → 4-7번 |
statistics.html | 유료 최근 5개월(22회차) 통계. 결제(주문) 페이지 겸용 |
admin.html | 판매자 전용 주문 관리 (검색 제외, 메뉴에 없음) |
mypage.html | 마이페이지 (검색 제외). 계정 메뉴 "마이페이지 →"로 들어온다. 내 번호(2026-10-17 — 회차 고르고 한 줄에 한 게임 입력 · 회차별 목록에 당첨번호와 등수 · 맞은 번호 색칠 · 최근 4/12/52회 · 전체 누적 1~5등 횟수 · 게임/회차 지우기), 내 정보(별명·이메일·가입일), 이용권(이 브라우저의 키 · 키 보기/복사 · 다른 기기용 링크 · 무료 체험), 추첨 결과 메일 켜기 · 끄기, 점수·포인트·순위·출석·남긴 반응, 로그아웃·탈퇴. js/account.js·js/license.js·/api/ranking·/api/me/numbers·/api/me/mail 을 쓴다. 등수는 lotto-data.json 으로 화면이 계산한다 → 4-5번 |
statistics-*.html (12개) | 검색용 정적 통계 페이지 (빈도, 홀짝, 합계, 쌍 등) |
statistics-stores.html | 1등 판매점 통계 (2026-10-17). stores-data.json(262회~)으로 생성기가 만든다. 핵심 메시지 "1등이 자주 나온 곳은 많이 팔린 곳일 가능성이 크다" — 판매점별 판매량은 공개되지 않아 같은 판매점의 2등 횟수(2등은 1등보다 6배 잘 나오고 판매 게임 수에 비례)를 대리 지표로: 1등 1회 · 2회 · 3STATS)에는 넣지 않았다 — 홈 목록(2·3등 다음) · 1등 당첨자 수 · 확률 · 블로그 08("명당" 글) · About 에서 잇는다 → 4-6번 |
statistics-repeat.html | 당첨번호 중복 (2026-10-18). lotto-data.json 만으로 생성기가 만든다(REPEAT · repeatPage()). 전 회차 쌍(1246회 기준 775,635쌍)을 견줘 같은 번호 개수별 실제 · 기대 쌍 수, 6개 · 보너스 포함 7개가 같은 쌍, 5개가 같은 쌍 목록(회차 링크 · 간격 · 다른 번호), 5개 + 보너스로 2등이 되는 쌍(451회 → 786회), 생일 문제로 본 "지금까지 한 번이라도 같았을 확률"(9.1%)과 50%를 넘는 회차(3,361회), 다음 회차가 지난 회차와 똑같을 확률. 6개가 같은 쌍이 생겨도 문장이 맞도록 조건을 건다. 통계 12가지(STATS)에는 넣지 않았다 — 홈 목록(회차별 당첨번호 다음) · 궁합수 · 확률 · 5개 일치 회차 페이지 · 블로그 09 에서 잇는다 → 4-8번 |
statistics-prize-2-3.html | 2등·3등 당첨금 통계 (2026-10-10). prize-data.json 으로 88회(1게임 1,000원) 이후 평균 · 중앙값 · 최근 52회 · 최고 · 최저 · 회차당 당첨 게임 · 세후, 금액이 정해지는 방식(2·3등 총액이 늘 같음을 자료로 확인, 400회까지의 옛 배분), 판매액으로 어림한 2등 게임 수보다 많이 나온 회차, 연도별 평균, 당첨 게임 수 기록, 세금, 받는 곳. 문장은 자료가 바뀌어도 맞게 조건을 건다. 통계 12가지(STATS)에는 넣지 않았다 — 홈 목록 끝(확률 옆) · 회차 페이지 등수별 표 · TOP 50 2등 안내 · 실수령액 · 확률 · 1등 당첨자 수 페이지에서 잇는다 |
probability.html | 당첨 확률 설명 |
tax.html | 당첨금 실수령액 계산기. 아래 "2등·3등 실수령액" 표(평균 · 최고 · 최저의 세금과 실수령액, 만 원 단위)는 생성기가 seo:tax-tiers 사이에 채운다. 설명(meta)에 2·3등 평균 |
top-prize.html | 역대 1등 당첨금 TOP 50 + 그 아래 2등 당첨금 TOP 50(1게임당 금액 순, 회차는 회차 페이지 링크, 안내 문장에 "1seo:second-note · seo:rows2 사이에 미리 그린다)(부제 "1인당 당첨금 · 세전 기준"). 두 표 위에 [당첨금 순위 | 최근 50회] 단추(2026-10-11) — 최근 50회는 최신 회차부터 회차(링크) · 추첨일 · 1인당(1등은 만 원 단위까지 — 순위 표의 "억 원"으로는 최근 회차가 다 비슷해 보인다) · 당첨자/게임 수 · 총액, 이월은 "이월", 2등이 아직 집계 전이면 "집계 중", 안내 문장에 최근 50회 평균 · 최고 · 최저(1등은 전체 평균, 2등은 88회 이후 평균과 함께). 네 표 모두 생성기가 HTML 에 박아 두고(seo:latest-rows · seo:latest-note · seo:latest-rows2 · seo:latest-note2, 최근 50회는 hidden) 페이지 스크립트는 보이기와 제목("최근 50회 1등 당첨금" · "최근 50회 2등 당첨금")만 바꾼다. 휴대폰에서는 네 표(top-table) 칸 값을 한 줄로 두고 표만 옆으로 밀어 본다. 맨 위에 회차별 그래프 — 접는 상자(<details open>), 처음엔 펼침, 제목 "회차별 1등 당첨금 그래프(클릭하여 접기)"를 누르면 접혀 바로 아래 TOP 50 표가 보인다 — 접히면 "(클릭하여 열기)"(표는 늘 HTML 에 있어 검색 로봇도 읽는다). 그래프 설명 문단은 두지 않는다. 그래프(가로 회차 · 세로 총 1등 당첨금/당첨자 수/1인당 당첨금, 그 아래 줄 2·3등 1게임당(2026-10-10 — 페이지가 prize-data.json 을 받아 회차에 붙인다. 정보창에 다른 등수 금액과 2·3등 당첨 게임 수, 보는 구간에 1wageLineAt. 정보창 · n년치 · 꼬리표 · 요약은 그 회차 날짜의 실제 금액 wageAt) · 오른쪽 꼬리표, 짚으면 "2.4년치 최저임금 연봉으로 (세전 당첨금)", 요약 줄에 보이는 구간 평균 "평균 최저임금 연봉 5.6년치", 무료. 최저임금이 그 해 금액이라 물가 반영과는 함께 켜지지 않는다 — 하나를 켜면 다른 하나가 꺼지고, 늘 파란 선(당시 금액)과 견준다. 9월~8월 기간은 영어로 "Sep 2002–Aug 2003"). 정보창 · 범례 높이 붙잡기(2026-10-11 — 짚는 회차마다 정보창 줄 수가, 옮기기 · 확대로 범례 항목(이월 · 추정)이 달라져 그래프가 위아래로 밀리던 것: 설정이 바뀔 때 보이는 구간의 여러 회차를 미리 채워 가장 높은 값을 최소 높이로 두고, 그 사이엔 늘리기만 한다. 표본(보이는 구간에서 고르게 16회차 + 이월 회차)에 없는 회차가 한 줄 더 쓰는 일이 있어 한 줄을 더 잡는다 — 짚기 전에도 정보창이 그만큼 크다. 구간 단추(최근 50 · 100 · 300회 · 전체)나 두 번 눌러 전체로 가면 새로 잰다). 로그인하지 않으면 흐리게 보인다(이용권 키가 있으면 열림, 서버 로그인이 꺼져 있으면 가리지 않음). 구간 설정(최근 50·100·300회·전체, +- 확대·축소, 마우스 휠 확대·축소 · 끌어 옮기기 · 두 번 클릭 전체, 휴대폰 두 손가락 확대 · 옆으로 밀어 옮기기 · 길게 눌러 값 보기, 아래 작은 그래프로 이동), 무료/이용권 나눔(2026-10-10): 무료는 지표 · 짚어 보기 · 구간 설정 전체 · 세전 · 서울 아파트 비교 · 선 · 월봉 · 240회 이평(보이기만), 이용권은 물가 반영 · 세후 · 강남3구 비교 · 분기봉 · 연봉 · 보조지표(평균선·20/60/120/240회 이동평균 끄고 켜기·로그 눈금) · 그림도구(수평선·추세선)(줄마다 "이용권"을 달지 않고, 잠겼을 때 도구 상자 맨 아래에 "이용권을 구매하지 않았다면 일부 기능은 제한됩니다." 한 줄). 이용권이 끊겨도 보던 구간은 그대로. 표는 스크립트가 그리지만, 같은 표를 생성기가 HTML 에도 미리 박아 둔다(검색 로봇용, 화면은 같다) |
blog/index.html blog/<slug>.html | 블로그 목록과 글 16편. 원고(content/blog/)로 생성한다 → 4-3번 |
about.html contact.html privacy.html terms.html | 소개, 문의, 개인정보처리방침, 이용약관. About 첫머리는 "로또드로우(lottodraw.kr)는 로또 데이터 플랫폼입니다" 소개와 주요 기능 목록(번호 생성기 · 회차별 당첨번호 · 통계 12종 · 당첨금 TOP 50 · 그래프 · 실수령액 · 2·3등 · 확률 · 블로그 · 이용권 — 손으로 관리, 기능이 늘면 여기에도 한 줄. 영문은 사전 about.feat.*). 예전 FAQ 의 실수령액 · TOP 50 · 통계 항목은 이 목록으로 옮겼다. About 의 "자료를 둘러보며 로또를 즐겨 보세요"(많이 나온 번호 · 번호 합계 그림 맛보기와 둘러볼 곳 링크, 그림 읽는 법은 설명하지 않음)는 build-static-stats.js 가 <!-- seo:about-dist --> 표식 사이를 매주 다시 채운다 — 손으로 고치지 말 것 |
periods{ "from": "그 해-01-01", "hourly": 시급 }untilhoursPerMonthuntilwageLineAtcreditlinknode tools/test-prize-chart.jswageAtwageLineAtjs/draw-countdown.js | 다음 회차 판매 마감 · 추첨 방송까지 남은 시간(1초마다, 2026-10-13). 홈은 제목 줄의 #draw-countdown 상자를 채우고, 다른 페이지는 메뉴(.page > nav.nav) 바로 아래에 한 줄 띠(.dc-strip)를 스스로 만든다(휴대폰은 날짜 · 시각을 빼고 두 줄). 모든 페이지에 들어 있다 — 생성 페이지는 shell(), 손으로 관리하는 페이지(about · contact · privacy · terms · statistics · tax · top-prize · ranking · mypage)는 </body> 앞에 한 줄(admin 은 뺌). 새 페이지를 손으로 만들면 이 줄도 복사해 넣을 것. 기기 시간대와 상관없이 한국 시각으로 센다: 판매는 일요일 06:00 ~ 토요일 20:00(마감 뒤 "판매 마감", 방송이 끝나면 "판매 시작까지" 일요일 06:00), 방송은 토요일 20:35 MBC — 시작부터 10분은 "지금 방송 중"(빨강), 그 뒤 다음 회차. 회차는 날짜로 계산한다(1회 2002-12-07 부터 한 주도 빠짐없음 — 데이터 갱신 전에도 맞다). 스포츠 중계 등으로 방송이 늦어지는 회차는 맨 위 SPECIAL 에 { 1250: [21, 35] } 처럼 적는다(판매 마감은 늦어지지 않는다 — 2026-10-03 1244회는 아시안게임 축구 결승으로 21:35). 평소 시각을 바꾸려면 DRAW_AT · SALE_END. 문구는 사전 cd.*. 옛 site.css 를 쥔 브라우저(배포 직후)에서는 감춘다 |
js/mypage.js | 마이페이지 그리기. 로그인 정보는 LottoAccount(refresh·logout·withdraw·openNick), 이용권은 LottoLicense |
tools/update-seoul-apt.js | 서울 아파트 평균 매매가(KB부동산 데이터허브, 키 없음, 2008-12부터)와 KB 아파트 매매가격지수(1986년부터)를 받아 seoul-apt.json 으로. 2002-12 ~ 2008-11 은 지수로 거꾸로 환산한 추정. 강남은 gangnam 칸 = 강남3구(강남 · 서초 · 송파) 84㎡ 아파트값의 평균 — 구마다 ㎡당 평균 매매가 × 84㎡(전용, 국민평형)를 만들어 달마다 단순 평균. KB 평균가 자료에는 구 단위가 없고 ㎡당 평균가(avgPrcPerSqmt?지역코드=11)에만 25개 구가 있다(2013-04부터, 그 앞은 구마다 지수로 추정). ㎡당 응답은 값이 날짜보다 1개 적어 앞에서부터 맞춘다(기사 값으로 확인). 공개 문서가 없는 주소라 실패하면 기존 파일을 그대로 둔다. GitHub Actions update-seoul-apt.yml(매월 1·16일)에서 돈다 |
js/theme.js | 낮/밤 모드 단추(2026-10-21). 오른쪽 아래, 채팅 말풍선(펼쳤으면 채팅창) 바로 위 10px — 채팅을 지켜보며 자리를 맞춘다(채팅이 없으면 오른쪽 아래). 머리글은 단추가 많아 여기에 둔다. 고른 모드는 브라우저에 저장(lottodraw.theme, 처음은 낮), 다른 탭도 따라 바뀐다. js/i18n.js 가 머리에서 저장된 모드를 그리기 전에 <html data-theme="dark"> 로 붙이고(깜빡임 없음) 이 파일을 account.js 와 함께 불러온다 — 페이지마다 넣을 것은 없다. 색은 css/site.css 의 변수로만 바뀐다(아래 "낮/밤 모드 색" 규칙) |
js/share.js | 공유 줄 단추 달기: [data-share] 안의 .share-btns 에 휴대폰 공유 창(Web Share, 카톡 등) · 링크 복사 · X · 페이스북 · 네이버 · 밴드. 주소는 data-url, 제목은 data-title(영어 화면이면 data-title-en + ?lang=en). 카톡 전용 카드는 카카오 앱 키가 있어야 해서 아직 없음 |
js/dist-balls.js | 번호 공을 쌓은 분포 그림(많이 나온 번호 순위 · About 미리 보기)에서 공을 짚으면 밝게 띄우고 나머지는 옅게, 공 위에 "34번 · 187회" 이름표. 그림은 생성기가 미리 그린 SVG(data-n · data-c), 스크립트가 없어도 CSS :hover 로 밝아진다 |
js/prize-chart.js | TOP 50 페이지의 회차별 그래프(SVG). 지표는 맨 위 METRICS 에 한 줄씩 늘린다 — 2·3등 1게임당(tier: true)은 top-prize.html 이 prize-data.json 을 받아 회차에 붙인 a2 · a3 · w2 · w3 를 읽는다(파일을 못 받으면 그 단추를 숨긴다). 판매액 · 4~5등도 같은 파일에 있다 — lotto-data.json 에는 넣지 않는다(모든 페이지가 받는다). 지표에 weight(1인당 당첨금 = 당첨자 수)가 있으면 그래프 위 지표 상자에 평균 기준 줄(당첨자 1인 기준 — 처음 값 · 동행복권과 같은 값 / 회차 평균, 무료)이 나오고 요약 · 평균선 · 이동평균이 고른 쪽으로 잰다(1인 기준 이동평균 = 창 안 총당첨금 ÷ 당첨자 수). 계산 시험: node tools/test-prize-chart.js |
js/license.js | 이용권 키의 서명·기간·환불 여부를 브라우저 안에서 판정 |
js/premium.js | 결제 페이지: 주문서, 입금 안내, 주문 상태 확인, 잠금/해제. 이번 회차 카드의 끝나는 때 · 남은 시간(1초마다), 1일 카드의 "포인트로 열기", 결제 흐름 집계(결제 페이지 · 고름) |
report.html js/report.js | 내 번호 성적표(2026-10-21). 번호 6개로 1회부터 매주 샀다면 쓴 돈 · 받은 돈(세전) · 손익 · 등수별 횟수 · 가장 좋았던 회차는 누구나, 아까웠던 회차 TOP 5 · 당첨된 회차 전체(5등은 접음) · 연도별 · 첫 당첨 · 가장 길었던 꽝 행진은 이용권(없으면 무엇이 있는지만 보여 주고 결제 페이지로). 당첨금은 1등 lotto-data.json 1인당 · 2prize-data.json, 1report.html?n=3,11,19,27,34,42 로 번호를 들고 온다 — 홈 생성기(번호를 만들면 결과 아래 "혹시 모르죠…" 줄이 같은 높이로 "이 번호 성적표" 링크로 바뀐다) · 마이페이지 내 번호(게임마다 "성적표") · 홈 상세 분석 성적표 카드(이용권) · About 주요 기능 · 결제 카드에서 잇는다(홈 "통계와 기능 자세히 보기" 무료 목록에서는 2026-10-21 뺐다). 계산 시험: node tools/test-report.js(실제 데이터로) |
js/premium-config.js | 결제 서버 주소, 화면 가격, 판매자 정보(공개돼도 되는 값만) |
js/seller.js | 판매자 정보 한 줄 표시 (결제 페이지·이용약관) |
admin.html js/admin.js | 판매자 전용 주문 관리 — 입금 확인·키 발급·환불·직접 발급 |
worker/ | 결제·이용권 서버 (Cloudflare Worker). 주문, 키 서명, 환불 목록, 페이앱 연동, 회원(community.js), 내 번호 · 추첨 결과 메일(index.js 의 resultMail) |
worker/src/lotto.js | 서버 쪽 로또 규칙: 날짜로 회차 셈(saleRound — 토 20:00 판매 마감 뒤는 다음 회차), 등수(rankOf). (2026-10-18 까지 있던 번호 생성 patternHit · makeGames 는 메일이 생성 번호를 보내지 않게 되어 뺐다) |
js/i18n.js | 한국어 ↔ 영어 전환 엔진 |
js/i18n-dict.js | 번역 사전. 문구를 고칠 곳은 여기 한 군데다 |
tools/update-lotto-data.js | 동행복권에서 새 회차 받아오기 (lotto-data.json + 2prize-data.json. --full 은 1회부터 전부 다시, --missing 은 27e94341 의 일회용 워크플로 backfill-prize-data.yml 같은 것을 잠깐 넣는다) |
stores-data.json · tools/update-stores.js | 회차별 1등 · 2등 판매점(262회부터). 판매점 번호 → [상호, 시도, 시군구, 폐점], 회차 → { w1: [[판매점, 자동 A · 수동 M · 반자동 S], …], w2: [판매점, …] }. 주소 상세 · 전화 · 좌표는 저장하지 않는다. update-lotto-data 가 매번 새 회차 + 최근 3회차를 받는다(회차가 그대로여도 — 추첨 직후 판매점이 늦게 올라오는 때를 위해, 실패해도 로또 갱신은 그대로). 1등 판매점 수가 1등 당첨자 수와 다르면 최근 회차는 저장하지 않고 다음에 다시. --full 은 262회부터 전부(요청 사이 1초, 약 30분) |
tools/wait-for-draw.js | 토요일 밤 추첨 결과(1등 당첨자 수까지)가 나올 때까지 기다리기 (draw-night 이 쓴다) |
tools/indexnow.js | 바뀐 페이지를 네이버·Bing 에 바로 알리기 (IndexNow) |
tools/build-static-stats.js | 통계 페이지, 회차 페이지, 블로그, 사이트맵 다시 만들기 |
tools/build-blog.js | 블로그 원고로 blog/ 만들기 (build-static-stats.js 가 불러 쓴다). 글마다 본문 끝에 공유 줄을 붙인다. 생성 페이지에 스크립트를 더 실으려면 shell() 의 scripts 옵션 |
content/blog/*.md content/blog/en/*.md | 블로그 원고(한국어·영어). 글을 고칠 곳은 여기다 |
content/round-notes.md | 회차 메모 원고(2026-10-18, 23개 회차). ## 회차 다음 한국어 한 줄 + EN: 영어 한 줄 → 그 회차 페이지 "이 회차에서 눈여겨볼 점" 맨 앞. 숫자는 lotto-data.json · prize-data.json 으로 확인한 것만, 나중에 바뀔 "역대 최다"에는 "(2026년 10월 기준)". 쓰는 법은 파일 첫머리. 늘릴수록 회차 페이지가 덜 "찍어 낸 페이지"로 보인다 |
.github/workflows/update-lotto-data.yml | 수집 → 페이지 생성 → 배포 → 색인 요청. draw-night 이 토요일 밤에 실행하고, 일·월 예약은 안전망 |
.github/workflows/draw-night.yml | 토요일 낮부터 기다렸다가 추첨 결과가 나오면 update-lotto-data 를 바로 실행 |
.github/workflows/update-all-shops.yml | 판매점 지도의 일반 판매점(shops-all.json) — 매달 2일 새벽 + 수동. 40분쯤 |
.github/workflows/deploy-worker.yml | worker/ 가 바뀌면 Cloudflare 에 배포 |
LICENSE_PRIVATE_JWK. 서버는 KV 의 키를 원본으로 쓰고
이 값은 KV 를 잃었을 때만 쓴다. 잘못 넣어도 발급은 멈추지 않고, 관리자 페이지 "서명 키 백업" 줄이 "맞음/다른 키/형식 잘못"을 알려 준다.
Cloudflare 저장소를 잃어도 판매한 키가 살아난다. 이 값은 비밀이다.판매자 정보 넣기: js/premium-config.js 의 seller 에 상호·대표자 등을 채운다 (2026-10-02 반영: 월데코 코리아 · 이동찬 · 226-27-62319 · 사업장 주소. 일반과세자, 통신판매업 신고 2025-경기파주-4164, 전화번호까지 반영)
(결제 페이지와 이용약관 아래에 표시). 전자상거래법상 판매자 신원 표시 의무가 있다.
키 메일 (Resend, 약 15분): 구매자가 이메일을 적으면 발급 즉시 키를 메일로도 보낸다 (다른 기기에서 열거나 브라우저를 지웠을 때 다시 쓰라고. 키 분실 문의가 줄어든다).
lottodraw.krre_… 값을 GitHub Secret RESEND_API_KEY 에MAIL_FROM = lottodraw.kr <[email protected]>[email protected] 로 가게 해 두었다(reply_to).(선택) 페이앱 가입 신청: https://www.payapp.kr → 승인되면 판매자 사이트의 연동 정보에서
PAYAPP_USERID PAYAPP_LINKKEY PAYAPP_LINKVAL 을 GitHub Secrets 에 넣고 deploy-worker 다시 실행.
구글 로그인 켜기 (약 15분): 페이지마다 ♥ 좋아요 · $ 대박 기원, TOP 50 그래프 보기. 가입하면 3일 무료 체험 — 2026-10-11 끔(무료로 볼 수 있는 것이 이미 많다). 다시 켜려면 GitHub Secret SIGNUP_TRIAL_DAYS(예: 3)를 넣고 deploy-worker 를 돌린다 — 약관 7조 · 개인정보 처리방침 4번 문구도 함께 되돌린다.
클라이언트 ID 를 넣기 전에는 화면에 로그인 단추도 좋아요도 나오지 않는다(지금 사이트 그대로).
lottodraw)lottodraw.kr, 지원 이메일, 대상 External(외부),
승인된 도메인 lottodraw.kr, 개발자 연락처. 범위(scope)는 기본(openid·email·profile)만 — 추가하지 않는다https://www.lottodraw.kr, https://lottodraw.kr (리디렉션 URI 는 비워 둔다)….apps.googleusercontent.com, 비밀이 아닌 공개값)를 GitHub Secret GOOGLE_CLIENT_ID 에.
클라이언트 보안 비밀(secret)은 쓰지 않는다 — 어디에도 넣지 않는다worker/src/community.js)에. 결제용 KV 와 나눈 이유는 KV 무료 쓰기 한도(하루 1,000회)를
좋아요가 다 써 버려 주문·입금 확인이 멈추는 일을 막으려는 것. 이름·사진은 받지 않고 이메일만 받는다. 광고 메일은 보내지 않는다
(보내려면 별도 수신 동의가 필요하다 — 정보통신망법).t:)는 가입 체험을 끈 뒤 로그인 때 지운다(개인정보 처리방침 4번, 이용약관 7조).페이지-카드id(예: index-stat-sum), id 없는 카드는 data-react="이름" 으로 단다. 결제·주문·키 칸에는 달지 않는다.
카드가 없는 페이지(통계 12쪽·블로그·회차 …)는 본문 끝에 하나(약관·개인정보·문의·소개 제외).ranking.html, 머리글 계정 단추 옆 "🏆 랭킹" — js/account.js 가 단다. 메뉴 탭에는 두지 않는다): 출석(하루 한 번 10점, 로그인한 채 들어오면 저절로) ·
반응(하나에 2점, 취소하면 뺌) · 로그인한 채 산 이용권(100원에 10점, 2026-10-07 변경 — 1일권 약 150점, 평생권 약 1,290점, 환불하면 뺌). 점수 기준은 worker/src/community.js 의 POINTS 하나만 고치면 된다(약관 7조 문구도 같이).
별명을 정한 회원만 상위 50명 공개, 내 순위는 별명 없이도 보인다. 구매 금액은 공개하지 않는다. 주문에는 계정 번호 대신 되돌릴 수 없는 참조값(memberRef)만 남긴다.
랭킹 색인(2026-10-13): 랭킹을 볼 때 회원 기록(u:)을 다 읽지 않는다. 별명 있는 운영자 아닌 회원마다 b:<계정> 한 줄(별명 · 점수 · 출석 일수 · 가입 시각)을 두고,
회원 기록은 늘 saveUser 로 저장해 이 줄을 같이 맞춘다(점수 · 별명 · 운영자 · 탈퇴). Community 는 처음 랭킹을 볼 때 b: 를 읽어 점수 순 줄을 메모리에 만들고,
그 뒤로는 바뀐 회원만 빼고 다시 끼운다 — 로그인하지 않은 랭킹은 저장소를 읽지 않고, 내 순위는 내 기록 한 줄만 읽는다. 회원 수 상한(예전 5,000명)도 없다.
board 키가 없으면(색인 전 회원) 처음 한 번만 u: 를 훑어 채운다. 시험: worker/test/community.test.mjs 의 "랭킹 색인" 둘(무작위로 바꿔 가며 예전 방식과 견줌).worker/src/chat.js 방 하나 + js/chat.js 오른쪽 아래 말풍선, 2026-10-07): 읽기는 누구나, 쓰기는 로그인+별명 회원만.
메시지는 24시간 뒤 사라진다. 3초에 한 번, 200자. 링크·도메인·전화번호·오픈카톡/텔레그램·리딩방/도박 문구는 서버가 막는다.
PC(폭 900px 이상 + 마우스)는 펼친 채로 시작(2026-10-14 — 그 전에는 빈 방이 망해 보이지 않게 모두 접어 두었다, 검토 문서 「임베드형 휘발성 채팅 위젯」 권고).
PC 에서 닫으면 그 기기는 다음에도 닫힌 채(localStorage 의 lottodraw.chat.pc = 0), 다시 열면 다시 펼침. 저절로 펼칠 때는 입력칸으로 초점을 옮기지 않는다.
휴대폰 · 태블릿은 접어 둔 채로 시작하고, 이 탭에서 열어 두었으면 다음 페이지에서도 연다(sessionStorage). 열려 있을 때만 WebSocket 으로 붙는다(Durable Object 잠들기 API).
연결 제한은 채팅 전용 CHAT_LIMIT(같은 IP 1분 30번) — PC 는 페이지를 옮길 때마다 다시 붙어서, 로그인과 나눠 쓰던 1분 10번으로는 빨리 둘러보거나 한 IP 를 여럿이 쓰면 막혔다.
관리자 페이지 "실시간 채팅 관리" — 누가 썼는지 보고 지우기 · 채팅 금지(그 사람 글도 걷힘) · 해제.
"n명 접속"은 사람 수(2026-10-14): 채팅 창을 연 탭(WebSocket) 가운데 같은 계정은 한 명, 로그인 전이면 같은 브라우저를 한 명으로 센다 —
화면이 브라우저에 무작위 번호(localStorage 의 lottodraw.chat.vid)를 만들어 연결 주소에 ?v= 로 붙이고, 서버는 소켓에 붙여 두기만 한다(저장 안 함).
로그인 확인 전인 탭도 같은 브라우저의 다른 탭이 로그인돼 있으면 그 계정으로 친다. 번호가 없는 옛 화면 · 저장소가 막힌 브라우저는 탭마다 한 명.
접힌 단추의 수는 페이지를 열 때 한 번만 받는다(펼친 동안만 실시간). 내 탭도 센다. IP 로는 세지 않는다(IP 는 연결 횟수 제한에만).
⚠️ 운영 책임: 불법 홍보가 올라오면 바로 지운다(정보통신망법). 숫자를 볼 것 — 토요일 밤 동시 접속이 한 자릿수에 그치면 채팅은 접는 게 낫다.js/comments.js, Worker /api/comments, 저장은 Community 의 c:<글>:<id>, 2026-10-08): 블로그 글(목록 제외) 본문 아래 "관련 페이지" 앞에 붙는다.
읽기는 누구나, 쓰기는 로그인+별명 회원만. 500자·줄바꿈 허용, 15초에 한 번·하루 30개. 글자 검사는 채팅과 같은 checkText(링크·연락처·홍보 차단).
내 댓글은 지울 수 있고, 별명을 바꾸거나 관리자가 별명을 지우면 예전 댓글 별명도 따라 바뀐다. 탈퇴하면 댓글도 지운다. 새 댓글은 텔레그램으로 알린다.
관리자 페이지 "블로그 댓글 관리" — 최근 300개, 누가 썼는지, 지우기 · 막기(= 채팅 금지와 같은 목록, 댓글·채팅 함께 막힘. 해제는 채팅 금지 목록에서).POINTS.nickChange). 처음 정하는 별명(관리자가 지운 뒤 포함)과 자동 별명을 처음 바꾸는 것은 무료. 쓴 포인트(spent)는
쓸 수 있는 포인트(avail = total - spent)에서만 빠지고 랭킹 점수(total)는 그대로다.r(회원 참조값 앞 12자)로 찾는다. 그 전에 만든 주문은 "자세히"를 누르면 보인다. 실명은 받지 않는다(개인정보 최소 수집)./api/tap, 저장은 Community 의 e:<한국 날짜>, 2026-10-16): Cloudflare Web Analytics 는 방문만 세고 단추 클릭은 못 세서 따로 둔다.
홈 생성기 "공유"(공유 창에서 보낼 곳을 고른 것만) · "출력"(인쇄 창을 연 횟수), 블로그 글 "공유하기"(고른 것만) · X/페이스북/네이버/밴드(창을 연 횟수).
복사는 세지 않는다. 브라우저는 sendBeacon 으로 단추 종류만 보낸다(번호 · 글 주소 · 기기 정보 없음, 누가 눌렀는지 기록 안 함 — 개인정보 처리방침 1번).
우리 사이트(Origin)에서 온 것만, 같은 IP 1분 30번까지(TAP_LIMIT). 광고 차단기 · 오래된 브라우저에서 누른 것은 빠질 수 있다.
관리자 페이지 "공유 · 출력 집계" — 오늘 · 최근 7일 · 최근 30일 · 전체 합계와 최근 30일 하루씩. 로그인 기능을 꺼도 집계는 돈다.scheduled → Community autoNicks)이
형용사 + 동물 + 숫자 4자리(예: 행운의수달4821)를 붙인다. 낱말은 worker/src/community.js 의 NICK_WORDS(형용사 16 · 동물 20, 모두 4자 이하라
가장 길어도 12자, 좋은 뜻만 — 고치면 시험이 별명 규칙 · 막는 말에 걸리는지 본다). 숫자로 자동 별명인 것이 드러난다.
먼저 직접 정할 기회: 가입할 때 별명 창이 뜨고(건너뛸 수 있음), 이 기능 전에 가입했거나 관리자가 별명을 지운 회원은 다음에 들를 때 한 번 같은 창이 뜬다
(창에 "10월 24일까지 정하지 않으면 자동으로 붙습니다" — 물은 날짜를 브라우저에 적어 두어 한 번만, lottodraw.account.nickAsk). 처음부터 지어 주지 않는다.
자동 별명은 한 번 포인트 없이 바꾼다(nickAuto). 붙으면 랭킹에 나오고 채팅 · 댓글을 쓸 수 있다. 처음 들르면 한 번 알림(마이페이지로 가는 링크),
메뉴 "별명 바꾸기 (한 번 무료)", 별명 창 · 마이페이지에 "10월 24일까지 정하지 않으면 자동으로 붙습니다"(nickDue), 관리자 명부에 "(자동)".
대기열 q:<계정> { due } 만 읽어 회원 수와 상관없이 가볍다(별명을 정하거나 탈퇴하면 지움). 관리자가 별명을 지우면 그때부터 다시 3일.
운영자 계정에는 붙이지 않는다. 이 기능 전에 가입해 별명이 없던 회원은 배포 뒤 처음 예약이 도는 때부터 3일(nickq 표시, 바로 붙이지 않음).
이용약관 7조 · 개인정보 처리방침 4번에 적었다(시행일 2026-10-21).
모든 공개 페이지가 읽는 js/i18n.js 가 js/account.js 를 불러 붙이므로 HTML 을 고치지 않아도 된다.CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_IDADMIN_TOKENmanualGET /api/admin/viewsPOST /api/admin/views/base{ base: { 글: 수 }, until }slug 를 바꾸면 새 이름으로 0 부터 센다(시작값도 옛 이름에 남는다)tools/update-all-shops.js → shops-all.json(번호 · 상호 · 시도 · 시군구 · 좌표만, 주소 · 전화 저장 안 함). selectLtShp.do 를 시도 없이(전국) 쪽마다 10곳씩,
1.2초 간격 — 1,458쪽 40분쯤. 연금복권 · 스피또만 파는 곳(5,400곳쯤)은 뺀다. 빨리 받으면 몇백 번째에서 연결이 끊겨서(첫 시도 실패) 간격을 넓히고 끊기면 5 · 20 · 60 · 120초 쉬고 다시.
건너뛴 쪽이 2%를 넘거나 전보다 20% 넘게 적으면 저장하지 않는다..github/workflows/update-all-shops.yml — 매달 2일 04:20 KST + 수동 실행(Actions → update-all-shops → Run workflow). 받은 뒤 생성기를 돌려 지도 자료를 다시 만들고 Pages 를 다시 배포한다.js/store-map.js, css/store-map.css, js/vendor/*)은 생성기가 내용 지문(?v=)을 붙여 싣는다 — 고친 뒤 node tools/build-static-stats.js.store-map-rounds.json(약 360KB, 압축 약 120KB) — 카드를 처음 열 때 한 번 받는다(1등은 회차 × 4 + 방식 번호).#map=줌/위도/경도/방향/기울기 로 남아 링크로 나눌 수 있다(기울기는 60° 까지)./api/me/visits 에
판매점 번호(동행복권 8자리)와 색만, 1,000곳까지, 본인 지도에만. 기기 위치는 쓰지 않는다(회원이 직접 누른 표시라 위치정보가 아니다 — 개인정보 처리방침 항목 추가).
판매점 번호는 store-map-ids.json(로그인했을 때만 받는다).storeMapFun): 가장 남쪽 · 북쪽 · 서쪽 · 동쪽, 가장 외딴 곳, 1등 판매점끼리 가장 가까운 곳, 판매점이 가장 몰린 곳,
1등이 가장 많은 휴게소, 섬(울릉 · 옹진 · 신안 · 완도)의 1등 판매점. 왼쪽 아래 목록(HTML 에 박아 둔다) · 지도 위 아이콘 · 블로그 글
대한민국 끝과 끝의 로또 판매점(글의 숫자는 2026-10 기준으로 손으로 적었다 — 크게 바뀌면 고친다).
서해 · 동해와 가장 가까운 곳, 해발고도가 가장 높은 곳은 해안선 · 지형 자료가 필요해 아직 없다.LottoLicense.#map= 이 있으면 그 화면.img/og-store-map.jpg(1200×630) — 지도 페이지의 og:image. 기본 공유 이미지(og-default.png)와 같은 짜임(LOTTODRAW.KR · 두 줄 제목 · 한 줄 소개 · 로또 공 5개, Noto Sans KR)에 오른쪽은 실제 서울 지도(2026-10-26 사장님).img/map-banner.jpg(휴대폰 map-banner-m.jpg)에 지도 색(주황 · 파랑 · 남색).
MAP 단추는 PC 에도(낮/밤 단추 위).js/store-map.js 의 NIGHT · nightModel), 낮으로 돌아가면 처음 값을 되돌린다. 사이트를 밤 모드로 두었으면 지도도 밤으로 열린다.st-name · st-all-name · names(), 지도를 움직일 때마다 자료로 센다). 낮은 진한 글씨 + 흰 테두리, 밤 · TOP 50 은 밝은 글씨./api/comments, 글 이름 shop- + 판매점 번호 8자리 —
링크 · 연락처 · 홍보 금지, 15초에 한 번, 블로그와 합쳐 하루 30개, 500자, 내 것만 지우기, 관리자 페이지 댓글 목록에서 지우기). 읽기는 누구나. 위치 인증은 없다(위치정보를 받지 않는다).
쓴 사람이 그 판매점을 "다녀온 곳"으로 표시해 두었으면 댓글 별명 옆에 "✓ 실방문자"(서버가 목록을 줄 때 지금 표시로 센다 — 표시를 지우면 함께 사라진다. 2026-10-27 "✓ 다녀옴" → "✓ 실방문자").
관리자 댓글 목록의 판매점 댓글 링크는 store-map.html?shop=번호(그 판매점 카드가 열린다). 개인정보 처리방침에 "판매점 지도의 판매점에 쓴 댓글"(시행일 2026-10-27).store-map-data.json 의 net(생성기가 매주).
(같은 날 고침) 다른 판매점과 같은 규칙: 지도 층(net 소스 · st-net* 층)으로 바꿔 크기 공식(2등+1등×6) · 투명도 · 이름 표시 개수 · 가운데 숫자 · 반짝임을 똑같이.
TOP 50 전에는 붉은 버블, TOP 50 에서는 붉은 별 + 반짝임. 1등 칩을 끄면 숨는다. 0등 층의 투명도는 상수(1등이 늘 끌기 막대 끝보다 많음) —
매 프레임 바꾸는 반짝임 값이 ['get', …] 식이면 소스를 계속 다시 읽어 눌러도 카드가 안 열렸다.
(같은 날) 0등 카드에도 1등 · 2등 나온 회차(날짜 · 당첨번호 · 5개씩 쪽 넘김)를 다른 판매점 카드와 똑같이 — store-map-rounds.json 의 net(1등 132 · 2등 826게임, 같은 회차에 여러 게임이면 여러 줄).
1등 판매점 페이지 시도별 표 · 설명의 "인터넷은 지도에 없음" 문구도 "지도에 0등"으로 고침.sm-top50-list 에 0등 + TOP 50(순위 · 상호 · 시도 시군구 · 1등 · 2등)을
미리 적고(storeMapTop — 화면 computeProps · renderTop 과 같은 규칙 · 같은 모양이라 스크립트가 다시 그려도 그대로, 휴대폰은 여전히 감춤),
같은 51줄을 JSON-LD ItemList(0등이 1번, 주소 store-map.html?shop=번호 — 0등은 ?shop=51100000 이면 0등 카드)로 @graph 에 더한다. 매주 생성기가 같이 바꾼다.storeMapAll). 2,340곳.img/share/sido-*.jpg, 왼쪽 글자는 하얀 덮개로 가림 — 스파면 서울, 10-28 사장님. 시도를 모르면 남한 전체 img/share-shop-bg.jpg),
왼쪽에 LOTTODRAW.KR · 상호(길면 줄이고 말줄임) · 지역 · 1등/2등 횟수 · 기록 회차 · "어디서 사든 1등 확률은 같다". 그림은 서버에 올리지 않는다.https://api.lottodraw.kr/s/판매점번호(Worker worker/src/share.js): 카카오톡 · 커뮤니티 미리보기 제목 · 설명이 "스파 · 서울 노원구 로또 판매점 / 1등 52번 · 2등 246번…",
그림은 그 판매점 시도의 그림(img/share/sido-*.jpg 17장 — 지도 공유 이미지와 같은 짜임에 "부산 로또 판매점", 그 시도 지도. 한 번 찍음, 시도를 모르면 지도 공유 이미지). 두 배경 모두 원이 너무 많지 않게 1등 5회 이상 + 2등만 나온 곳만 찍었다(10-28 사장님). 사람은 바로 store-map.html?shop=번호 카드로. noindex(판매점 1곳 1쪽은 보류 — 검색에 올리지 않는다). 자료는 사이트 공개 파일을 한 시간 들고 있는다.shop-share(화면), 공유 주소를 사람이 연 것 shop-open(서버, 미리보기 로봇은 빼고) — 관리자 공유 · 출력 집계 표.store-map.html?area=서울+노원구) — 지도 위치(#map=)나 내 위치는 넣지 않는다(위치정보법 표 참고).
받은 사람이 열면 그 시군구의 1 · 2등 판매점이 한 화면에 들어오게 맞추고(휴대폰은 아래 목록 칸 몫을 비움, "흐리게"는 0) 그 시군구 판매점만 목록으로.mine 소스 · st-mine* 층), 그 곳들이 다 보이게 지도를 맞춘다.
목록은 다녀온 곳 / 내 댓글 두 칸(누르면 그 판매점 카드, 블로그 댓글은 그 글 댓글 칸). 새 답글이 있으면 칩에 빨간 점 + "새 답글 N개 · 마이페이지에서 보기".to = 맨 위 댓글 번호). 맨 위 댓글을 지우면 "(지운 댓글입니다)" 아래에 답글이 남는다. 블로그 댓글도 같다(js/comments.js, 같은 날 — 입력칸 위 "↳ ○○님에게 답글 · 취소").
js/account.js 가 붙이는 chat.js · comments.js 에도 지문(LOAD_V, tools/asset-version.js 가 적는다).nt:<계정> 에 최근 50개, 안 읽은 수는 내 정보 notes.
머리글 계정 단추에 빨간 점 + 메뉴 "마이페이지 → (새 답글 N)". 마이페이지 "답글 알림 · 내 댓글" 칸(새 것은 NEW, 열면 모두 읽음) + 내가 쓴 댓글 최근 100개(10개 + 모두 보기).GET /api/me/comments, GET /api/me/notes, POST /api/me/notes/read, 댓글 쓰기에 to(없는 댓글이면 404 not_found, 번호가 이상하면 400 bad_reply). 탈퇴하면 알림도 지운다. 워커 시험 85개.#map=…)이 바뀌어 Cloudflare Web Analytics 가 그때마다 조회로 셌다(하루 /store-map.html 1,487회 · 사이트 안 출처 1,532회).
지도 두 쪽만 비콘에 "spa": false(CF_BEACON_MAP) — 처음 연 한 번만 센다. 다른 쪽은 주소가 안 바뀌어 그대로. 바뀐 뒤 하루 숫자로 확인할 것.#map= 이 있으면 그 화면.#map= 만 달라 js/i18n.js 가 이때는 reload 한다.store-map-top50.html: 같은 지도를 TOP 50 별로 연다(data-top). 공유 이미지 img/og-store-map-top50.jpg(밤 지도 + 별, 기본 공유 이미지와 같은 짜임),
canonical 은 store-map.html(사이트맵에도 넣지 않는다). 생성기가 매주 함께 만든다.js/theme.js 가 붙인다.
바닥글 띠 배경을 다시 찍었다(도로 번호판 네모가 없어진 지도). 밤 모드 띠는 TOP 50 별만 켠 밤 지도(img/map-banner-night*.jpg, 글씨도 별 색).st-top 층) + 별 테두리가 숨 쉬듯 빛난다(둥근 빛은 별로라 테두리로 — 사장님. st-top-glow 층에 테두리만 그린 그림, 낮은 금빛 · 밤은 흰빛 노랑, 밝기 0.35 ~ 1 이 2.8초에 한 번,
1초 15번만 바꾸고 탭이 뒤에 있으면 쉰다). 별 가운데에 1등 횟수. 다녀온 곳으로 칠했으면 별 뒤에 그 색 동그라미가 남는다.
바탕 지도의 도로 번호판(흰 네모)은 감춘다 — 판매점 지도에는 필요 없고, 줌인하면 도로 이름이 네모에 겹쳐 보였다.POST /api/me/visit-color { color } — 8색 목록(VISIT_PALETTE, 지도 PALETTE 와 같게) 안의 색만, POINTS.visitColor(30)를 spent 에 더한다(랭킹 점수는 그대로). 연 색은 내 정보 user.visitColors.lottodraw-members-YYYYMMDD.jsons:POST /api/admin/restore| 2026-10-26 | Claude Code 웹 | 판매점 지도 1~6차(#112~#118) — ① 새 페이지 store-map.html: MapLibre(직접 실음) + OpenFreeMap, 1등(주황) · 2등(파랑) 판매점 1만여 곳을 점으로(크기 = 2등 + 1등 × 6), 이름 찾기 · 카드(카카오맵 · 네이버 지도 링크), 수집기가 판매점 좌표도 저장(광주 · 전남 나눔 고침) ② 모양 "화이트 모형"(줌인하면 건물이 솟고 저절로 기울어짐), 일반 판매점 층(동행복권 판매점 찾기 — 매달 갱신 워크플로) ③ 1등 방식(자동 · 수동 · 반자동) 체크(로그인), 카드에 당첨 회차 · 날짜 · 번호(5개씩 쪽 넘김), 끌기 막대(적게 나온 곳 흐리게), 북쪽 보기, 이색 판매점(켜고 끄기 · 블로그 글), 다녀온 곳(로그인, /api/me/visits, 색은 이용권 또는 30포인트에 하나 — /api/me/visit-color) ④ 가는 길: MAP 단추(PC · 휴대폰) · 바닥글 아래 지도 띠(생성기 폭, 실제 지도 배경) · 사용법 단계 ⑤ PC 는 왼쪽 고정 칸(340px) + 탭(TOP 50 · 판매점 · 이색 판매점 · 시도별), 휴대폰은 지도 위 작은 단추 ⑥ 밤 지도(🌙 = 사이트 낮/밤), 첫 화면 용산 둘레, 지도 OG · 판매점 지도 블로그 글 ⑦ 막대 지도는 만들었다가 뺐다(임팩트 약함), 랜드마크 3D 모형도 뺐다(사장님이 따로) ⑧ 위치정보법 조사(GPS 현장 인증은 위치기반서비스사업 신고 뒤) |
| 2026-10-21 | Claude Code 웹 | 성적표 카드 기본 예시 = 2등 번호 — 상세 분석을 열면 성적표 카드가 비어 있지 않게, 마지막 회차(지금은 1246회)의 2등 조합(당첨번호 앞 5개 + 보너스, 6 16 22 23 24 27)으로 결과를 펼쳐 둔다: 쓴 돈 1,333,000원 · 받은 돈 78,619,311원 · 가장 좋았던 회차 1246회 2등. 맨 위 노란 줄에 "예시 — 1246회 2등 번호(당첨번호 5개 + 보너스 6)…"로 지난 당첨번호로 만든 예시임을 밝힌다. 회차가 바뀌면 예시도 새 회차로. js/report.js 가 아직 안 읽혔으면(defer) 문서를 다 읽은 뒤 펼친다. 옆 카드 목록도 예시 높이만큼 채워진다. 브라우저로 홈(PC · 휴대폰) · 5개월 통계(영어) 확인 |
| 2026-10-21 | Claude Code 웹 | 상세 분석 4종 위아래 맞춤(성적표 기준) — 카드마다 안내 줄 길이 · 본문 길이가 달라 성적표 결과를 펼치면 옆 카드 아래가 텅 비었다. 네 카드를 제목 · 안내 · 본문 · 주석 같은 틀로 바꾸고 한 줄의 카드끼리 칸마다 높이를 맞췄다(subgrid — 본문이 같은 높이에서 시작, 주석은 맨 아래에 나란히). 옆 카드가 길어지면 연속번호 · 동반 출현 · 1등 당첨금 목록이 그 높이까지 더 보인다(늘 보이는 12 · 10 · 20개 + 남는 자리만, 휴대폰은 그대로 — 화면 위쪽에서 줄을 늘릴 때 스크롤 고정 때문에 화면 좌표가 안 바뀌어 카드 위끝 기준으로 잰다). 잠긴 카드의 "이용권으로 열기" · "열기" 단추도 같은 높이로. 1등 당첨금 안내 문장을 줄이고(긴 설명은 주석으로) 제목 옆을 "최근 n회차"로, 금액 칸이 카드 밖으로 잘리던 것(18억 8,102만 · 16명)도 회차 · 금액 칸을 가장 긴 줄에 맞춰 고침. 1440 · 1280 · 1100 · 800 · 390px 에서 칸 위치를 재서 확인(잠김 · 열기 · 성적표 전후 · 오류 뒤 원래대로) |
| 2026-10-21 | Claude Code 웹 | 내 번호 성적표를 상세 분석(이용권) 안으로 — 무료 "통계와 기능 자세히 보기" 목록보다 이용권으로 여는 상세 분석이 맞다는 의견으로. 상세 분석의 "내 번호 과거 대조"(번호 6개가 지난 회차와 몇 개씩 겹쳤나)는 성적표가 하는 일의 일부라 그 카드를 "내 번호 성적표" 카드로 바꿨다 — 상세 분석은 그대로 4종이라 결제 카드 · 약관의 "상세 분석 4종" 문구는 그대로(About 의 4종 이름만 고침). 카드: 번호 6개 → 쓴 돈 · 받은 돈 · 손익(한 줄에 하나씩) · 등수별 횟수 · 가장 좋았던 회차 · 아까웠던 회차 5개(맞힌 번호만 색), 아래 "당첨 회차 전체 · 연도별 보기 →"가 report.html?n= 로. 계산은 js/report.js 를 그대로 쓰고(홈 · 5개월 통계에 defer 로 싣는다), 2~5등 금액은 처음 누를 때만 받는다. 홈 무료 목록에서 성적표 줄을 뺐다(build-static-stats.js). 생성기 아래 "이 번호 성적표" 링크 · 마이페이지 링크 · report.html(무료 요약 + 이용권 자세히)은 그대로. 쓰지 않게 된 matchHistory · dt.match.* 는 지움. node tools/test-i18n.js · node tools/test-report.js 통과, 브라우저로 홈(잠김 · 열림 · 휴대폰 밤) · 5개월 통계(영어) 카드 확인 |
| 2026-10-21 | Claude Code 웹 | 이용권 더 팔기 1~4 — 지금까지 판매는 지인의 1일 이용권뿐, 주 방문 1,900명(절반은 미국 로봇으로 보임). ① 결제 흐름 집계: 결제 페이지 · 고름(화면) → 주문 · 입금 · 포인트(서버)를 하루씩 세고 관리자 페이지 "결제 흐름"에 주문률 · 입금률까지. ② 내 번호 성적표(report.html, 새 기능 — 상품 중심은 그대로): 1회부터 매주 샀다면 쓴 돈 · 받은 돈 · 등수별 횟수 · 가장 좋았던 회차는 무료, 아까웠던 회차 · 당첨 회차 전체 · 연도별 · 꽝 행진은 이용권. 홈 생성기 · 마이페이지 · 안내 목록 · About 에서 잇는다(홈 단추 위치 그대로). ③ 이번 회차 이용권(2,900원, 1주 이용권 자리 · 추천 카드): 판매 중인 회차의 토요일 밤 12시까지, 카드에 남은 시간이 1초마다 준다. 1주 이용권은 팔지 않음. ④ 1일 이용권을 300포인트로도(1일 카드의 "포인트로 열기", 랭킹 점수는 그대로, 살아 있는 동안 다시 못 씀, 실패하면 포인트 돌려줌). 카드 결제(페이앱)는 안 하기로. 이용약관 3조(대상 · 가격 · 기간) · 7조(포인트) · 개인정보 처리방침(결제 흐름 집계 · 포인트로 연 키 기록) 고침. 서버 시험 77개 통과(이번 회차 기간 · 1주 판매 중지 · 포인트 이용권 · 결제 흐름 추가), node tools/test-report.js 19항목 통과, 브라우저로 결제 카드 · 성적표(잠김 · 열림 · 휴대폰 밤) · 관리자 결제 흐름 확인 |
| 2026-10-21 | Claude Code 웹 | 낮/밤 모드 + 별명 먼저 묻기 — ① 낮/밤 모드 단추(js/theme.js): 오른쪽 아래 채팅 말풍선 · 펼친 채팅창 바로 위(머리글은 단추가 많아서). 고른 모드는 브라우저에 저장, js/i18n.js 가 그리기 전에 붙여 깜빡임 없음. css/site.css 의 박힌 색 230여 곳을 속성(바탕 · 글자 · 선 · 그림)에 맞춰 변수로 바꾸되 원래 색을 기본값으로 둬 낮 화면은 그대로(17쪽 × PC · 휴대폰 픽셀 비교 — 다른 곳은 문구를 고친 랭킹 · 개인정보 처리방침과 순서가 무작위인 블로그 목록뿐), 밤 값은 한 곳. 버튼 파랑은 글자용 --brand 와 바탕용 --brand-bg 로 나눔(밤에 흰 글자가 읽히게). 최근 10회차 칸 · TOP 50 그래프 선 · 블로그 미리보기 막은 밤용으로 따로. 홈 · 당첨번호 · 회차 · 통계 · TOP 50 · 실수령액 · 블로그 · 랭킹 · 마이페이지 · 채팅 · 별명 창을 밤 모드로 찍어 확인. ② 별명은 먼저 직접: 자동 별명이 붙기 전, 별명 없는 회원(이 기능 전 가입 · 관리자가 지운 회원)에게 다음 방문 때 별명 창을 한 번 띄운다(가입 때 물었으면 다시 묻지 않음). 랭킹 노출이 목적이라 3일 뒤 자동 별명은 그대로 |
| 2026-10-21 | Claude Code 웹 | 자동 별명 — 가입하고 3일 안에 별명을 정하지 않으면 한 시간 예약이 "형용사 + 동물 + 숫자 4자리"(예: 행운의수달4821)를 붙인다. 자동 별명은 한 번 포인트 없이 바꾸고(그 뒤로는 500포인트), 붙으면 랭킹 · 채팅 · 댓글에 쓰인다. 서버: Community autoNicks · 대기열 q: · nickDue · nickAuto, 관리자가 별명을 지우면 다시 3일, 운영자 제외, 예전 회원은 배포 뒤 처음 예약부터 3일. 화면: 처음 들르면 알림 한 번, 메뉴 "별명 바꾸기 (한 번 무료)", 별명 창 · 마이페이지에 자동으로 붙는 날짜, 관리자 명부 "(자동)". 이용약관 7조 · 개인정보 처리방침 4번 · 랭킹 안내 문장 고침(시행일 2026-10-21). 서버 시험 73개 통과(자동 별명 시험 3개 추가 — 낱말 조합 전부가 별명 규칙에 맞는지, 3일 · 한 번만 · 무료 1회 · 랭킹, 예전 회원 · 관리자 지우기 · 운영자 · 탈퇴), 브라우저에서 한 · 영 화면 확인 |
| 2026-10-18 | Claude Code 웹 | 회차 메모 9 → 23개 (content/round-notes.md) — 2(첫 1등) · 3(2등 0게임) · 9(2등 1게임당 역대 최고 7억 6,946만) · 196(합계 최대 238) · 213(4개 연속) · 255(88회 이후 2등 최고) · 312(합계 최소 48) · 463(마지막 이월) · 464(이월 직후 판매액 2.5배) · 534(88회 이후 1인당 최고 142억) · 551(마지막 1등 1명) · 1018(2020년 이후 1인당 최고 · 모두 홀수) · 1162(1등 36명) · 1208(2025년 이후 1인당 최고). 숫자는 모두 당첨 기록으로 대조(463회 "1~41회 이월 11번" → 10번으로 고침). 회차만의 문장이 있는 쪽 49 → 58 |
| 2026-10-18 | Claude Code 웹 | 당첨번호 중복 페이지 → 4-8번. 사용자 질문(완전히 같은 번호가 나온 회차가 있나 → 1~1246회 없음, 5개 같은 쌍 21)에서 시작. statistics-repeat.html: 같은 번호 개수별 실제 · 기대 쌍, 5개 일치 21쌍 표, 451 → 786회 2등 사례, 생일 문제(지금까지 9.1% · 3,361회에 50%). 홈 목록 · 궁합수 · 확률 · 5개 일치 회차 21쪽 · 블로그 09(한 · 영) · 사이트맵에서 잇는다. 같은 자료로 두 번 돌리면 바뀌는 쪽 0. 휴대폰 360px · PC 1280px · 영어 화면 확인 |
| 2026-10-18 | Claude Code 웹 | 조회수는 글 안에서만 — 목록 카드의 "조회 N" 을 뺐다(글 제목 아래에만). 카드의 숨은 자리는 그대로 두어 "많이 읽은 순" 정렬은 그대로 된다. js/views.js 한 줄(목록이면 숫자를 적지 않는다) — 생성 페이지는 바뀌지 않는다. 로컬에서 목록(숫자 없음 · 정렬 됨) · 글(숫자 있음) 확인 |
| 2026-10-18 | Claude Code 웹 | 블로그 목록 "많이 읽은 순" 정렬 — 카테고리 단추 아래 오른쪽에 [기본 순서 | 많이 읽은 순]. 조회수 큰 순(같으면 기본 순서), 카테고리를 고르면 그 안에서도 조회수 순, 기본으로 돌리면 카테고리 안은 다시 가나다순. 조회수를 못 받으면 단추를 숨긴다. js/views.js 가 받은 수를 카드에 data-n(숨긴 수 포함)으로 적고 ld:views 를 알린다. 로컬에서 실서버와 같은 시작값으로 기본 · 많이 읽은 순 · 카테고리와 섞기 · 영어 · 휴대폰 360px · 서버가 안 될 때 확인. 같은 날 seed-views 로 시작값을 넣었다(글 16편, 페이지뷰 합계 117 — 연속번호 31 · 의사난수 26 · 도박사의 오류 14 …) → 4-3번 |
| 2026-10-18 | Claude Code 웹 | 블로그 조회수 시작값 = Cloudflare Web Analytics 페이지뷰 — 직접 세기 시작한 2026-10-18 09:41Z(Pages 배포 끝) 전까지의 글별 페이지뷰를 시작값으로. Worker: Community vbase 한 줄(메모리에 들고 있음), /api/view · /api/views 가 시작값을 더해 돌려준다, 관리자 GET /api/admin/views · POST /api/admin/views/base(통째로 갈아 끼움, 0 은 담지 않음). tools/seed-views.js + 워크플로 seed-views(손으로만 — 표만 / apply): Cloudflare GraphQL rumPageloadEventsAdaptiveGroups 를 보관 기간 안에서 나눠 물어 lottodraw.kr 의 /blog/<글>(.html) 만 모은다(목록 · 없는 글 · 다른 사이트 제외), 한 번에 1만 줄을 채우면 기간을 반으로. 워커 시험 추가(전체 70개), 스크립트는 가짜 Cloudflare · Worker 응답으로 확인 → 4-3번 |
| 2026-10-18 | Claude Code 웹 | 블로그 조회수 공개 — 글 제목 아래 카테고리 옆 · 목록 카드 오른쪽 위에 "조회 1,234"(영어 "1,234 views"). Worker POST /api/view(센 뒤의 수를 돌려줌) · GET /api/views(누구나, 100개까지, 60초 캐시), 저장은 Community v:<글> 숫자 한 줄, VIEW_LIMIT 같은 IP 1분 60번. 같은 브라우저의 같은 글은 하루 한 번(localStorage ld_viewed), 자동화 브라우저 · 스크립트를 돌리는 로봇(BOT_UA)은 빼고, 0 은 숨김(MIN). 화면은 js/views.js — 빌드는 빈 자리만 박는다(블로그 17쪽 다시 생성). 개인정보 처리방침 1번에 한 문장(한 · 영, 시행일은 그대로 2026-10-18). 워커 시험 추가(전체 69개 통과). 로컬에서 워커 코드를 그대로 띄워 첫 방문 +1 · 같은 날 새로 고침은 그대로 · 목록 · 영어 화면 · PC 1280px · 휴대폰 360px 확인 → 4-3번 |
| 2026-10-18 | Claude Code 웹 | 번호 생성기: 경우의 수가 적으면 전부 검사 + 빠진 까닭을 숫자로 — 이용자 제보: 고정 22·23·24·27·28 · AC 딱 5 · 직전 당첨 조합 제외(전체)로 돌리면 "1게임만 만들었습니다"에 같은 번호만 나왔다. 버그가 아니라 맞는 조합이 정말 하나뿐(AC 5 는 16·34 둘, 16 은 1246회 당첨 조합). 랜덤 1만 번 시도는 40가지를 250번씩 본 셈이라 놓친 것도 없었다 — 문제는 안내 문구. ① 고정수 · 제외수로 만들 수 있는 조합이 20만 개 이하(ENUM_MAX — 고정수 2개 이상이나 제외수가 많을 때)면 랜덤 시도 대신 전부 검사(조합 하나 약 1μs, 12만 개 0.1초)하고 맞는 조합 중 저수지 표집으로 고르게 뽑는다(2,000번 뽑아 40가지 모두 · 카이제곱 30.2 < 54.6). ② 몇 개뿐인지와 빠진 까닭: "조건에 맞는 조합은 이것 하나뿐입니다: … 가능한 40개 중 특수 패턴으로 5개, AC값 조건(딱 5)으로 33개, 직전 당첨 조합으로 1개(1246회)가 빠졌습니다." 맞는 게 여럿이면 "조건에 맞는 조합 N개 중에서 무작위로". ③ 20만 개가 넘어 랜덤으로 못 찾을 때도 "켜 둔 조건(고정수 · 제외수 · 특수 패턴 · AC값 · 직전 당첨 조합) 중 몇 개를 풀어 보세요". ④ 특수 패턴 검사를 번호만 돌려주는 patternHit 로(예전 함수와 20만 건 비교해 결과 같음). ⑤ "8만" 같은 표기는 8만 원처럼 읽혀 "딱 8"로 |
| 2026-10-18 | Claude Code 웹 | 거리 삼각형: AC값 계산기 위로 + About 에도 — AC값 페이지에서 차이(거리) 삼각형을 계산기 입력 칸 위로 옮겼다(처음엔 최근 회차, 계산하면 그 번호로 다시 그림). About "자료를 둘러보며…"의 "번호 합계 분포 보기" 아래에 "번호 사이의 거리는 몇 가지일까요?" — 최근 회차로 그린 삼각형(빌드 때 미리 그려 스크립트 없이 보임) + "서로 다른 거리 N개 → AC값" 한 단락 + "AC값 계산기에서 내 번호로 그려 보기 →". 그림 코드는 acTri(값 계산) · acTriSvg(그림)로 나눠 빌드(About)와 페이지 스크립트(소스를 그대로 싣는다)가 같이 쓴다. 삼각형 스타일은 AC 페이지 안 <style> 에서 css/site.css 로 |
| 2026-10-18 | Claude Code 웹 | AC값 시각화 둘 + 번호 생성기 AC값 "이 값만" — ① AC값 페이지 "AC값별 출현 횟수" 그래프에 이론 기대 횟수 막대(N × 그 AC값 조합 수 ÷ 8,145,060)와 우연 범위 세로선(이항분포 ±2σ, 약 95%)을 깔았다. 점을 짚으면 "기대 409회, 우연 범위 376AC_ONE_PAIR, 전부 세어 얻음), 3항 등차면 1개(→9), 겹침 없는 AC 10 = 골롬 자. ② 계산기 차이 삼각형(acCalculator() 를 그대로 페이지에 싣는다): 맨 위 번호 6개, 아래로 1칸acExact — 워커 cleanGen 이 true 이고 AC값이 켜졌을 때만 저장(예전 설정은 범위로 불러온다), 워커 시험 추가 |
| 2026-10-18 | Claude Code 웹 | "이번 주 생성 번호 메일" → "추첨 결과 메일" → 4-5번. 생성 번호 5게임은 사이트에서 한 번 누른 것과 같아 메일로 보낼 가치가 작고 번호 추천 업체처럼 보여, 사용자 결정으로 바꿨다(첫 발송 전). 일 · 월 09~21시, 사이트에 그 회차 당첨번호가 올라온 뒤 그 회차 번호를 내 번호에 저장한 구독자에게만: 당첨번호 + 보너스, 게임마다 등수 · 맞은 번호, 실물 확인 안내, 회차 페이지 · 마이페이지 링크. 생성 번호는 보내지 않는다. 기록은 mr:<회차>(예전 mw: 는 치움), 서버의 번호 생성 코드(patternHit · makeGames · seeded)와 그 시험 두 개를 뺐다. 마이페이지 · About · 개인정보 처리방침(시행일 2026-10-18) · 관리자 문구, 시험 7개 새로. 같은 날 #98(특수 패턴 기본값 · 패턴 카드 내 설정 저장) 머지 |
| 2026-10-18 | Claude Code 웹 | 스팸 정책 · 검색 유입 점검 — 생성 페이지 종류별 실측(회차 1,246쪽은 숫자 빼면 97% 같음, 문장 틀 5가지), 위험도(회차: 스팸 중 · 애드센스 상), 선택지 (a) 보강 · (b) noindex · (c) 묶음 비교 → 사용자 결정: 검색 유입을 잃지 않는다 → (a). 회차 페이지에 회차마다 다른 사실(직전 회차와 같은 번호 · 가장 많이 겹친 지난 회차 · 당시 1인당 순위 · 번호별 직전 출현과 간격, 해당될 때만 이월 · 당시 기록 · 5개 일치 문장)과 사람이 쓴 메모 9개(content/round-notes.md, 당첨 기록으로 대조), 모든 회차에 같던 세금 설명을 한 줄로. 같은 문장 280 → 180자, 회차 들어오는 링크 3 → 8. 10-13 에 만든 PR #77 이 그사이 바뀐 html 과 겹쳐 닫고 최신 코드에서 다시 했다. 구글 공식 문서는 네트워크 차단으로 직접 확인 못 함 → 4-7번 |
| 2026-10-17 | Claude Code 웹 | 번호 생성기: 특수 패턴 기본값 · 패턴 카드 내 설정 저장. ① 처음 켜 두는 패턴을 16개 전부에서 12개로(DEFAULT_PATTERNS — 모두 1gen)은 그대로, 화면이 그 카드 몫만 바꿔 보낸다. 안내(tour.s5 · tour.s6) · 저장 문구 고침. 이번 주 생성 번호 메일(makeGames)은 여전히 16개 모두 거른다 |
| 2026-10-17 | Claude Code 웹 | 내 번호 저장 · 추첨 뒤 자동 확인 + 이번 주 생성 번호 메일 (회원) → 4-5번. ① 마이페이지 "내 번호": 회차를 고르고 한 줄에 한 게임 입력(20게임까지), 회차별 목록에 당첨번호 · 등수 · 맞은 번호 색칠, 최근 4/12/52회 · 전체 1lotto-data.json 으로 맞춘다(토요일 밤 갱신되면 저절로). ② 홈 생성기 "이번 번호" 칸 왼쪽 위 + 내 번호(번호를 만든 뒤에만, 칸 위에 띄워 높이 그대로) — 방금 만든 1 · 5게임을 이번 회차로 저장, 로그인 안 했으면 자물쇠 + 로그인 창. ③ 이번 주 생성 번호 메일: 마이페이지에서 켜고 끔, 금요일 09:17부터 생성기 기본 규칙 5게임, 지난주 메일 번호 결과 한 줄, 수신 거부 링크(열기만으로는 안 꺼지고 단추 · 메일 앱 한 번 누르기로), 하루 80통 · 넘치면 토요일, 세 번 실패하면 멈추고 알림. ④ 저장은 회원 저장소(Durable Object) — 결제 KV 쓰기 0회, 무료 한도 셈은 4-5번 표. 탈퇴하면 번호 · 구독도 지움. ⑤ 개인정보 처리방침 4번에 "내 번호와 생성 번호 메일" 항목 · Resend 위탁 추가(시행일 2026-10-17), 탈퇴 확인 문장, About 주요 기능 한 줄, 관리자 설정 목록에 메일 상태. 서버 시험 54 → 68개(특수 패턴이 홈 생성기와 같은지 무작위 3만 조합 · 회차 날짜가 1 |
| 2026-10-17 | Claude Code 웹 | 1등 판매점 통계 페이지 → 4-6번. ① 출처 확인: 동행복권 "당첨 판매점 조회"가 부르는 공개 조회(selectLtWnShp.do, GET · JSON), robots.txt 는 /resources/ · /winImages/ 만 막음, 이용약관에 자동 수집 금지 조항 없음 — 우회 없음. 262회부터 자료. ② tools/update-stores.js + stores-data.json(984회차 · 판매점 10,587곳, 1.4MB — 상세 주소 · 전화 · 좌표는 저장 안 함). 1등 판매점 수가 984회차 모두 1등 당첨자 수와 같음, 2등은 1회차만 다름. 동행복권은 광주를 "전남광주"로 적어 시도를 광주로 고침(전남에는 구가 없다). 첫 전체 받기는 응답이 느려 90분에 끊겨(중간 저장이 없었다) 요청마다 15초 상한 · 25회차마다 진행 표시 · 50회차마다 저장 · 시간 상한을 넣고 다시 받아 한 번에 끝남. ③ 페이지: 1등이 나온 판매점 4,603곳 중 58.1%는 한 번뿐, 1등 횟수 묶음별 판매점당 평균 2등이 1회 4.7 → 10회 이상 80.3(같이 오른다 = 많이 팔린 곳), 2등 10번 넘게 나왔는데 1등 없는 곳 223곳, 1등 최다는 인터넷 판매 130게임(836회부터), 1등 30곳 표(휴대폰은 표만 옆으로), 지역별 1등 · 2등 비율(거의 같다), 자동 66.3% · 수동 30.9% · 반자동 2.8%(1128회 수동 52게임), 최신 회차 1등 판매점. 문장은 자료에 조건을 건다. ④ 링크: 홈 목록 · 1등 당첨자 수 · 확률 · 블로그 08(한 · 영 — "판매점별 기록은 다루지 않는다" 문장을 고침, related: stores) · About 주요 기능 · 사이트맵. ⑤ update-lotto-data 에 "1등 판매점 수집" 단계(회차가 그대로여도 돌고 실패해도 로또 갱신은 그대로, 판매점만 바뀌면 "1등 판매점 갱신" 커밋 · Pages 재배포). 휴대폰 360px · PC 1280px · 영어 화면 확인 |
| 2026-10-15 | Claude Code 웹 | TOP 50 그래프 "평균 기준" 줄을 그래프 위로 + 이동평균도 1인 기준 — 머지 뒤 "회차 기준 단추가 없다"는 말을 들었다: 그래프 아래 도구 상자 3번째 줄이라 눈에 안 띄었다. 그래프 위 지표 상자(지표 · 2·3등 아래)로 옮기고 1인당 당첨금일 때만 보이게 했다. 20/60/120/240회 이동평균도 평균 기준을 따른다 — 1인 기준이면 당첨자 수로 가중(movingAverage(values, n, weights), 창 안 총당첨금 ÷ 당첨자 수), 회차 평균이면 예전 그대로. 그래프 아래 설명 한 줄도 "평균 · 이동평균은 …"으로. 시험 3개 추가(가중 이동평균, 이월 건너뛰기, 240회 끝값 = 최근 240회 총당첨금 ÷ 당첨자 수) |
| 2026-10-14 | Claude Code 웹 | 1등 평균 당첨금: 기본은 당첨자 1인 기준(동행복권), 회차 평균은 설명 · 그래프 단추로 — 동행복권 홈페이지(구간 설정)는 평균 19.5억 원인데 우리는 26억 5,826만 원이라 틀린 줄 알 수 있었다. 계산 실수가 아니라 셈법 차이: 우리 값은 회차 평균(회차마다의 1인당 금액 평균 — 19회 1명 407억 원 같은 회차도 한 표), 동행복권 · 언론은 당첨자 1인 평균(1등 총당첨금 ÷ 당첨자 수, 1build-static-stats.js 에 firstPrizeAvg()(두 값을 같이 낸다)를 두고 ① TOP 50 설명(meta)에 "당첨자 1인 기준 20억 1,209만 원(회차 평균 26억 5,826만 원)" ② TOP 50 1등 표 아래(순위 · 최근 50회 어느 쪽에서도 보임)에 새 칸 seo:avg-note — 두 셈법과 차이가 나는 까닭 한 단락 ③ 최근 50회 안내도 두 값(19억 3,835만 · 21억 4,881만 원)으로, 전체 평균 괄호는 ②로 옮겨 뺐다 ④ 실수령액 계산기 설명(meta)에 두 값과 각 세후 금액. 회원 상세 분석 "1등 당첨금 추이"(js/details.js · dt.prize.lead)도 두 값 + 한 줄 설명. 블로그 "당첨금은 어떻게 정해지나"의 "계산기 예시의 26억 원대는 회차 평균" 문장(meta 라 화면엔 없었다)을 "동행복권 · 뉴스 평균은 1인 기준, TOP 50에 둘 다 있다"로 고침(한 · 영). ⑤ TOP 50 그래프에 "평균 기준" 단추(도구 상자 세금 줄 아래, 무료): 당첨자 1인 기준(처음 값) / 회차 평균. 1인당 당첨금에서만 켜지고(다른 지표는 잠김), 그래프 아래 요약의 평균 · 평균선(이용권) · 범례가 고른 쪽을 따르며, 고른 쪽 설명 한 줄이 그래프 아래 안내에 붙는다. 두 평균선을 한꺼번에 그리는 안은 전체 기간에서 두 줄이 몇 px 차이로 붙어 글자가 겹쳐 버렸다. summarize() 가 지표의 weight 로 가중 평균(avgW)도 내고, 시험에 "1~1047회 1인 기준 평균 = 언론 보도 20억 4,418만 원" 등 4개 추가. TOP 50 표 자체(회차별 1인당 금액)는 원래 동행복권 숫자 그대로였고, 다른 건 평균뿐이었다. 1등 평균은 1인 기준이 기본, 회차 평균은 함께 적거나 단추로 |
| 2026-10-14 | Claude Code 웹 | 네이버 검색어를 보고 통계 페이지 문구 3곳 손봄 — 서치어드바이저(최근 60일, 10-13 갱신): 클릭 약 141 · 노출 약 4,000 · CTR 3.5%, 노출은 9-16(정적 통계 페이지 12종 추가) 뒤부터 하루 10건대 → 100~280건대. 페이지별 클릭(노출): top-prize 36(1,081) · statistics-gap 32(280) · statistics-frequency 28(2,068, CTR 1.4%) · statistics-ac 21(144) · about 16(29) · statistics.html 5(16) · 홈 2(203) · 회차 페이지 0(1046회 89 · 1003회 15 등 노출만). 검색어 TOP 30: lottodraw 21클릭/53노출(브랜드, 영문 표기뿐 — 한글 "로또드로우"는 없음) · 로또 장기미출수 14/158 · 로또 ac값 계산기 6/20 · 로또 많이 나온 번호 5/1,245(CTR 0.4%) · "많이 나온 숫자 순위" 계열(노출 129 · 클릭 7) · 역대 1등 순위 · 당첨금 순위 계열 · "1243회 · 1244회 + 장기미출수 · ac값"(제목의 "(N회 기준)"이 맞아 통계 페이지로 옴 — 매주 제목의 회차를 갱신하는 것은 그대로 둘 것). 고친 것: ① statistics-frequency 설명(meta · og · twitter · JSON-LD)과 소제목에 "번호·숫자"(이 페이지엔 '숫자'가 한 번도 없었다. 제목은 머리 검색어 "많이 나온 번호 순위"가 이미 맞아 그대로) ② statistics-gap 설명과 첫 문단에 붙여 쓴 "장기미출수"(검색은 붙여 쓴 형태가 대부분인데 페이지에는 설명의 띄어 쓴 "장기 미출수"뿐이었고 본문에는 두 형태 다 없었다) ③ about.html 제목 · 설명 · 첫 문단에 한글 상호 "로또드로우"("로또드로우(lottodraw.kr)는 로또 데이터 플랫폼입니다" — lottodraw 브랜드 검색이 About 으로 가는 것으로 보인다. 키워드 21클릭 · About 16클릭, 추정). tools/build-static-stats.js 를 고쳐 다시 생성했으니 매주 갱신에도 유지된다. 바뀐 파일: 두 통계 페이지 · About · 홈 JSON-LD(통계 설명 두 줄) · 사이트맵 About lastmod 10-14(ABOUT_SINCE). 안 고친 것: 회차 페이지(클릭 0), 통계 제목. 시험: test-i18n · test-prize-chart 통과, JSON-LD 파싱, 생성기를 두 번 돌려도 변화 없음. IndexNow 는 데이터가 바뀔 때만 돌아 이 세 쪽은 자동으로 알려지지 않는다 → 아래 7번 "네이버 검색어 변화 확인"의 수집 요청 |
| 2026-10-16 | Claude Code 웹 | AC값 그래프를 "AC값과 1등 당첨자 수" 설명 바로 아래로 — 소제목 → 설명 문단(기대 인원의 뜻) → 그래프 → 표 → 결과 문단 차례(전에는 맨 끝). 설명을 먼저 읽어야 "기대 대비" 그래프가 읽힌다 |
| 2026-10-16 | Claude Code 웹 | AC값 그래프 셋 다 처음부터 켜고 주황으로 통일, 점은 작게 다시 — 1인당 당첨금도 처음부터 켠다(단추 셋 다 눌린 채). 1등 기대 대비 · 1인당 당첨금 선도 주황(--ball-3), 옅은 구간은 옅은 주황(#f9b4b4). 점을 다시 보이되 반지름 5.5 → 2.5(흰 테두리 1), 표본 10회 미만은 속 빈 점. 칸을 짚거나 누르면 점이 1.8배로 커지고 세로 안내선 · 글. 기준 점선(1배 · 전체 중앙값)은 파랑 그대로 |
| 2026-10-16 | Claude Code 웹 | AC값 그래프 다듬기 — ① 출현 횟수: 이론(빨간) 선을 빼고 실제 선 · 면을 주황(--ball-3)으로. 이론값은 점을 짚으면 글로("AC 9 · 220회 (17.7%) · 이론 19.8%"). ② 점은 숨겨 두고(선이 가렸다) 그 AC값 세로 칸 어디든 짚거나 누르면 점 · 세로 안내선 · 글이 나온다(칸 전체가 투명한 짚는 자리). ③ "믿기 어려움" → "표본 10회 미만이라 오차가 큼"(범례 "옅은 선: 표본 10회 미만(오차가 큼)", 영어 "sample under 10 draws, wide margin of error"). 옅은 구간은 투명도 대신 옅은 색(겹치는 끝이 짙어지지 않게) |
| 2026-10-16 | Claude Code 웹 | AC값 그래프를 막대 없이 곡선으로 — 셋 다 선 그래프로, 점 사이는 단조 3차 곡선(Fritsch–Carlson, d3 curveMonotoneX 와 같다)으로 잇는다: 두 점 사이에서 값보다 튀어 오르거나 0 아래로 내려가는 가짜 봉우리가 없다. ① 출현 횟수: 실제(파란 선 + 옅은 면) · 이론(빨간 선), 가장 많은 점에 "AC 8 · 433회" ② 1등 기대 대비: 믿을 만한 점 중 가장 높은 점에 값(1.16배) ③ 1인당 중앙값: 믿을 만한 점 중 가장 낮은 점에 값. 10회 미만은 속 빈 점 + 그 점에 닿는 구간만 옅은 선. 기준선 이름(기대 1배 · 전체 중앙값)은 왼쪽 끝(AC 0 · 1 은 비어 있다). 점을 짚거나 누르면 js/dist-balls.js 가 글을 띄운다(.dist-dot[data-tip] 도 다루게, 맞히기 쉽게 반지름 16 투명 원) |
| 2026-10-16 | Claude Code 웹 | AC값 그래프를 번호 합계 그래프 모양으로 다시 — 위의 HTML 막대(1배에서 위 · 아래로)를 걷고 번호 합계와 같은 SVG(dist-*: 막대 · 회색 격자 · 점선 · 범례)로. x축은 셋 다 AC값 0js/dist-balls.js 가 막대 위에 글(data-tip / 영어 data-tip-en)을 띄운다 — 공 그림과 같은 이름표를 막대에도 쓰게 넓혔다(없으면 툴팁). 단추 · 옅은 막대 · 점선 범례 모양만 페이지 안 <style> |
| 2026-10-16 | Claude Code 웹 | AC값 페이지에 "AC값별 1등 당첨자 수" 막대그래프 — "AC값과 1등 당첨자 수" 글 아래. x축 AC값 0~10, 1배(기대) 선에서 위로 빨강(기대보다 많이 나눔) · 아래로 파랑(적게), 10회 미만 값은 옅게(믿기 어렵다), 당첨번호에 없는 AC 0 · 1 은 빈 칸. x축 아래에 그 값이 나온 회차 수(359px 이하는 숨김), 막대를 짚거나 누르거나 초점을 주면 풍선(회차 수 · 기대 대비 · 1인당 중앙값), Esc 로 닫음. 막대마다 단추라 화면 읽기 프로그램이 같은 글을 읽는다(한 · 영). 빌드 때 HTML 로 찍고 높이는 % — 휴대폰에서도 글자가 줄지 않는다. 그림 모양(<style>)은 페이지 안에 함께 싣는다: 생성 페이지의 css/site.css 에는 지문이 없어 배포 직후 옛 css 와 만나면 그림이 깨진다. 색 두 개는 dataviz 검사(색약 · 대비) 통과 |
| 2026-10-16 | Claude Code 웹 | AC값 페이지에 "AC값과 1등 당첨자 수" — 88회(1게임 1,000원) 이후 회차마다 판매 게임 수 ÷ 8,145,060 으로 무작위였다면 나왔을 1등 인원(기대 인원)을 어림해 실제 인원과 견줬다. 표: AC 0 |
| 2026-10-14 | Claude Code 웹 | 홈 사용법 둘러보기 + AC값 페이지 설명 + css · js 지문 — ① 홈 "이번 번호" 칸 오른쪽 위 사용법 보기(js/tour.js, 홈만): 디테일크롭의 "How it works" 와 같은 방식 — 화면을 어둡게 하고 생성기의 한 부분씩 테두리로 비추며 옆(오른쪽 → 왼쪽 → 아래 → 위)에 설명 상자, "1 / 7" · 건너뛰기 · 다음 · 시작하기. 단계: 번호 생성 · 5게임 → 막대 둘(직전 당첨 조합 제외 · AC값) → 생성 과정 로그 → 번호판(고정 → 제외 → 해제) → 내 설정 저장 · 불러오기 · 선택 초기화 → 배제할 특수 패턴(당첨 확률은 같다는 말까지) → 생성 이력. 단계마다 그 부분을 가운데로 굴리고, 굴리거나 창을 바꾸면 따라간다. Esc 로 닫고 초점은 단추로. 저절로 시작하지 않고 한 번도 열지 않은 브라우저에서는 단추가 맥박친다(localStorage 의 lottodraw.tour). 어두운 막은 누르기를 막지 않는다. z-index 98(채팅 95 위, 로그인 창 100 아래). 단추는 칸 위에 띄워(absolute) 제목 줄 · 칸 높이가 그대로 — 처음에 제목 옆에 두었더니 휴대폰 · 768px 에서 31~58px 밀렸다. ② AC값 통계 페이지: 표에 예시 칸(그 값이 나온 가장 최근 회차, 당첨번호에 없는 AC 0 · 1 은 1 2 3 4 5 6 · 1 2 3 4 5 7), 표 아래 AC값 읽는 법(가장 최근 회차로 15쌍 차이 → 서로 다른 값 → 5 빼기, 5를 빼는 까닭, 낮음 · 높음의 뜻). 휴대폰에서 "AC 0" · 제목이 쪼개지지 않게. ③ 배포 직후 홈에 "gen.acValN" 이 그대로 보였다 — 새 index.html 이 브라우저에 10분 쥐어진 옛 js/i18n-dict.js · css/site.css 를 만났다. tools/asset-version.js 가 손 관리 페이지 11곳의 css · js 주소에 내용 지문(?v= 8자리)을 붙인다(build-static-stats.js 끝에서 부른다, 생성 페이지는 그대로) |
| 2026-10-14 | Claude Code 웹 | 번호 생성기 AC값 조건 (로그인 기능) + AC값 페이지 안내 + 채팅 창 낮춤 — ① "직전 당첨 조합 제외" 아래 AC값 막대(끔 · 6cleanGen 이 0~10 으로 다듬음). 잠금 · 덮개 · 이름은 직전 당첨 조합 제외와 같다. 생성 칸이 25px 높아짐(1366×768 466 → 491px). ② AC값 통계 페이지 표에 이론 확률(8,145,060조합을 AC값별로 센 비율 — AC 8 32.9% · 9 19.8% · 10 18.5%) 줄과 "AC 8·10이 자주 나오는 것은 그런 조합이 원래 많기 때문, 1등 확률은 어느 조합이든 같다" 문장, AC값 조건으로 번호 뽑으러 가기 단추(index.html#gen-ac — 번호 생성 단추까지 보이게 띄우고 그 줄을 잠깐 밝힘). ③ PC 채팅 창 높이 480 → 400px |
| 2026-10-14 | Claude Code 웹 | PC 는 채팅 창을 펼친 채로 시작 — 폭 900px 이상 + 마우스인 화면은 처음부터 오른쪽 아래 채팅 창이 열려 있다. 닫으면 그 기기에서는 다음에도 닫힌 채(다시 열면 다시 펼침), 저절로 열 때는 입력칸으로 초점을 옮기지 않는다(예전에는 열어 둔 채로 페이지를 옮기면 초점이 채팅 입력칸으로 갔다). 휴대폰 · 태블릿은 그대로 접어 두고 시작. 채팅 연결 제한을 로그인과 나눠 쓰던 1분 10번에서 채팅 전용 CHAT_LIMIT 1분 30번으로(PC 는 페이지마다 다시 붙는다). 1366×768 에서는 열린 창(340×480)이 오른쪽 카드 일부를 가린다 |
| 2026-10-14 | Claude Code 웹 | 채팅 "n명 접속"을 사람 수로 — 예전에는 채팅 창을 연 탭(WebSocket) 수라 혼자 탭 셋을 열면 "3명 접속"이었다. 이제 같은 계정은 한 명, 로그인 전이면 같은 브라우저(무작위 번호 lottodraw.chat.vid → 연결 주소 ?v=)를 한 명으로 센다. 서버(worker/src/chat.js online())는 번호를 소켓에만 붙여 두고 저장하지 않는다. 다른 기기에서 같은 계정으로 로그인하면 합쳐져 줄고 모두에게 알린다. 번호 없는 옛 화면은 탭마다 한 명이라 화면 · 서버 배포 순서가 어긋나도 괜찮다. 서버 시험 54개 통과(접속 수 시험 추가 — 예전 코드에서는 실패 확인), 브라우저 시험(같은 브라우저 탭은 같은 번호 · 다른 브라우저는 다른 번호 · 저장소가 막혀도 동작). 개인정보 처리방침 1번에 한 문장(채팅을 열면 무작위 번호를 보내고 서버는 보관하지 않음), 시행일 2026-10-14 |
| 2026-10-13 | Claude Code 웹 | TOP 50 그래프 로그인 안내 상자 다시 씀 — 제목 "로그인하면 그래프를 무료로 볼 수 있습니다" → "구글 로그인하고 무료로 이용하기", 둘째 줄 "구글 계정으로 바로 가입" 대신 로그인하면 쓸 수 있는 것 목록(✓ 4줄 — 로그인 창과 같은 문장: TOP 50 회차별 당첨금 그래프 보기 · 5게임 동시 생성 · 당첨 조합 제외 · 설정 저장 · ♥ 좋아요 · $ 대박 기원 남기기 · 실시간 채팅 · 블로그 댓글 · 랭킹), 단추 "로그인하고 그래프 보기" → "Google 로그인". 로그인 창 목록에도 생성기 줄(acct.perkGen)을 더했다. 상자 높이 208px(390px 이하는 생성기 줄이 두 줄이라 227 |
| 2026-10-13 | Claude Code 웹 | 판매 마감 · 추첨 방송까지 남은 시간 (모든 페이지) — js/draw-countdown.js 가 1초마다 센다. ① 홈: 첫 화면 제목 줄 오른쪽 상자 "제1246회 10월 17일(토) │ 판매 마감까지 오후 8:00 4일 03:00:00 │ 추첨 방송까지 오후 8:35 · MBC 4일 03:35:00". PC(900px 이상)는 상자 높이 49px 로 제목 + 부제보다 낮아 첫 구간 높이 그대로(1366×768 · 1920×1080 등 생성 칸 위치 변화 0px), 600shell() 에 넣고 다시 생성(회차 1245쪽 · 통계 · 블로그 등 1277쪽, 사이트맵 변화 없음). ③ 판매: 마감까지 → 토 20:00 "판매 마감"(회색) → 방송 뒤 "판매 시작까지"(일 06:00). 방송: 시작부터 10분 "지금 방송 중"(빨강) → 다음 회차. ④ 편성이 바뀐 회차(스포츠 중계 등)는 SPECIAL 에 방송 시각을 적는다. 영어는 KST 표기. 서울 · 뉴욕 · LA · 키리티마티 시간대, 상태 경계(19:59:59 · 20:00 · 20:35 · 20:45 · 일 05:59:59 · 06:00 · 연말)와 편성 변경 회차를 시험. 320 |
| 2026-10-13 | Claude Code 웹 | 랭킹 구조 고침 — 회원이 늘어도 랭킹 한 번에 읽는 양이 같게 — 예전에는 랭킹(/api/ranking, 랭킹 · 마이페이지)을 볼 때마다 회원 기록을 다 읽었다: 회원 n명이면 한 번에 n행이라 무료 요금제 하루 읽기 500만 행을 회원 1,000명이면 랭킹 5,000번에 다 쓰고(그러면 로그인 · 좋아요도 멈춤), 5,000명이 넘으면 나머지는 순위에서 빠졌다. 이제 랭킹 색인(b:)을 회원 기록과 함께 맞추고 Community 메모리에 점수 순 줄을 들고 센다 — 로그인하지 않은 랭킹은 0행, 내 순위는 내 기록 1행, 다시 뜰 때만 별명 있는 회원 수만큼. 화면 · API 응답은 그대로. 시험 53개 통과(랭킹 색인 시험 2개 추가 — 무작위 1,200번 바꾸며 다시 뜨기 · 색인 없던 때까지 예전 방식과 같은지). 관리자 회원 명부는 아직 2,000명까지만 보인다 |
| 2026-10-12 | Claude Code 웹 | 휴대폰 "출력"이 홈 전체를 찍던 것 + 번호 공유 단추 — ① 안드로이드에서 생성 이력 "출력"을 누르면 홈 전체(8쪽)가 인쇄 미리보기에 나왔다. 안드로이드 크롬은 window.print() 가 곧바로 돌아오며 beforeprint · afterprint 를 먼저 보내고, 시스템 인쇄 창이 미리보기를 그릴 때 beforeprint 를 다시 보낸다 — afterprint 에서 출력 상태를 풀어 두어 두 번째 beforeprint 가 종이 대신 홈을 찍게 했다. 이제 출력 상태는 인쇄 창을 닫고 페이지를 다시 만질 때(누르기 · 키) 푼다. 이 순서를 흉내 낸 시험: 고치기 전 7쪽(홈) → 고친 뒤 1쪽(종이), 페이지를 누른 뒤 그냥 인쇄는 평소 화면. ② 생성 이력 아래 공유 단추(휴대폰 공유 창 — 카카오톡 · 문자 등, "내 로또 6/45 번호 n조합 (날짜)" + 번호 줄 + 사이트 주소. 기능이 없는 PC 브라우저는 숨김, 막히면 복사로 대신). 단추 넷이 휴대폰 한 줄에 들도록 "번호 복사" → "복사", 누른 뒤 표시 "복사됨" · "복사 실패" → "완료" · "실패"(영어 Copy · Done · Error), 339px 이하는 여백을 더 줄임 — 320~1366px(한 · 영) 바닥 줄 30px 한 줄 |
| 2026-10-12 | Claude Code 웹 | 생성기 잠금 문구를 짧게 — 로그인 창 이유 칸을 문장 대신 "5게임 동시 생성, 로그인 전용" · "직전 당첨 조합 제외, 로그인 전용" · "내 설정 저장 · 불러오기, 로그인 전용"(영어 "Members only: …")으로. 휴대폰 390px 에서도 한 줄. "로그인 기능" 대신 "로그인 전용" — 로그인 창 안이라 "로그인 기능"은 로그인하는 기능으로도 읽힌다. 다른 곳(좋아요 · 댓글 · 채팅 · 그래프)의 이유 문장은 그대로 |
| 2026-10-12 | Claude Code 웹 | 로그인 안내 문구 · 정렬 — 생성기 회원 기능의 잠금 문장을 "…은 로그인하면 쓸 수 있습니다" → "…은 로그인 이후에 사용 가능합니다"로(5게임 · 직전 당첨 조합 제외 · 내 설정 저장, 막대 덮개 이름도). 로그인 창의 한 줄 "로그인하여 100% 즐기기"는 가운데 정렬(체험이 켜졌을 때의 긴 안내는 그대로 왼쪽). 로그인 창 이유 칸은 낱말 사이에서만 줄을 바꾼다(390px 에서 "사용 가 / 능합니다"로 끊기던 것) |
| 2026-10-12 | Claude Code 웹 | 홈 생성 이력에 "초기화" 단추 — 생성 이력 아래 단추 줄 맨 앞(초기화 · 번호 복사 · 출력). 누르면 "오늘 생성 이력 n조합과 생성 횟수를 지웁니다. 되돌릴 수 없습니다"를 한 번 묻고, 오늘 이력과 "오늘 n회 생성"을 0으로. 지난날 이력 · 횟수 칸(날마다 쌓이기만 하던 것)도 함께 치운다. 이력이 없으면 꺼짐, 지운 뒤 초점은 카드 제목, 화면 읽기 프로그램에 "생성 이력을 지웠습니다". 379px 이하는 단추 좌우 여백을 줄여 320px(한 · 영)에서도 한 줄 |
| 2026-10-11 | Claude Code 웹 | 사이트 정의를 "로또 데이터 플랫폼"으로 — 구글 AI 요약이 사이트를 "특수 패턴을 거르는 번호 생성기"로만 소개하던 것. ① 모든 페이지 머리글 문구를 "당첨번호부터 통계·당첨금까지, 로또 데이터 플랫폼"으로(휴대폰에서도 한 줄) ② 홈 설명 · 통계 칸 아래 안내 문단 첫 문장을 "lottodraw.kr은 로또 데이터 플랫폼입니다"로, 안내 목록("통계와 기능 자세히 보기")에 역대 당첨금 TOP 50 · 실수령액 계산기 · 블로그 추가 ③ 홈 구조화 데이터 WebSite.description 에 기능 전체 ④ About 제목 · 설명 · 첫 문단을 고치고 주요 기능 목록 9줄 추가(FAQ 의 실수령액 · TOP 50 · 통계는 목록으로 옮김), 사이트맵 About lastmod 2026-10-11. 홈 제목은 "로또 통계" 검색어 때문에 그대로 → 4-4번 |
| 2026-10-11 | Claude Code 웹 | 번호 생성기 회원 기능 3가지 (로그인하면) — ① "번호 생성" 옆 5게임(용지 한 장 A~E 한 번에), ② 단추 아래 직전 당첨 조합 제외 끌기 막대(끔 ~ 100회 · 전체, 당첨번호 6개 묶음과 똑같은 조합만 뺀다 — 보너스 제외. 겹칠 확률은 아주 작아 당첨 확률은 그대로), ③ 내 설정 저장 · 불러오기(고정수 · 제외수 · 패턴 · 막대 칸을 계정에 — 서버 POST /api/me/generator, 시험 추가). 잠기면 자물쇠 표시(글자 띠는 단추 줄을 넘겨 아이콘으로), 누르면 로그인 창. 이용권이 있으면 ①② 열림, 서버 로그인이 꺼져 있으면 모두 열림(③ 숨김). 1366×768 생성 줄 436 → 470px(막대 한 줄). 개인정보 처리방침 4번에 저장하는 설정 항목 추가 |
| 2026-10-11 | Claude Code 웹 | 가입 무료 체험 끔 — 무료로 볼 수 있는 것이 이미 많아 처음 가입한 계정에 이용권 기능을 3일 열어 주던 체험 키를 더 주지 않는다. 서버: 체험은 비밀값 SIGNUP_TRIAL_DAYS 를 넣을 때만(기본 끔, /api/config 의 trialDays 0), 새 가입은 텔레그램 "새 가입" 알림만, 체험 재수령을 막던 계정 해시(t:)는 로그인 때 지움, 관리자 상태에 "가입 무료 체험 꺼짐(지금까지 n건)". 이미 받은 체험 키는 기간까지 그대로. 화면: 로그인 창("로그인하여 100% 즐기기" + 그래프 보기 · ♥ 좋아요 · $ 대박 기원 남기기 · 채팅·댓글·랭킹 — 같은 날 문구 고침), 내 계정 메뉴 · 마이페이지의 체험 줄은 받은 회원에게만, 탈퇴 확인 문장. 이용약관(7조 무료 체험 · 제한) · 개인정보 처리방침(4번 목적 · 보관) 시행일 2026-10-11 로 고침. 서버 시험 50개 통과(체험 끔 시험 추가) |
| 2026-10-11 | Claude Code 웹 | TOP 50 그래프 로그인 안내 문구 줄임 — 흐린 그래프 위 안내의 둘째 줄을 "구글 계정으로 바로 가입"으로("처음 가입하면 3일 동안 보조지표·그림도구까지 열립니다" 뺌, 영어 "Sign up instantly with Google"). 첫 줄 "로그인하면 그래프를 무료로 볼 수 있습니다"는 그대로 |
| 2026-10-11 | Claude Code 웹 | TOP 50 그래프: 그림도구로 두 번 클릭하면 전체 기간으로 튀던 것 — 수평선 · 추세선 도구에서 같은 자리를 두 번 클릭하면 첫 클릭이 선을 긋고(추세선은 같은 회차라 취소) 도구를 꺼서, 뒤따르는 dblclick 이 "두 번 클릭 = 전체 기간"으로 보던 구간을 바꿨다(예전부터 있던 문제). 그림도구가 받은 마지막 클릭에서 0.8초 안의 dblclick 은 무시한다. PC 마우스 · 휴대폰 톡톡 모두 확인, 도구 없이 두 번 클릭하면 그대로 전체 기간 |
| 2026-10-11 | Claude Code 웹 | 홈 출력은 생성 이력만 + 최저임금 선을 직선으로 — ① "출력"을 누르면 홈 전체가 찍히던 것: 인쇄 규칙을 index.html 안 <style> 로 옮기고(배포 직후 옛 site.css 를 쥔 브라우저에는 인쇄 규칙이 없었다), 인쇄 상태(body.is-printing)를 afterprint 에 풀지 않고 단추 없이 시작한 다음 인쇄의 beforeprint 에서 풀게(인쇄 화면을 그리기 전에 afterprint 를 보내는 브라우저 대비). 종이 제목은 "로또 6/45 생성 이력". PDF 로 확인: 단추 → 종이 1쪽, 그 뒤 Ctrl+P → 홈 7쪽, 다시 단추 → 종이 1쪽(한 · 영). ② TOP 50 그래프의 최저임금 선을 계단 대신 직선으로 — 해마다 금액을 그 기간 가운데 날짜에 두고 잇는다. 숫자(정보창 · n년치 · 꼬리표 · 요약)는 그 회차 날짜의 실제 금액 그대로, 안내 문장에 "실제로는 해가 바뀔 때 한 번에 오른다" |
| 2026-10-11 | Claude Code 웹 | 홈 번호 생성기: 과정 로그를 생성 칸으로 + 번호 복사 · 출력 + 두 카드 높이 맞춤 — ① "생성 과정 로그"를 생성 이력 카드 맨 아래에서 번호 생성 칸("번호 생성" 단추 아래)으로 옮겼다. PC 는 결과 칸이 옆 카드만큼 늘어나 비어 있던 자리를 쓰고(제목 + 5줄 자리를 잡아 단추가 움직이지 않음), 휴대폰은 단추 아래로 늘어난다. 카드 이름은 "생성 이력"으로. 결과 문장 자리도 두 줄을 잡아 첫 생성 때 단추가 3 |
| 2026-10-11 | Claude Code 웹 | TOP 50 그래프: 2·3등 ↔ 최저임금 비교 + 정보창 높이 고정 — ① 비교 줄에 "최저임금" 단추: 2등 1게임당은 최저임금 연봉(시급 × 209시간 × 12), 3등은 월급과 견준다(새 파일 min-wage.json, 2002-09 2,275원 ~ 2027년 10,700원 — 최저임금위원회 · 고용노동부 고시를 기사 · KDI 자료로 확인). 그 회차 날짜에 적용되던 해의 금액이라 2002 |
| 2026-10-11 | Claude Code 웹 | TOP 50 표에 최근 50회 — 1등 · 2등 표 위에 [당첨금 순위 | 최근 50회] 단추를 달아 최신 회차부터 50회를 바로 볼 수 있게 했다(전체 조회 페이지와 겹치지만 당첨금만 모아 보기 편하게). 1등 최근 50회는 회차 · 추첨일 · 1인당(만 원 단위) · 당첨자 수 · 총 1등 당첨금, 2등은 회차 · 추첨일 · 1게임당 · 당첨 게임 수 · 2등 총 당첨금. 안내 문장: 1등 최근 50회 평균 21억 4,881만 원(전체 26억 5,826만 원), 최고 1208회 · 최저 1233회 / 2등 평균 5,711만 원(88회 이후 5,695만 원), 최고 1208회 · 최저 1210회. 단추를 누르면 제목도 "최근 50회 1등 당첨금" · "최근 50회 2등 당첨금"으로 바뀐다(영어 Top 50 / Latest 50). 생성기가 표를 미리 박아 둔다(이월 · 2등 집계 중 회차 처리, 같은 자료로 두 번 돌려도 바뀌지 않음 확인). 휴대폰(360px)에서 표 칸 글자가 한 글자씩 끊기던 것(순위 표도 같았다)을 네 표 모두 한 줄로 두고 표만 옆으로 밀게 고쳤다. 설명(meta)에 "최근 50회 1·2등 당첨금도 함께" |
| 2026-10-11 | Claude Code 웹 | 홈 생성 이력 · 보렐 카드 펼침 + 쪽 넘김, 통계 순서 — ① 휴대폰에서 두 카드 본문이 6vh(두세 줄)로 묶여 안에서 스크롤되던 것을 풀어 끝까지 펼쳐 보이게 했다. PC 도 펼친다(한 쪽 5개). 대신 첫 구간이 길어진다 — 1366×768 에서 651px → 793px(이력 없음) · 930px(이력 5개 넘음)로, "아래에 전 회차 통계 12종" 안내가 첫 화면 밖으로 내려간다. 1920×1080 은 약 970px. ② 생성 이력은 카드 안에서 쪽을 넘긴다 — 한 쪽에 PC 5개 · 휴대폰 10개(최근 것이 1쪽, 새로 뽑으면 1쪽으로). 오늘 이력 보관을 20개 → 100개로. 과정 로그도 같은 크기로(처음엔 마지막 쪽 — 고른 번호가 있는 쪽). ③ 통계 카드에서 홀짝 · 저고 비율을 3·4번 → 9·10번(미출수 다음)으로 — 둘은 2·3·4칸 격자 어디서나 한 줄에 나란히. 5개월 통계(표본이 적어 미출수 카드가 없다)는 8. AC값 · 9. 홀짝 · 10. 저고로 두어 역시 한 줄에 — statistics.html 잠금 미리보기도 같은 순서로 고쳤다. 홈 "통계별 자세히 보기" · 통계 페이지의 "다른 로또 통계" · 사이트맵 순서도 같게(STATS_ORDER). 5개월 통계(같은 그림 코드)도 같은 순서 |
| 2026-10-11 | Claude Code 웹 | TOP 50 그래프 오른쪽까지 채움 — 오른쪽에 따로 두던 꼬리표 칸(그래프 밖 흰 여백)을 없애고 그래프 영역(가로줄 · 바닥선)을 오른쪽 끝까지 넓혔다. 마지막 값 꼬리표(파랑 · 회색 · 주황 · 자주)는 그래프 안에 두되, 선 · 봉 · 이동평균은 꼬리표 띠(꼬리표 폭 + 10px)만큼 앞에서 끝나고 그 자리에서 잘리므로 꼬리표가 데이터를 가리지 않는다(끝 점과 꼬리표 사이 7px). PC · 휴대폰 모두. 아래 작은 그래프도 같은 폭(양 끝 손잡이가 잘리지 않게 좌우 5px 남김) |
| 2026-10-10 | Claude Code 웹 | 2등·3등 당첨금 확장 — ① 새 페이지 statistics-prize-2-3.html(88회 이후 평균 5,695만 원 · 145만 원, 최고 255회 · 최저 1057회, 2·3등 총액이 늘 같음(차이 최대 4,458원 — 1게임당 금액을 원 단위로 끊은 자투리), 400회까지는 1·2·3·4등 60·10·10·20%, 판매액으로 어림한 2등 게임 수 대비 실제(전체 1.00배, 1057회 8.0배), 연도별 평균(판매액 2.3배에도 2등은 그대로), 기록, 세금, 받는 곳) — 홈 목록 · 사이트맵 · 회차 1,245쪽 · TOP 50 · 확률 · 1등 당첨자 수에서 링크. ② tax.html 에 2·3등 실수령액 표(seo:tax-tiers)와 설명(meta). ③ 블로그 16번째 글 "로또 2등·3등 당첨금은 얼마일까"(한·영), 02(3등이 200만 원을 넘은 적은 88회 이후 없음 — 91회 1,982,242원이 최고) · 04(1057회 2등 689만 5,880원, 어림 83게임의 8배) 고침, 관련 페이지 이름 prize-tiers. ④ TOP 50 그래프 지표에 "2·3등 1게임당" 줄(지표 상자 두 줄은 subgrid 로 이름 칸을 맞춤), 영문 금액이 "1m" 으로 뭉개지지 않게(1,000만 원 아래는 소수 둘째 자리). 휴대폰(360px)에서 새 표들이 옆으로 밀리지 않게 확인 |
| 2026-10-10 | Claude Code 웹 | 탭 아이콘(파비콘) 추가 — 그동안 없어서 브라우저 탭에 기본 지구본이 떴다. favicon.svg(남색 바탕 · 노란 공 · 선으로 그린 7, 글꼴 없이) · favicon.ico(16/32/48) · apple-touch-icon.png(180), 모든 페이지 머리말에 연결 |
| 2026-10-10 | Claude Code 웹 | 2~5등 당첨금 · 판매액 수집 + 회차 페이지 등수별 표 + 2등 TOP 50 — Actions 로그로 동행복권 응답에 1회부터 rnk2~5WnNope/WnAmt · wholEpsdSumNtslAmt 가 있음을 확인(1057회 2등 664게임 6,895,880원 등 일치). 수집기가 prize-data.json 에 저장(일회용 워크플로로 전 회차 채움), 정기 워크플로가 커밋. 회차 페이지 1,245쪽에 등수별 당첨금 표(세후는 지금 세법, 2022년까지 과세 기준이 달랐다는 안내, 1~87회는 1게임 2,000원 안내)와 총 판매액, 설명(meta)에 2등. 사이트맵의 옛 회차 lastmod 를 표를 넣은 날(2026-10-10)로. top-prize.html 1등 표 아래 2등 TOP 50 |
| 2026-10-10 | Claude Code 웹 | TOP 50 그래프 무료/이용권 다시 나눔 — 이용권으로 잠금: 물가 반영 · 세후 · 강남3구 아파트값 비교 · 20회 이평. 무료로 열기: 구간 설정 전체(최근 50/100/300회·전체 · 확대·축소 · 휠·끌기·두 손가락 · 아래 작은 그래프 · +/- 키). 무료 처음 화면은 당시 금액 · 세전 · 240회 이평, 이용권은 물가 반영 + 20 · 240회 이평. 서울 아파트 비교의 "몇 채" · "평균가 이상 n회"는 보이는 선 기준(세전이면 세전)으로. 5개월 통계 이용권 카드 문구도 바꿈 |
| 2026-10-09 | Claude Code 웹 | 휴대폰 그래프를 왼쪽 끝까지: 좁은 화면(그래프 폭 600px 미만)은 세로축 눈금 칸을 따로 두지 않고, 눈금 글자를 그래프 안 왼쪽 가로줄 위에 흰 테두리 글자로 겹쳐 그린다(0 은 바닥선이라 뺌). 짚은 값 꼬리표도 그래프 안 왼쪽. 폭 350px 화면에서 그래프 영역 약 233 → 296px. PC 는 그대로 |
| 2026-10-09 | Claude Code 웹 | TOP 50 그래프 제목 줄: 오른쪽 "접기 ▲" 단추 대신 제목 뒤에 "(클릭하여 접기)" / 접히면 "(클릭하여 열기)". 제목 아래 설명 문단("가로는 회차, 세로는 고른 지표입니다…") 삭제 — 보면 안다 |
| 2026-10-09 | Claude Code 웹 | 많이 나온 번호 순위 공 그림: 짚으면 하이라이트 — 공에 마우스를 올리면(휴대폰은 누르면) 밝게 · 조금 크게 · 노란 빛 테두리, 나머지 공은 옅게, 공 위에 "34번 · 187회"(영어 "No. 34 · 187×") 이름표를 바로 띄운다(늦게 뜨던 기본 툴팁은 뺌). js/dist-balls.js 새로, 생성기가 공에 data-n · data-c 를 달고 공 그림이 있는 통계 페이지에 스크립트를 넣는다. About 미리 보기도 같다 |
| 2026-10-09 | Claude Code 웹 | TOP 50 그래프를 접는 상자로(처음엔 펼침, 제목 줄 "접기 ▲ / 펼치기 ▼") — 그래프 기능이 늘며 표가 계속 밀려 보기 어려웠다. 한 번 누르면 표 제목이 PC 약 1,311px → 325px. 5개월 통계(결제 페이지)·실수령액 계산으로 옮기는 안과, 표를 숨기는 "표 |
| 2026-10-09 | Claude Code 웹 | 그래프 설명 문단(물가 반영 · 봉 · 세후 · 아파트)을 도구 상자 아래로 — 주의 · 출처 바로 앞. 그래프 밑에 있으면 길어질 때 도구 상자가 그래프에서 멀어져 보기 어려웠다 |
| 2026-10-09 | Claude Code 웹 | 강남 비교를 강남3구(강남 · 서초 · 송파) 평균으로: 구마다 ㎡당 평균가 × 84㎡(+ 2013-03 이전은 구 지수로 추정)를 만들어 달마다 단순 평균(아파트 수 가중치는 KB 자료에 없음). 단추 "강남3구 아파트값", 이름표 "강남3구 84㎡". 다른 모양의 gangnam(예전 강남 권역 · 강남구 단독)은 단추를 숨긴다 |
| 2026-10-09 | Claude Code 웹 | 강남 비교를 강남구 단독으로: "강남"을 한강 이남 11개 구로 보는 사람은 없어서 바꿈. KB 평균가 자료에는 구 단위가 없지만 ㎡당 평균 매매가(avgPrcPerSqmt?지역코드=11)에는 25개 구가 있어 강남구 ㎡당 × 84㎡(전용, 국민평형) = "강남구 84㎡ 아파트값"(KB 도 국평 평균가를 이렇게 발표, 서울 평균가도 ㎡당의 약 83배라 비슷한 잣대). 구 단위는 2013-04부터, 그 앞은 강남구 매매가격지수(2002-12부터)로 추정. ㎡당 응답은 값이 날짜보다 1개 적은데, 앞 맞춤이 기사 값(강남구 2025-04 · 2025-12 · 2026-04, 서초 · 송파 2025-12)과 맞아 그렇게 맞춘다. 버튼 "강남구 아파트값", 범례 점선은 서울 · 강남구 추정 달을 따로 적는다. 다른 출처(부동산원 R-ONE, 국토부 실거래가)는 키가 필요해 보류 |
| 2026-10-09 | Claude Code 웹 | 그래프 정보창: PC 도 떠 있는 툴팁을 없애고, 휴대폰처럼 그래프 위 고정 칸에 짚은 회차 정보(회차·날짜·번호·값, 비교·이평·봉 값)를 보인다. 넓은 화면은 금액을 길게('17억 8,694만 원'), 칸 높이를 미리 잡아(PC 3줄) 마우스를 움직여도 그래프가 밀리지 않는다. 처음 화면은 다시 선 그래프(월봉은 그대로 무료). TOP 50 표 열 이름 "총 1등 당첨금 (정확)" → "총 1등 당첨금" |
| 2026-10-09 | Claude Code 웹 | 비교: 강남 아파트 평균가 추가(KB 권역 "강남11개구" = 한강 이남 11개 구, 자주색 #a0219a — 파랑·주황·회색과 색각 이상에서도 갈림). KB 평균가 자료는 지역 25개(권역 · 시도)뿐이라 강남구 단독은 없다. 2008-12 이전은 같은 권역 지수로 추정. 요약 줄 "세후로 강남 11개 구 아파트 평균가 이상 n회 / m회", 툴팁 "세후로 몇 채". 월봉을 무료로 열고 처음 화면을 월봉으로(분기봉 · 연봉은 이용권) |
| 2026-10-09 | Claude Code 웹 | 서울 아파트 비교를 켰을 때 세로축을 자르던 것(60억 위 ▲) 삭제 — 큰 당첨금이 안 보여 읽기 어려웠다. 기본 화면과 같은 세로축으로 그린다 |
| 2026-10-09 | Claude Code 웹 | TOP 50 그래프 봉 차트(이용권): "봉 차트 [선 · 월봉 · 분기봉 · 연봉]" 줄. 회차를 달·분기·해로 묶어 시가(첫 회차) · 고가 · 저가 · 종가(마지막 회차), 이월 회차는 건너뜀, 오름 빨강 · 내림 파랑, 물가 반영·세후 기준을 따름. 짚으면 그 봉의 "시 · 고 · 저 · 종", 아래 설명 줄에 "봉 색은 흐름을 뜻하지 않는다". 결제 페이지 이용권 줄에도 봉 차트. 세로축 눈금을 왼쪽으로, 마지막 값 꼬리표만 선 끝 오른쪽에 두고 이동평균 끝값 꼬리표 삭제(겹쳐서 읽히지 않았다). candles() 시험 |
| 2026-10-09 | Claude Code 웹 | About 그림 칸을 **"자료를 둘러보며 로또를 즐겨 보세요"**로 가볍게(첫 줄 "… lottodraw.kr을 통해 로또를 더 깊이 있게 즐겨 보세요."): 정규분포·σ 설명을 빼고 "번호마다 몇 번씩 나왔을까요?" · "당첨번호 6개를 더하면 얼마일까요?" 두 그림 맛보기와 더 둘러보기 링크(통계 12가지 · 회차별 당첨번호 · TOP 50 그래프 · 블로그)만 |
| 2026-10-09 | Claude Code 웹 | 랭킹 표에서 출석 칸 삭제 — 순위 · 별명 · 점수만. 내 순위 줄의 점수 내역(출석 · 반응 · 이용권)과 점수 쌓는 방법 안내는 그대로 |
| 2026-10-09 | Claude Code 웹 | 머리글 로그인 단추의 "3일 무료" 배지 삭제("사이트가 3일만 무료"로 읽히던 오해) — 단추는 "로그인"만. 체험 안내는 로그인 창 안에서만: 첫 문장 "가입과 로그인은 무료 … 3일이 지나도 무료 기능은 그대로". 휴대폰 머리글을 줄바꿈 가능한 한 줄 배치로 바꿔 좁은 화면(320px)·영어에서 랭킹 단추가 언어 단추를 덮던 문제도 고침 |
| 2026-10-09 | Claude Code 웹 | About 에 통계 그림 미리 보기: 많이 나온 번호 순위(공 하나 = 번호 하나)와 번호 합계(막대 실제 · 곡선 이론)의 정규분포 그림을 통계 페이지와 같은 그림으로 옮겨 싣고, 평균 ±1σ·±2σ 읽는 법과 "조합 하나하나의 확률은 같다"를 짧게. build-static-stats.js 의 updateAbout() 가 매주 숫자와 함께 다시 만들고, 주간 워크플로가 about.html 도 커밋 |
| 2026-10-09 | Claude Code 웹 | TOP 50 그래프에 세금(세전/세후) 줄과 비교: 서울 아파트 평균가(KB부동산 월간 주택가격동향, seoul-apt.json). 수집기 tools/update-seoul-apt.js + update-seoul-apt.yml(매월 1·16일, 키 없음). 2008-12 이전은 KB 서울 아파트 매매가격지수로 거꾸로 환산한 추정(점선). 아파트를 켜면 1인당 당첨금 · 세후로 바뀌고, 튀는 회차(19회 407억 등) 때문에 비교가 안 보이지 않게 세로축을 위에서 잘라 ▲ 표시. 툴팁에 세전 · 그 달 아파트 평균 · "세후로 몇 채". 색은 주황 #e8710a(파랑·회색과 색각 이상에서도 갈림, validate_palette.js) |
| 2026-10-09 | Claude Code 웹 | TOP 50 그래프 조작감 · 축 꼬리표(거래소 차트처럼): 세로축을 오른쪽으로, 마지막 값(파란)·이동평균 끝값(테두리 색) 꼬리표, 짚으면 점선 십자선 + 가로축 회차·세로축 값 꼬리표. 이용권: 마우스 휠 확대·축소(커서 자리 고정, 페이지를 굴리던 중이거나 더 못 넓히면 페이지가 굴러감), 끌어 옮기기, 가로 휠 옮기기, 두 번 클릭 전체 기간, 휴대폰 두 손가락 확대·옮기기, 확대해 있으면 옆으로 밀어 옮기기, 길게 누른 채 밀어 값 보기, ←→ 키가 구간 끝을 넘으면 구간도 따라감. 도구 상자 아래에 조작법 한 줄. 끌어서 확대(상자 선택)는 끌어 옮기기로 바뀜. 표로 보기 삭제(아래 TOP 50 표가 있음). 물가 반영 색 바꿈: 파란 선(면)은 늘 당시 금액, 회색 선이 지금 돈 가치(요약·이동평균은 지금 돈 가치 기준) |
| 2026-10-09 | Claude Code 웹 | 블로그 글 공유 단추(js/share.js): 글 15편 본문 끝(관련 페이지 위)에 '이 글 공유하기' 줄 — 휴대폰은 '공유하기 (카톡 등)'로 기기 공유 창, 어디서나 링크 복사 · X · 페이스북 · 네이버 · 밴드. 영어 화면에서는 영어 제목과 ?lang=en 주소로 공유. 카톡 전용 카드는 카카오 앱 키를 받으면 추가 |
| 2026-10-09 | Claude Code 웹 | 그래프 순서: 그래프 위에는 '지표' 상자(단추는 글자 길이만큼)만, 그 아래 그래프 → 요약 줄 → 나머지 도구 상자(금액 기준은 글자 길이만큼, 구간·보조지표·그림도구는 등분) |
| 2026-10-09 | Claude Code 웹 | 마이페이지(mypage.html, js/mypage.js, 계정 메뉴에 링크): 내 정보·이용권(키 보기/복사·다른 기기용 링크)·점수/순위·계정 관리. 그래프 도구를 큰 사각형 하나로: 줄마다 [이름 칸 |
| 2026-10-09 | Claude Code 웹 | 그래프 휴대폰 정보 줄: 좁은 화면에서는 떠 있는 툴팁 대신 그래프 위 고정 칸(2~3줄)에 회차·날짜·번호·값을 짧게 보인다(그래프를 가리지 않음, 높이를 미리 잡아 밀리지 않음). PC 는 그대로 툴팁 |
| 2026-10-09 | Claude Code 웹 | 그래프 구간 설정을 이용권 전용으로: 최근 N회·확대·축소·끌어 확대·작은 그래프를 이용권 칸의 "구간 설정"으로 옮기고 잠금. 이용권이 없으면 늘 전체 기간. 결제 페이지 이용권 줄을 "TOP 50 그래프 구간 설정·보조지표·그림도구"로 |
| 2026-10-09 | Claude Code 웹 | 그래프 아래 출처 줄: "출처: 당첨 기록 동행복권 · 물가지수 OECD 소비자물가지수(한국 통계청 작성) — 매월 7일 자동 갱신, ○월분까지 반영". 출처 이름·링크는 cpi-data.json 이 정한다 |
| 2026-10-09 | Claude Code 웹 | 그래프 "물가 반영": 총 1등·1인당 금액을 최신 물가지수 달의 돈 가치로(금액 × 지수(기준 달) ÷ 지수(그 회차 달)), 당시 금액은 회색 선, 툴팁에 물가 배수, 표에 "지금 돈 가치" 칸. 물가지수는 cpi-data.json — tools/update-cpi.js + update-cpi 워크플로가 매월 받는다 |
| 2026-10-09 | Claude Code 웹 | 회차별 그래프 손질: 점이 촘촘할수록 선을 가늘게(전체 기간 1px), 이동평균·수평선 더 가늘게. 이동평균 5회 빼고 20·60·120·240회. 첫 버튼·첫 화면을 총 1등 당첨금 · 전체 기간으로(지표·기간은 기억하지 않음). 확대·축소(+- 단추, PC에서 끌어 확대, +·− 키, 아래 작은 그래프로 옮기기·넓히기). 짚으면 그 회차 당첨번호도. 로그인하지 않으면 그래프를 흐리게 하고 로그인 안내(이용권 키가 있으면 열림). js/account.js 에 LottoAccount.loginOn()·ready 추가 |
| 2026-10-08 | Claude Code 웹 | TOP 50 페이지 맨 위에 회차별 그래프(js/prize-chart.js): 가로 회차, 세로 1인당 당첨금·당첨자 수·총 1등 당첨금 중 선택, 기간 최근 50/100/300회·전체, 짚거나 ←→ 키로 회차 값 보기, 이월 회차 표시, 요약 한 줄, 표로 보기. 이용권 전용: 평균선·5/20회 이동평균·로그 눈금, 수평선·추세선 그리기(이 브라우저에 저장). 결제 페이지 이용권 4종에 "TOP 50 그래프 보조지표·그림도구" 줄 추가. 이용약관 4조 대상 문구는 그대로 둠 |
| 2026-10-08 | Claude Code 웹 | 관리자 주문 카드에 회원 별명·이메일 표시(무료 체험·로그인 구매) |
| 2026-10-08 | Claude Code 웹 | 블로그 댓글(로그인+별명 회원, 500자, 15초·하루 30개, 링크·연락처·홍보 차단, 내 댓글 지우기, 관리자 지우기·막기, 탈퇴 시 삭제). 약관 7조·개인정보 4번 반영, 시행일 2026-10-08 |
| 2026-10-07 | Claude Code 웹 | 랭킹 이용권 점수 100원당 10점, 랭킹을 계정 단추 옆으로, 휴대폰 메뉴 두 줄·채팅창 작게·내 계정 메뉴 위치 수정. 포인트로 별명 바꾸기(500P), 운영자 계정 지정(랭킹 제외·채팅 표시) |
| 2026-10-07 | Claude Code 웹 | 실시간 채팅(24시간 휘발, 로그인+별명 회원만 쓰기, 링크·연락처·홍보 차단, 3초 제한, 관리자 지우기·채팅 금지). 약관 7조·개인정보 4번에 채팅 반영 |
| 2026-10-07 | Claude Code 웹 | ₩ 원화 반응 추가, 회원 랭킹 페이지(출석·반응·로그인한 채 산 이용권으로 점수, 별명 있는 회원만 공개, 오늘 출석 알림, 내 계정에 내 점수). 개인정보 4번·약관 7조에 랭킹 반영 |
| 2026-10-07 | Claude Code 웹 | 관리자 페이지 회원 명부(별명·이메일·가입·최근 로그인·체험·♥/$ 수, 찾기·별명 지우기·회원 삭제)와 카드별 좋아요 합계. 누른 수는 그대로 누구나 본다 |
| 2026-10-06 | Claude Code 웹 | 좋아요를 카드마다 "+" → ♥/$ 고르기로 바꿈(문구 없이 아이콘+숫자). 별명 정하기·바꾸기(가입 직후 묻기, 겹침·사칭 막기, 탈퇴하면 풀림) |
| 2026-10-06 | Claude Code 웹 | 회원 기능: 구글 로그인(서버가 ID 토큰 확인), 가입하면 3일 무료 체험 키 1회(계정당, 탈퇴 후 1년 재수령 막음), 페이지마다 ♥ 좋아요 · $ 대박 기원, 내 계정 메뉴(체험 기간·로그아웃·탈퇴), 관리자 페이지 가입·체험 수. 저장은 Durable Object(결제 KV 한도 보호). 개인정보 처리방침 4번·이용약관 7조 신설. GOOGLE_CLIENT_ID 를 넣기 전에는 꺼져 있다 |
| 2026-10-05 | Claude Code 웹 | 환불한 키가 계속 열리던 문제 수정: 브라우저가 정지 목록을 12시간마다 받던 것을 5분마다로, 열어 둔 화면도 5분마다·탭으로 돌아올 때 다시 확인해 잠근다. 홈 상세 분석 4종은 이용권이 있어도 저절로 열지 않고 "상세 분석 4종 열기" 버튼으로 연다. 키 메일이 실패하면 텔레그램으로 알림(Resend 가 알려 준 이유 포함) |
| 2026-10-04 | Claude Code 웹 | 토요일 밤 추첨 직후 반영(draw-night 워크플로 + tools/wait-for-draw.js): 지난 3주 회차 페이지가 일요일 05:34update-lotto-data 실행. 네이버·Bing 즉시 색인 요청(IndexNow, tools/indexnow.js + 열쇠 파일). 가짜 시계·가짜 API로 대기 8가지·색인 요청 4가지 상황 시험 |
| 2026-10-02 | Claude Code 웹 | 홈: "혹시 모르죠, 이 번호가 이번 주 당첨번호일 수도 있습니다."를 번호 생성 전부터 보이게. 최근 10회차 "그거 아세요?" 줄의 "곧 나올 차례일까요? →" 링크 제거(사실 한 줄만 남김) |
| 2026-10-02 | Claude Code 웹 | "로또 통계" 검색 점검 (경쟁: superkts.com). 허브 페이지·메뉴 개편안(692f3b5)은 화면이 바뀌어 보류하고 되돌림. 화면은 그대로 두고 top-prize.html 표만 HTML 에 미리 박음(스크린샷 동일 확인). 전략·결정할 것은 4-4번, 머지 뒤 할 일은 7번 맨 위 🔜 다음 스텝 |
| 2026-10-02 | Claude Code 웹 | 홈: '생성 이력'·'보렐의 법칙' 탭 기본 펼침, 최근 10회차 카드에 "그거 아세요?" 사실 한 줄(전 회차 기준 가장 오래 안 나온 번호, 도박사의 오류 글로 연결), 번호 생성 뒤 "혹시 모르죠…" 한 줄. 블로그 '기대값·전망 이론' 글 흥미도 3→1 |
| 2026-10-02 | Claude Code 웹 | 키 메일 발송(Resend) 기능 — 이메일을 적은 주문은 발급 즉시 키를 메일로, 관리자 "키 메일 다시 보내기". 결제 직후 키 칸 강조(키 복사 안내). 개인정보 처리방침에 Resend 위탁 추가. README 다음 할 일 목록 정리 |
| 2026-10-02 | Claude Code 웹 | 실제 입금 시험 통과(1일 이용권 1,500원 → 1분 안에 자동 발급, 텔레그램 알림, 5개월 통계 열림). 주문 연락처는 이메일만 받음 |
| 2026-10-02 | Claude Code 웹 | 판매자 정보(월데코 코리아) 반영. 서명 키 백업 비밀값은 KV 를 잃었을 때만 쓰고, 잘못 넣어도 발급이 멈추지 않게(관리자 페이지에 맞음/다른 키/형식 잘못 표시). 입금 알림은 "입금"이 든 것만 다룬다(카드 승인 등 무시), 카카오뱅크 알림 형식 테스트. 관리자 페이지 서명 키 백업이 휴대폰에서 복사 안 되던 문제(칸에 표시) 수정 |
| 2026-10-02 | Claude Code 웹 | 실서버 점검이 KV 반영 지연(최대 1분)을 기다리게, 점검 알림이 휴대폰 연결 신호로 잡히던 문제 수정. 정가로 입금해도 입금자명이 맞으면 자동 발급. 환불은 중복 결제·작동하지 않음 두 경우만, 메일로 소명자료(문의 페이지 "환불 신청") |
| 2026-10-02 | Claude Code 웹 | 결제 서버 첫 배포(PR #10). 실서버 점검이 "입금 알림 → 자동 매칭"에서 실패 → KV 목록이 최대 1분 늦게 보이는 탓이라 금액 색인(amt:)을 둬서 해결. 환불 규정 개정: 키 발급 뒤 단순 변심 환불 없음, 셀프 환불 버튼 → "환불 문의", 관리자 환불 처리 때 카드 결제 자동 취소 |
| 2026-10-02 | Claude Code 웹 | 블로그 목록 손질: 흥미도(pick)+무작위 순서, 카테고리 단추는 해당 글을 가나다순으로 맨 위에 모으는 애니메이션, 날짜·읽는 시간 표시 제거 |
| 2026-10-02 | Claude 채팅(원고·시안) → Claude Code 웹(적용) | 블로그 탭 추가 — 글 15편(한국어·영어), tools/build-blog.js, 전 페이지 메뉴·꼬리말에 '블로그', 사이트맵 16개, 워크플로가 blog/ 도 커밋, _config.yml 로 원고를 배포에서 제외. 시안 아티팩트와 HTML 일치 확인 |
| 2026-10-01 | Claude (Cowork) | 무인 운영으로 보강: 주문마다 고유 금액 + 휴대폰 입금 알림 연결로 새벽에도 자동 발급, 연결 끊김 지킴이(1시간마다), 구매자 셀프 환불 요청(키 즉시 정지·카드 자동 취소), 배포 직후·매일 아침 실서버 자동 점검 |
| 2026-10-01 | Claude (Cowork) | 결제 대안 전수 조사(토스·카카오·구글플레이·텔레그램·코인 등) → 카드는 업종에서 막힘 확인. 계좌이체 직접 판매 + 서명 이용권 키로 전환: Worker 서버, 주문 화면, 관리자 페이지, 원화 가격, 약관·개인정보 처리방침 개정, 페이앱 카드 연동(승인 대기용), 배포 워크플로 |
| 2026-09-28 | Claude 채팅 | Cloudflare Web Analytics 비콘을 전 페이지(생성 템플릿 + 수동 페이지 8개)에 추가 |
| 2026-09-28 | 집, VS Code | 애드센스 반려 원인 진단(본문 글자 수 실측). Polar 2차 이의신청 제출. 개인정보·약관·문의 3쪽 영어화 |
| 2026-09-28 | 집, VS Code | 영어 전환(KO/EN) 추가 — 주요 6쪽, 통계 카드·상세 분석, 통계 12쪽 본문과 표·차트까지. Polar 이의신청용 |
| 2026-09-27 | 집, VS Code | Polar 연동을 끝까지 진행(상품 4종, 우리은행 정산 계좌, 잠금해제 테스트 통과)했으나 Go live 심사와 이의신청이 모두 거절. 결제 링크를 비활성화하고 대안을 정리 |
| 2026-09-22 | 집, VS Code | README 작성 (인수인계용). Polar 연결 체크리스트 정리 |
| 2026-09-21 | Claude 웹 | 홈 데이터세트 구조화 데이터 보완 (PR #5) |
| 2026-09-27 | 자동(봇) | 1243회차 반영 |
| 2026-09-19 | 자동(봇) | 1242회차 반영 |
| 2026-09-16 | Claude | 월 $4 구독 상품 추가, 상세 분석 4종 홈에 잠금 처리, 검색용 정적 통계 페이지 12종 + 회차별 페이지 생성, 검색 키워드 개편, 라이브리 댓글 제거 |
| 2026-09-15 | Claude 웹 | 홈을 세로 3구간으로 재구성, 통계 3종 추가, ABOUT·실수령액·TOP 50 정리, 개인정보처리방침·이용약관·문의 페이지 정비 (PR #1~#4) |
| 2026-09-14 | Claude | 구조 개편 계획 수립 (260914 클로드 폴더) |
| 2026-05-03 | — | 통계 10종, 메뉴바 수정, 회차 엑셀 → JSON 변환 |
| 2026-02-22 | — | 실수령액 계산, 역대 당첨금액표 |
| 2026-02-08 | — | 통계 페이지 |
| 2026-02-03 ~ 07 | — | 구글 애드센스 요건 대응 (필수 페이지 추가) |
| 2025-12-30 | — | 시작 |
top-prize.html 정적화content/round-notes.md, 지금 23개 — 2026-10-18 9 → 23) — 기록 회차 · 제도가 바뀐 회차부터. 숫자는 당첨 기록으로 확인한 것만 (4-7번)prize-data.json) → tax.html 2·3등 예시METRICS 에 tier 처럼 한 줄씩, 값은 top-prize.html 의 withTiers() 가 붙인다
12-3. [ ] 매년 8월 초: min-wage.json 에 다음 해 최저임금 — 2028년 최저임금이 고시되면(2027-08-05까지) periods 에 { "from": "2028-01-01", "hourly": … } 를 더하고 until 을 2028-12-31 로. 안 하면 2028년 첫 회차부터 그래프의 최저임금 선이 끊긴다(모르는 해는 그리지 않는다). 해마다 같은 일
12-2. [x] /en/ 정적 페이지