| name | foresttrip-vacancy |
| description | Look up available Korean national forest recreation lodging or camping slots on foresttrip.go.kr. Use when the user asks for ์ฒ๋๋คe or ์์ฐํด์๋ฆผ ๋น ๊ฐ์ค/๋น์๋ฆฌ ์กฐํ, not for booking. |
| license | MIT |
| metadata | {"category":"travel","locale":"ko-KR","phase":"v1.5"} |
Foresttrip Vacancy
What this skill does
์ฒ๋๋คe ๊ณต์ ์ฌ์ดํธ(https://foresttrip.go.kr/index.jsp)์์ ์์ฐํด์๋ฆผ ์์ฝ ๊ฐ๋ฅ ๊ฐ์ค์ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์กฐํ ์๋ํํ๋ค.
์ด ์คํฌ์ ์กฐํ ์ ์ฉ ์๋ํ์ด๋ค. ์์ฝ ์ ์ฒญ, ๊ฒฐ์ , ์บก์ฐจ ์ฒ๋ฆฌ, ๋๊ธฐ์ด ์ฐํ, ๋ฐ๋ณต ์ค๋์ดํ์ ๋ฒ์์ ํฌํจํ์ง ์๋๋ค.
When to use
- "์ด๋ฒ ์ฃผ๋ง ์์ฐํด์๋ฆผ ๋น ๊ฐ์ค ์์ด?"
- "์ฒ๋๋คe 2026๋
5์ 4์ผ ์์ฝ ๊ฐ๋ฅํ ๊ณณ ์กฐํํด์ค"
- "์์ฐํด์๋ฆผ ๋น์๋ฆฌ ์ ์ฒด ์กฐํํด์ค"
- "๊ด์ฌ ํด์๋ฆผ ์ค ์์ฝ ๊ฐ๋ฅํ ๊ฐ์ค๋ง ์๋ ค์ค"
When not to use
- ์์ฝ ์ ์ฒญ์ด๋ ๊ฒฐ์ ๊น์ง ์๋ํํด์ผ ํ๋ ๊ฒฝ์ฐ
- ์บก์ฐจ๋ฅผ ํ๊ฑฐ๋ ๋๊ธฐ์ด์ ์ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๊ณ์ ์ ๋ณด๋ฅผ ์ฑํ
์ฐฝ์ ์ง์ ๋ฃ์ผ๋ ค๋ ๊ฒฝ์ฐ
- aggressive polling, ์ค๋์ดํ, ๋ฐ๋ณต ์์ฝ ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ
Prerequisites
- Python 3.9+
- Playwright Chromium browser
python3 -m pip install playwright
python3 -m playwright install chromium
python3 scripts/run_foresttrip_vacancy.py --check-deps
Required environment variables
KSKILL_FORESTTRIP_ID
KSKILL_FORESTTRIP_PASSWORD
Optional:
Credential resolution order
- ์ด๋ฏธ ํ๊ฒฝ๋ณ์์ ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- ์์ด์ ํธ๊ฐ ์์ฒด secret vault(1Password CLI, Bitwarden CLI, macOS Keychain ๋ฑ)๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉด ๊ฑฐ๊ธฐ์ ๊บผ๋ด ํ๊ฒฝ๋ณ์๋ก ์ฃผ์
ํด๋ ๋๋ค.
~/.config/k-skill/secrets.env (๊ธฐ๋ณธ fallback) โ plain dotenv ํ์ผ, ํผ๋ฏธ์
0600.
- ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์ ์ ์๊ฒ ๋ฌผ์ด์ 2 ๋๋ 3์ ์ ์ฅํ๋ค.
๊ธฐ๋ณธ ๊ฒฝ๋ก์ ์ ์ฅํ๋ ๊ฒ์ fallback์ผ ๋ฟ, ๊ฐ์ ๊ฐ ์๋๋ค.
Helper ์์ฒด๋ KSKILL_FORESTTRIP_ID, KSKILL_FORESTTRIP_PASSWORD ํ๊ฒฝ๋ณ์๋ง ์ฝ๋๋ค. vault๋ secrets.env ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์คํ ์ ์ ํด๋น ๊ฐ์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์
ํ๋ค.
Inputs
- ๋ ์ง:
YYYYMMDD, ์ฌ๋ฌ ๋ ์ง๋ฉด comma-separated YYYYMMDD,YYYYMMDD
- ์กฐํ ๋ฒ์:
--all: ์ ์ฒด ์์ฐํด์๋ฆผ ์กฐํ
--forest-id: ํน์ insttId ์กฐํ
--forest-name: ๊ณต์ ํด์๋ฆผ๋ช
๋ถ๋ถ ์ผ์น ์กฐํ
- ์ถ๋ ฅ ํ์:
--text: ์ฌ๋์ฉ ์์ฝ
--json: ๊ตฌ์กฐํ ๊ฒฐ๊ณผ
- ์ ํ ํํฐ:
--categories 01: ์๋ฐ
--categories 02: ์ผ์/์บ ํ
--categories 01,02: ์๋ฐ + ์ผ์/์บ ํ
- ๊ณ ๊ธ ์คํ ์ต์
:
--week-range N: --dates ๋ฅผ ์๋ตํ์ ๋๋ง ์ค๋๋ถํฐ N์ฃผ ๋ฒ์๋ฅผ ์กฐํ
--concurrency N: ๋ณ๋ ฌ ์กฐํ worker ์, 1-5 ๋ฒ์
--session-cache PATH: ๋ก๊ทธ์ธ ์ธ์
์บ์ ๊ฒฝ๋ก override
Workflow
1. Ensure credentials are available
KSKILL_FORESTTRIP_ID, KSKILL_FORESTTRIP_PASSWORD ๊ฐ ์ค์ ๋์ด ์๋์ง ํ์ธํ๋ค. ์์ผ๋ฉด credential resolution order์ ๋ฐ๋ผ ํ๋ณดํ๋ค.
์ํฌ๋ฆฟ์ด ์๋ค๋ ์ด์ ๋ก ๋์ฒด ์ฌ์ดํธ, ์บก์ฐจ ์ฐํ, ๋น๊ณต์ ์์ฝ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ์๋๋ค.
2. Install runtime dependencies when missing
python3 -m pip install playwright
python3 -m playwright install chromium
3. Run a vacancy lookup
์ด ์คํฌ์ helper๋ฅผ ํตํด ์กฐํํ๋ค. Helper๋ Playwright๋ก ์ฒ๋๋คe์ ๋ก๊ทธ์ธํด CSRF/cookie์ ๊ณต์ ํด์๋ฆผ ID ๋ชฉ๋ก์ ์ป์ ๋ค, ์๋ณ์์ฝ์กฐํ JSON endpoint๋ง ํธ์ถํ๋ค.
2026-04-29 ํ์ธ ๊ธฐ์ค, ๋ก๊ทธ์ธ ์์ด ์๋ณ์์ฝ์กฐํ ํ๋ฉด์ ์ ๊ทผํ๋ฉด 401 Unauthorized๊ฐ ๋ฐํ๋๊ณ , ์กฐํ endpoint๋ JSON ๋์ ์๋ด HTML์ ๋ฐํํ๋ค. ๋ฐ๋ผ์ ํ์ฌ helper๋ ๋ก๊ทธ์ธ ์ธ์
/CSRF ํ๋ณด๋ฅผ ํ์ ์ ์ ๋ก ๋๋ค.
API๋ srchDate ๋จ์ผ ์ผ์๋ง ์์ฒญํด๋ ์๋ต์ 5์ผ ์๋์ฐ๋ฅผ ํฌํจํ ์ ์๋ค. helper๋ ์์ฒญ ๋ฒ์(todayโlast_day) ๋ฐ useDt ํ์ ์๋ ์ ๊ฑฐํ๋ฏ๋ก ์ฌ์ฉ์์๊ฒ๋ ์์ฒญํ ๋ ์ง์ ๋น์๋ฆฌ๋ง ๋
ธ์ถ๋๋ค.
์ ์ฒด ์์ฐํด์๋ฆผ์์ ํน์ ๋ ์ง ์กฐํ:
python3 scripts/run_foresttrip_vacancy.py --all --text --dates 20260504
JSON ์ถ๋ ฅ:
python3 scripts/run_foresttrip_vacancy.py --all --json --dates 20260504
์บ ํ/์ผ์๋ง ์กฐํ:
python3 scripts/run_foresttrip_vacancy.py --all --text --dates 20260504 --categories 02
ํน์ ํด์๋ฆผ๋ช
์ผ๋ก ์กฐํ:
python3 scripts/run_foresttrip_vacancy.py --forest-name ์ ๋ช
์ฐ --text --dates 20260504
4. Summarize results conservatively
์๋ต์ ์๋ ํญ๋ชฉ ์ค์ฌ์ผ๋ก ์งง๊ฒ ์ ๋ฆฌํ๋ค.
- ์กฐํ ๋ ์ง
- ์กฐํ ๋ฒ์
- ์์ฝ ๊ฐ๋ฅํ ํด์๋ฆผ๋ช
- ๊ฐ์ค/์์ค๋ช
- ์๋ฐ/์ผ์ ๊ตฌ๋ถ
- ์ ์ ๋๋ ์์ฉ ์ธ์
- fetch failure๊ฐ ์์ผ๋ฉด ์คํจ ๊ฐ์
๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด "์กฐํ ์์ ๊ธฐ์ค ์์ฝ ๊ฐ๋ฅ ๊ฐ์ค ์์"์ด๋ผ๊ณ ๋งํ๋ค. ์ค์ ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ ์ฒ๋๋คe ํ๋ฉด์์ ์ฌํ์ธ๋ ์ ์์์ ๋ง๋ถ์ธ๋ค.
goodsNm์ "์๋น"๊ฐ ํฌํจ๋ ๊ฐ์ค์ ์ด์์๊ฐ ๋ณด์ ํ๋ ๋ด๋ถ์ฉ ์๋ฆฌ๋ก, ์ฌ์ฉ์ ์์ฝ ํ๋ฉด์๋ ๋
ธ์ถ๋์ง ์๋๋ค. helper๋ ์ด ๊ฐ์ค๋ค์ ๊ฒฐ๊ณผ์์ ์๋ ์ ์ธํ๋ค. ๊ฐ์ (ํด์๋ฆผ, ๋ ์ง, ๊ฐ์ค๋ช
) ์กฐํฉ์ ์ค๋ณต ํ๋ dedup๋๋ค.
Done when
- ์์ฒญ ๋ ์ง์ ์กฐํ ๋ฒ์๊ฐ ๋ช
ํํ๋ค.
- read-only ์๋ณ์์ฝ์กฐํ helper๋ฅผ ์ต์ 1ํ ์คํํ๋ค.
- ๋น ๊ฐ์ค์ด ์์ผ๋ฉด ๋ ์ง/ํด์๋ฆผ/๊ฐ์ค์ ์ ๋ฆฌํ๋ค.
- ๋น ๊ฐ์ค์ด ์์ผ๋ฉด ์๋ค๊ณ ๋ช
ํํ ๋งํ๋ค.
- ์์ฝ/๊ฒฐ์ /๋๊ธฐ์ด ์ฐํ๋ ์๋ํ์ง ์์๋ค.
Failure modes
- ๋ก๊ทธ์ธ ์คํจ:
KSKILL_FORESTTRIP_ID, KSKILL_FORESTTRIP_PASSWORD ํ์ธ
- Playwright browser ๋ฏธ์ค์น:
python3 -m playwright install chromium
- fetch failure ์ผ๋ถ ๋ฐ์: ๊ฒฐ๊ณผ์ ์คํจ ๊ฐ์๋ฅผ ํจ๊ป ๋ณด๊ณ ํ๊ณ , ํ์ํ๋ฉด
--refresh-session ์ผ๋ก 1ํ ์ฌ์กฐํ
- ์ฒ๋๋คe ํ๋ฉด ๋ณ๊ฒฝ: helper์ login/session bootstrap ๋๋ parser ์ ๊ฒ ํ์
- "(์๋น)" ๊ฐ์ค์ด ๊ฒฐ๊ณผ์ ์ ๋์ด: ์ ์ ๋์์ด๋ค. ์ฌ์ฉ์ ์์ฝ ํ๋ฉด์ ๋
ธ์ถ๋์ง ์๋ ์ด์์ ๋ณด์ ๋ถ์ด๋ผ ์๋์ ์ผ๋ก ์ ์ธ๋๋ค.
- ์ฌ์ฉ์ ํ๋ฉด ๊ฐ์ค ์์ helper ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฆ: ๊ฐ์ ๊ฐ์ค์ ์ค๋ณต ํ์ด dedup๋์๊ฑฐ๋, ์์ฒญ ๋ฒ์ ๋ฐ
useDt๊ฐ ์ ๊ฑฐ๋์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. raw API ์๋ต์ ํ์ธํ๋ ค๋ฉด helper ๋ก์ง์ ์ฐํํด์ ์ง์ ํธ์ถ ํ์.
Maintainer review notes
๋ฉ์ธํ
์ด๋๊ฐ ์ด ์คํฌ์ ๊ฒํ ํ๊ธฐ ์ํด ์ฒ๋๋คe ๊ณ์ ์ ์๋ก ๋ง๋ค ํ์๋ ์๋ค.
๊ณ์ ์์ด ๊ฐ๋ฅํ ๊ฒ์ฆ:
./scripts/validate-skills.sh
python3 -m py_compile foresttrip-vacancy/scripts/run_foresttrip_vacancy.py
python3 foresttrip-vacancy/scripts/run_foresttrip_vacancy.py --help
python3 foresttrip-vacancy/scripts/run_foresttrip_vacancy.py --check-deps
npm run ci
์ค์ live smoke๋ ๊ธฐ์ฌ์ ๋๋ ์ด๋ฏธ ์ฒ๋๋คe ๊ณ์ ์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์ ํ์ ์ผ๋ก ์ํํ๋ค. PR์๋ forests_scanned, fetch_failures, filter_hits ๊ฐ์ ๋น๋ฏผ๊ฐ ์์ฝ๋ง ๋จ๊ธฐ๊ณ ๊ณ์ ์ ๋ณด, ์ธ์
์ฟ ํค, ๊ฐ์ธ ์กฐํ ์ธ๋ถ ๋ด์ญ์ ๊ณต์ ํ์ง ์๋๋ค.
Safety notes
- ์กฐํ ์ ์ฉ ์คํฌ์ด๋ค.
- ์์ฝ, ๊ฒฐ์ , ์บก์ฐจ ์ฒ๋ฆฌ, ๋๊ธฐ์ด ์ฐํ, ๊ณต๊ฒฉ์ ์ธ ๋ฐ๋ณต ์กฐํ๋ฅผ ํ์ง ์๋๋ค.
- ๊ณ์ ์ํฌ๋ฆฟ์ ํ๊ฒฝ๋ณ์ ๋๋
~/.config/k-skill/secrets.env ๋ก๋ง ๋ค๋ฃฌ๋ค.