디시인사이드 갤러리의 공개 게시글 작성 시각을 집계하는 웹 도구입니다.
- 사이트: https://moris-kr.github.io/gallery-pulse/
- 기본값: 60분 간격, 최신 2,500개, 1페이지부터 과거 방향
- 설정: 1
1,440분, 110,000개, 시작 페이지 - 일반·마이너·미니 갤러리 주소 지원
- 공지, 광고, 설문, 목록에 삽입된 추천 글, 중복 제외
- 구간 자동확장 기본 켜짐: 과거 시간 구간의 경계까지 추가 수집
- 시간대별 그래프, 평균·최고 화력, 상세 표, CSV 다운로드, 취소
- 수집한 페이지마다 차트·통계·표를 실시간 갱신하고, 취소 시 부분 결과 유지
- 파형·차트·숫자 등장 모션과 동작 줄이기 설정 지원
- 끌올글은 원래 작성 시각에 보관하고, 실제 탐색한 시간 범위에 들어올 때만 중복 없이 합산
페이지당 50개 목록에서 읽을 수 있는 일반 게시글을 수집합니다. 게시글 번호 차이로 글 수를 추정하지 않습니다. 작성 시각을 KST로 해석해 같은 길이의 시간 구간으로 집계하고, 중간 빈 구간은 0건으로 표시합니다. 자동확장을 켜면 표본이 끊긴 과거 구간의 경계까지 더 읽고 완전히 수집한 구간을 평균·최고에 포함합니다. 과거 페이지에서 시작한 경우 더 최신 페이지 방향도 확인합니다. 추가 수집은 최대 200페이지, 전체 50,000개로 제한하고 한도·오류는 표시합니다. 현재 진행 중인 구간과 확장이 완료되지 않은 구간은 평균·최고에서 제외합니다. 자동확장을 끄면 요청한 일반 글 수까지 탐색합니다. 탐색 범위 안의 끌올글은 추가 합산하며, 범위 밖 끌올글은 차트에 표시하지 않습니다. 완전한 구간이 없으면 해당 지표는 표시하지 않습니다. 수집 중 삭제·새 글로 페이지가 이동하면 누락이 생길 수 있습니다. 오류로 중단되면 부분 수집임을 명시합니다.
Node.js 22 이상:
npm ci
npm test
npm starthttp://localhost:8787 에서 실행합니다. public/config.js의 API 주소가 비어 있으면 로컬 수집 서버를 이용합니다. 주소가 설정돼 있으면 배포된 API를 이용합니다.
프런트엔드는 public/의 정적 파일을 node scripts/build-pages.mjs로 site-dist/gallery-pulse/에 복사해 GitHub Pages에 배포합니다. 루트 주소는 /gallery-pulse/로 자동 이동합니다. main 푸시 시 .github/workflows/pages.yml이 테스트 후 배포합니다. 저장소 Settings → Pages → Source는 GitHub Actions입니다.
수집 API는 Cloudflare Pages의 Advanced Mode Worker입니다. 브라우저의 교차 출처 제한을 해결하며, 임의 외부 주소를 프록시하지 않습니다. 공개 응답에는 글 번호와 작성 시각만 포함합니다. 제목·작성자·본문은 저장하지 않습니다. HTMLRewriter로 목록을 읽으며 서버에는 수집 결과 캐시를 저장하지 않습니다. 브라우저는 순차 요청 사이에 350ms를 둡니다. 서비스 이용량에는 Cloudflare 계정의 할당량이 적용됩니다.
node scripts/build-api.mjs
npx wrangler pages deploy api-dist --project-name gallery-pulse-api --branch main공개 API 주소는 public/config.js, 허용하는 사이트 출처는 worker.mjs에서 관리합니다. 인증 토큰과 계정 정보는 저장소에 넣지 않습니다. 커밋 작성자는 moris-kr, 이메일은 220906177+moris-kr@users.noreply.github.com을 사용합니다.
디시인사이드와 무관한 비공식 도구입니다. 원본 사이트 구조 변경·접근 제한 시 수집이 실패할 수 있습니다.
주소 입력란 아래에서 비교할 갤러리를 최대 5개까지 추가할 수 있습니다. 동일한 설정과 수집 기준 시각을 사용하며, 최대 2개 갤러리를 동시에 수집합니다. 선·그룹 막대·누적 영역 차트를 전환하고 범례에서 갤러리를 숨기거나 표시할 수 있습니다. 미수집 구간은 0으로 취급하지 않습니다. 누적 영역은 표시된 모든 갤러리에 데이터가 있는 구간만 표시합니다. 비교 평균은 요청한 모든 갤러리의 공통 완전 구간을 기준으로 합니다. 개별 상세 분석을 선택할 수 있으며 CSV는 모든 수집 결과를 포함합니다.
일시적인 네트워크 오류, 시간 초과, HTTP 408·429·5xx는 같은 페이지에서 자동 재시도합니다. 대기는 2초부터 최대 30초까지 늘어나며 서버의 Retry-After가 더 길면 이를 따릅니다. 기존 데이터는 유지하고 사용자가 수집 중지를 누르면 대기 중에도 즉시 취소합니다. 잘못된 요청 등 영구적인 4xx 오류는 재시도하지 않습니다.
비교 차트는 기본으로 표시된 갤러리들의 공통 수집 기간에 맞춥니다. ‘전체 기간으로 확장’ 토글을 켜면 긴 수집 범위도 표시합니다. 이 토글은 추가 수집을 수행하는 ‘구간 자동확장’과 별개입니다. 입력한 갤러리 주소는 현재 브라우저의 로컬 저장소에 보관하며 다음 방문에 복원합니다. 구간별 상세 기록은 갤러리별 탭으로 전환할 수 있습니다.
확정된 과거 구간은 브라우저의 IndexedDB에만 저장합니다. 모든 집계 간격을 지원하며 키는 정규화된 갤러리 주소·집계 간격·구간 시작 시각입니다. 일부·진행 중 구간은 저장하지 않습니다. 최초 확정값을 유지하며, 저장된 구간이 연속으로 요청 범위를 충족할 때 과거 페이지 수집을 생략합니다. 최신 구간은 다시 수집합니다. 보관 한도는 모든 갤러리·간격을 합쳐 기본 5,000개이며 사이트에서 1~50,000개로 변경할 수 있습니다. 한도를 넘으면 시간상 가장 오래된 구간을 지웁니다.
캐시 설정에는 저장 개수와 갤러리·간격별 첫/마지막 시각을 표시합니다. 캐시 삭제는 주소 입력 기록이나 현재 표시 결과를 지우지 않으며, 삭제 중 진행하던 수집이 기존 캐시를 다시 저장하지 않도록 처리합니다. 기기·브라우저·사이트 출처별 저장소이므로 다른 브라우저와 공유되지 않습니다. 브라우저 저장소 삭제/자동 정리 또는 저장 공간 제한으로 캐시가 없어질 수 있으며 이때 원본 수집으로 동작합니다. 수집 요청은 기존 중계 API를 거치지만 확정 캐시는 업로드하지 않습니다.