Skip to content

Commit 119ee23

Browse files
lapioggaclaude
andcommitted
feat(promo): 자동 캡처(Playwright) + 시연 시뮬레이터 + PNG 6장
A+C 옵션: 공개 페이지 자동 캡처 + 설치 흐름 자동 시연 스크립트. Added: - docs/promo/automation/capture_pages.py: Playwright 로 공개 페이지 6종 PNG 자동 캡처 * GitHub repo / Release / PyPI / 법제처 / OC 가이드 / 설치 ZIP 위치 * 격리 venv (.venv-pw, gitignore) 로 메인 의존성과 분리 - docs/promo/automation/demo-install-flow.ps1: setup-for-novice.ps1 의 화면 출력만 시뮬레이션. 실제 설치 X. ScreenToGif/OBS 로 GIF/MP4 녹화용. UTF-8 BOM. - docs/promo/automation/README.md: 두 도구 사용법 + 트러블슈팅 + v0.9.0 갱신 절차 - docs/promo/images/01~06.png: 위 스크립트로 생성한 첫 캡처 (총 5MB) - docs/promo/images/README.md: 이미지 인덱스 (자동 생성 6 + 수동 캡처 6 자리) Modified: - .gitignore: docs/promo/**/*.png|jpg|gif 예외 (README 노출용 자료는 추적), docs/promo/automation/.venv-pw/ 추가 향후 v0.9.0 등 업데이트 시 capture_pages.py 재실행만으로 6장 자동 갱신. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent ad12690 commit 119ee23

11 files changed

Lines changed: 429 additions & 0 deletions

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,17 @@ logs/
8383
*.png
8484
*.jpg
8585
*.jpeg
86+
# 단, docs/promo/ 아래 자료 이미지·GIF·동영상은 README 노출용이므로 추적
87+
!docs/promo/**/*.png
88+
!docs/promo/**/*.jpg
89+
!docs/promo/**/*.jpeg
90+
!docs/promo/**/*.gif
8691

8792
# 외부 가이드 원본 (저작권 불명확)
8893
reference/
8994

9095
# 내부 계획 폴더 (작업 메모)
9196
.planning/
97+
98+
# Playwright 자동화용 격리 venv
99+
docs/promo/automation/.venv-pw/

docs/promo/automation/README.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# 자동화 도구 (promo/automation)
2+
3+
본 폴더의 스크립트를 사용하면 홍보 자료(스크린샷·GIF) 의 상당 부분을 자동 생성할 수 있다. 향후 v0.9.0 등 업데이트 시 재실행만으로 자료 갱신 가능.
4+
5+
## 두 가지 자동화
6+
7+
| 도구 | 역할 | 자동화 수준 |
8+
|---|---|---|
9+
| `capture_pages.py` | 공개 웹 페이지 6장 PNG 캡처 (Playwright) | **완전 자동** |
10+
| `demo-install-flow.ps1` | 설치 흐름 시연 (실제 설치 X, 화면 출력만 시뮬레이션) | **반자동** (녹화는 사용자가 ScreenToGif 로) |
11+
12+
자동화 불가능 (사용자 본인 PC 에서 수동 캡처 필요):
13+
- Claude Desktop 채팅 화면 (Anthropic 계정 로그인)
14+
- 법제처 회원가입·활용신청 화면 (캡차·이메일 인증)
15+
- Windows SmartScreen 경고창
16+
17+
---
18+
19+
## 1. 공개 페이지 자동 캡처 (capture_pages.py)
20+
21+
### 무엇을 캡처하나?
22+
23+
| Slug | URL | 용도 |
24+
|---|---|---|
25+
| `01-github-repo` | github.com/lapiogga/caseLaw | 메인 페이지 |
26+
| `02-github-release` | releases/tag/v0.8.0 | Release 첨부 자산 안내 |
27+
| `03-pypi-package` | pypi.org/project/caselaw-mcp | PyPI 페이지 |
28+
| `04-bopjecheo-openapi` | open.law.go.kr 첫 화면 | OC 발급 진입점 |
29+
| `05-oc-baalgup-guide` | docs/OC발급_가이드.md (렌더링) | 가이드 자체 |
30+
| `06-installer-zip-download` | Release ZIP 다운로드 위치 | 다운로드 흐름 |
31+
32+
### 실행 방법 (Windows)
33+
34+
```powershell
35+
cd docs\promo\automation
36+
37+
# 1. 격리 venv 생성 (한 번만)
38+
uv venv .venv-pw
39+
uv pip install --python .\.venv-pw\Scripts\python.exe playwright
40+
41+
# 2. Chromium 다운로드 (한 번만, 약 200MB)
42+
.\.venv-pw\Scripts\python.exe -m playwright install chromium
43+
44+
# 3. 캡처 실행 (매번)
45+
.\.venv-pw\Scripts\python.exe capture_pages.py
46+
```
47+
48+
결과는 `docs/promo/images/` 에 PNG 6장. 약 20-30초 소요.
49+
50+
### 새 페이지 추가
51+
52+
`capture_pages.py``PAGES` 리스트에 튜플 추가:
53+
54+
```python
55+
("07-new-page", "https://example.com", 1280, 800, True, "css.selector"),
56+
```
57+
58+
- 5번째 인자 `full_page=True` 면 전체 페이지 (긴 README 등), `False` 면 viewport 한 화면만
59+
- 6번째 인자는 캡처 전 대기할 CSS selector (lazy-load 방지)
60+
61+
---
62+
63+
## 2. 설치 흐름 시연 (demo-install-flow.ps1)
64+
65+
### 무엇이 자동인가?
66+
67+
`setup-for-novice.ps1` 의 진짜 인터랙티브 입력(`Read-Host`) 부분을 모두 자동으로 진행한다 — 사용자 키보드 입력 없이 처음부터 끝까지 약 25초 안에 완주.
68+
69+
진짜 설치는 하지 않고 화면 출력만 시뮬레이션하므로 시스템에 영향 없다.
70+
71+
### 실행 방법
72+
73+
#### 옵션 A — ScreenToGif 로 GIF 만들기 (권장)
74+
75+
1. <https://www.screentogif.com> 에서 ScreenToGif 다운로드·실행
76+
2. '레코더' 모드 선택
77+
3. PowerShell 창을 열고, 녹화 영역을 PowerShell 창 크기로 지정
78+
4. ScreenToGif 녹화 시작
79+
5. PowerShell 에서 본 스크립트 실행:
80+
```powershell
81+
powershell -ExecutionPolicy Bypass -File docs\promo\automation\demo-install-flow.ps1
82+
```
83+
6. 시연 종료 후 ScreenToGif 녹화 멈춤 → '편집' → 불필요한 프레임 잘라내기 → '저장' → GIF
84+
7. 결과를 `docs/promo/images/07-install-demo.gif` 로 저장
85+
86+
#### 옵션 B — OBS Studio 로 MP4
87+
88+
1. OBS 의 '윈도우 캡처' 소스로 PowerShell 창 추가
89+
2. 녹화 시작 → 본 스크립트 실행 → 녹화 멈춤
90+
3. MP4 결과를 FFmpeg 로 GIF 변환:
91+
```powershell
92+
ffmpeg -i input.mp4 -vf "fps=10,scale=720:-1:flags=lanczos" -loop 0 install-demo.gif
93+
```
94+
95+
### 자동 녹화도 가능 (사용자 PC 에서, 본 환경 X)
96+
97+
PowerShell 의 Add-Type 으로 화면 캡처를 직접 코드로 할 수 있지만, 의존성·복잡도가 ScreenToGif 가 훨씬 낮으므로 추천하지 않는다.
98+
99+
---
100+
101+
## 3. 추천 워크플로 (총 30-40분)
102+
103+
```
104+
1. capture_pages.py 실행 (자동) -> images/01~06.png 생성
105+
2. ScreenToGif 로 demo-install-flow 녹화 -> images/07-install-demo.gif
106+
3. 본인 PC 에서 직접 캡처:
107+
- Claude Desktop 첫 채팅 결과 (ping) -> images/08-ping-result.png
108+
- 실제 사용 예시 (음주운전 검색) -> images/09-precedent-search.gif
109+
4. images/README.md 의 인덱스에 새 자료 추가
110+
5. 변경사항 commit + push
111+
```
112+
113+
---
114+
115+
## 4. 정기 갱신 (v0.9.0 등 새 버전 배포 시)
116+
117+
GitHub Release 버전 번호가 바뀌면 `capture_pages.py` 의 PAGES 리스트의 `releases/tag/v0.8.0` 부분만 새 버전으로 변경 후 재실행.
118+
119+
PyPI 캡처는 자동으로 최신 버전을 보여주므로 수정 불필요.
120+
121+
---
122+
123+
## 5. 트러블슈팅
124+
125+
| 증상 | 원인 / 해결 |
126+
|---|---|
127+
| `playwright install` 200MB 다운로드 너무 느림 | 한 번만 받으면 됨. 또는 `playwright install --with-deps chromium` 으로 시스템 deps 도 자동 |
128+
| 캡처에 한글이 깨짐 | viewport `locale="ko-KR"` 가 이미 설정됨. 그래도 깨지면 시스템 한글 폰트 확인 |
129+
| 일부 페이지가 빈 화면 | networkidle 타임아웃. `capture_pages.py` 가 자동으로 domcontentloaded 로 fallback |
130+
| Playwright 가 차단됨 (403) | User-Agent 추가 필요. `ctx = await pw.chromium.launch(... user_agent="Mozilla/5.0 ...")` |
131+
132+
---
133+
134+
## 격리 환경
135+
136+
본 폴더 안에서 만드는 `.venv-pw/` 는 .gitignore 로 추적 제외됨. 본 레포의 메인 `pyproject.toml` 의존성과 분리.
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
"""공개 웹 페이지 자동 스크린샷 (Playwright).
2+
3+
사용:
4+
cd docs/promo/automation
5+
uv pip install playwright
6+
uv run python -m playwright install chromium
7+
uv run python capture_pages.py
8+
9+
결과:
10+
docs/promo/images/ 에 PNG 자동 생성
11+
12+
캡처 대상은 모두 공개 페이지로 로그인 없이 접근 가능.
13+
법제처 회원가입·Claude Desktop 화면 등 인증 필요 화면은 제외 (사용자 본인 캡처 필요).
14+
"""
15+
16+
from __future__ import annotations
17+
18+
import asyncio
19+
from pathlib import Path
20+
21+
from playwright.async_api import async_playwright
22+
23+
OUT_DIR = Path(__file__).resolve().parent.parent / "images"
24+
OUT_DIR.mkdir(parents=True, exist_ok=True)
25+
26+
# (slug, url, viewport_width, viewport_height, full_page, wait_selector)
27+
PAGES = [
28+
(
29+
"01-github-repo",
30+
"https://github.com/lapiogga/caseLaw",
31+
1280, 800, True, "article",
32+
),
33+
(
34+
"02-github-release",
35+
"https://github.com/lapiogga/caseLaw/releases/tag/v0.8.0",
36+
1280, 800, True, "h1",
37+
),
38+
(
39+
"03-pypi-package",
40+
"https://pypi.org/project/caselaw-mcp/",
41+
1280, 800, True, "h1.package-header__name",
42+
),
43+
(
44+
"04-bopjecheo-openapi",
45+
"https://open.law.go.kr/LSO/openApi/cuAskList.do",
46+
1280, 900, True, "body",
47+
),
48+
(
49+
"05-oc-baalgup-guide",
50+
"https://github.com/lapiogga/caseLaw/blob/main/docs/OC%EB%B0%9C%EA%B8%89_%EA%B0%80%EC%9D%B4%EB%93%9C.md",
51+
1280, 900, True, "article",
52+
),
53+
(
54+
"06-installer-zip-download",
55+
"https://github.com/lapiogga/caseLaw/releases/tag/v0.8.0",
56+
1280, 800, False, "details summary",
57+
),
58+
]
59+
60+
61+
async def capture_one(
62+
pw,
63+
slug: str,
64+
url: str,
65+
width: int,
66+
height: int,
67+
full_page: bool,
68+
wait_selector: str,
69+
) -> Path:
70+
"""단일 페이지 캡처."""
71+
browser = await pw.chromium.launch(headless=True)
72+
ctx = await browser.new_context(
73+
viewport={"width": width, "height": height},
74+
locale="ko-KR",
75+
device_scale_factor=2, # 레티나 품질
76+
)
77+
page = await ctx.new_page()
78+
print(f" -> {url}")
79+
try:
80+
await page.goto(url, wait_until="networkidle", timeout=30000)
81+
except Exception as e:
82+
print(f" networkidle timeout ({e.__class__.__name__}), fallback to domcontentloaded")
83+
await page.goto(url, wait_until="domcontentloaded", timeout=30000)
84+
85+
try:
86+
await page.wait_for_selector(wait_selector, timeout=10000)
87+
except Exception:
88+
print(f" selector '{wait_selector}' not found, capture anyway")
89+
90+
# 추가 1초 대기 (lazy-load 이미지)
91+
await page.wait_for_timeout(1500)
92+
93+
out = OUT_DIR / f"{slug}.png"
94+
await page.screenshot(path=str(out), full_page=full_page)
95+
await browser.close()
96+
print(f" saved: {out.name} ({out.stat().st_size // 1024} KB)")
97+
return out
98+
99+
100+
async def main() -> None:
101+
print(f"Output: {OUT_DIR}")
102+
print(f"Targets: {len(PAGES)} pages\n")
103+
104+
async with async_playwright() as pw:
105+
for i, args in enumerate(PAGES, 1):
106+
print(f"[{i}/{len(PAGES)}] {args[0]}")
107+
try:
108+
await capture_one(pw, *args)
109+
except Exception as e:
110+
print(f" [FAIL] {e}")
111+
print()
112+
113+
print("Done. See docs/promo/images/")
114+
115+
116+
if __name__ == "__main__":
117+
asyncio.run(main())
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# =============================================================
2+
# 설치 흐름 시연 스크립트 (실제 설치 안 함)
3+
#
4+
# 본 스크립트는 setup-for-novice.ps1 의 화면 출력을 그대로 재현하지만
5+
# 실제 winget 설치·config 작성은 하지 않는다. 화면 녹화용.
6+
#
7+
# 사용:
8+
# ScreenToGif (https://www.screentogif.com) 또는 OBS Studio 실행
9+
# -> 녹화 영역을 PowerShell 창 크기로 지정
10+
# -> 본 스크립트 실행 (powershell -ExecutionPolicy Bypass -File demo-install-flow.ps1)
11+
# -> 녹화 멈춤 -> GIF 또는 MP4 저장
12+
#
13+
# 자동 시연 모드:
14+
# 매 단계가 자동으로 진행되어 사용자 입력 대기 없음 (총 약 25초)
15+
# =============================================================
16+
17+
$ErrorActionPreference = 'Stop'
18+
$OutputEncoding = [System.Text.Encoding]::UTF8
19+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
20+
21+
function Write-Step { param($m); Write-Host ''; Write-Host '--------------------------------------------------------' -ForegroundColor Cyan; Write-Host " $m" -ForegroundColor Cyan; Write-Host '--------------------------------------------------------' -ForegroundColor Cyan }
22+
function Write-Ok { param($m); Write-Host " [OK] $m" -ForegroundColor Green }
23+
function Write-Warn { param($m); Write-Host " [!] $m" -ForegroundColor Yellow }
24+
25+
function Demo-Pause { param([int]$Ms = 600); Start-Sleep -Milliseconds $Ms }
26+
function Demo-Type {
27+
param([string]$Text, [int]$DelayMs = 35)
28+
foreach ($ch in $Text.ToCharArray()) {
29+
Write-Host -NoNewline $ch
30+
Start-Sleep -Milliseconds $DelayMs
31+
}
32+
}
33+
34+
# 0. 환영
35+
Clear-Host
36+
Write-Host ''
37+
Write-Host ' ============================================================' -ForegroundColor Magenta
38+
Write-Host ' CaseLaw MCP 자동 설치 도구 (한국 판례·법령 검색)' -ForegroundColor Magenta
39+
Write-Host ' ============================================================' -ForegroundColor Magenta
40+
Write-Host ''
41+
Write-Host ' 이 도구는 Claude Desktop 에서 한국 판례·법령을 자연어로'
42+
Write-Host ' 검색·인용·요약할 수 있게 해줍니다.'
43+
Write-Host ''
44+
Write-Host ' 소요 시간: 3-7분 (인터넷 속도에 따라)'
45+
Write-Host ''
46+
Write-Host -NoNewline ' 계속하려면 Enter 를 누르세요: '
47+
Demo-Pause 1500
48+
Write-Host ''
49+
50+
# 1. OC 키
51+
Write-Step '1단계: 법제처 OC 키 확인'
52+
Write-Host ''
53+
Write-Host ' OC 키는 법제처 OPEN API 사이트에서 무료로 발급받습니다.'
54+
Write-Host ''
55+
Write-Host -NoNewline ' 이미 OC 키가 있습니까? (Y/N): '
56+
Demo-Pause 1000
57+
Demo-Type 'Y'
58+
Write-Host ''
59+
Write-Host ''
60+
Write-Host -NoNewline ' OC 키를 붙여넣으세요: '
61+
Demo-Pause 800
62+
Demo-Type 'gildong' 60
63+
Write-Host ''
64+
Write-Ok 'OC 키 등록: gil*****'
65+
66+
# 2. 도구 점검
67+
Write-Step '2단계: 필수 도구 점검 및 자동 설치'
68+
Demo-Pause 400
69+
Write-Ok 'winget 사용 가능'
70+
Demo-Pause 400
71+
Write-Host ''
72+
Write-Host ' uv (Python 도구) 가 없습니다. 자동 설치합니다 (1-2분)...'
73+
Demo-Pause 800
74+
Write-Host -NoNewline ' '
75+
1..30 | ForEach-Object { Write-Host -NoNewline '#' -ForegroundColor DarkGray; Start-Sleep -Milliseconds 60 }
76+
Write-Host ''
77+
Write-Ok 'uv 설치 완료'
78+
Demo-Pause 400
79+
Write-Ok 'Claude Desktop 이미 설치됨'
80+
Demo-Pause 300
81+
Write-Ok 'Claude Desktop config 폴더: C:\Users\...\Roaming\Claude'
82+
83+
# 3. 패키지
84+
Write-Step '3단계: caselaw-mcp 패키지 다운로드 (PyPI)'
85+
Demo-Pause 400
86+
Write-Host ' uvx 로 caselaw-mcp 미리 받습니다 (30-60초)...'
87+
Demo-Pause 600
88+
Write-Host -NoNewline ' '
89+
1..20 | ForEach-Object { Write-Host -NoNewline '#' -ForegroundColor DarkGray; Start-Sleep -Milliseconds 60 }
90+
Write-Host ''
91+
Write-Ok 'caselaw-mcp 설치 완료'
92+
93+
# 4. config
94+
Write-Step '4단계: Claude Desktop 설정 자동 작성'
95+
Demo-Pause 400
96+
Write-Ok '기존 설정 백업: claude_desktop_config.json.backup-20260505-153012'
97+
Demo-Pause 300
98+
Write-Ok '설정 파일 작성 완료'
99+
100+
# 5. 완료
101+
Write-Step '5단계: 설치 완료'
102+
Write-Host ''
103+
Write-Host ' 모든 설정이 끝났습니다!' -ForegroundColor Green
104+
Write-Host ''
105+
Write-Host ' 다음 절차로 사용하세요:'
106+
Write-Host ''
107+
Write-Host ' 1) 트레이의 Claude Desktop 아이콘 -> Quit'
108+
Write-Host ' 2) 시작 메뉴에서 Claude Desktop 다시 실행'
109+
Write-Host ' 3) 채팅창에 입력해보세요:'
110+
Write-Host ''
111+
Write-Host ' caselaw 로 ping 해줘' -ForegroundColor Yellow
112+
Write-Host ''
113+
Write-Host ' 문제 발생 시: https://github.com/lapiogga/caseLaw/issues'
114+
Write-Host ''
115+
Demo-Pause 2500
1.83 MB
Loading
512 KB
Loading
1.44 MB
Loading
232 KB
Loading
763 KB
Loading
217 KB
Loading

0 commit comments

Comments
 (0)