If you're dealing with bulk corporate or real estate registry certificate requests from Korea's Supreme Court IROS system, this automates the tedious parts while keeping you in control of the sensitive bits. It uses challengekim's MIT-licensed reference implementation to prep shopping carts and download PDFs, but you still handle login, payment, and any security software yourself. The hard boundary is smart: no credential handling, no automatic payments, and all personal data stays outside your repo in temp directories. Works best for corporate certificates where you have registration numbers. For real estate, it mostly helps with cart prep since IROS already has decent bulk UI once you're logged in. Expect to deal with TouchEn nxKey installation and ten-item payment batches.
npx -y skills add nomadamas/k-skill --skill iros-registry-automation --agent claude-codeInstalls into .claude/skills of the current project.
대법원 인터넷등기소(IROS, https://www.iros.go.kr)에서 법인/부동산 등기부등본(등기사항증명서) 을 여러 건 발급해야 할 때, 원 저작자 challengekim의 참고 구현 challengekim/iros-registry-automation (MIT)을 기준으로 안전한 작업 순서와 로컬 실행 방식을 안내한다.
iros-registry-automation/scripts/upstream.pin에 적힌 reviewed SHA로 고정한다.git clone https://github.com/challengekim/iros-registry-automation.git
cd iros-registry-automation
git checkout 7c6924b2ff88d693a12556659188cb91041e5097
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
playwright install chromium
cp config.json.example config.json
업스트림 핀 업데이트는 로그인·인증·결제 인접 브라우저 자동화의 신뢰 경계를 바꾸는 작업이다. scripts/upstream.pin 값을 바꾸기 전에는 새 upstream diff를 검토하고, 설치 예시의 git checkout SHA와 함께 같은 PR에서 갱신한다.
발급 대상에는 법인등록번호, 상호명, 주소, 동호수 등 민감할 수 있는 정보가 들어간다. 공개 저장소, PR, 테스트 로그에 넣지 않는다.
workdir="$(mktemp -d "${TMPDIR:-/tmp}/iros-registry.XXXXXX")"
chmod 700 "$workdir"
mkdir -p "$workdir/downloads" "$workdir/logs" "$workdir/output" "$workdir/tmp-downloads"
법인등록번호 기반 입력은 upstream repo data/가 아니라 $workdir/corp-input.json 같은 저장소 밖 파일에 둔다. 실제 법인등록번호/주소 원문을 upstream data/ 디렉터리, git 저장소, PR 첨부, 테스트 로그에 넣지 않는다.
iros_download.py는 결제 후 열람·저장 단계에서 companies_list를 열어 저장 파일명을 맞춘다. 법인등록번호 흐름을 쓰더라도 결제 전 $workdir/companies-input.json을 함께 만들어 둔다.
cat > "$workdir/corp-input.json" <<'JSON'
{
"1101111234567": "예시 주식회사",
"1101117654321": "샘플 주식회사"
}
JSON
python3 - "$workdir" <<'PY'
import json
import pathlib
import sys
workdir = pathlib.Path(sys.argv[1])
corp_input = json.loads((workdir / "corp-input.json").read_text())
companies = list(corp_input.values())
(workdir / "companies-input.json").write_text(
json.dumps(companies, ensure_ascii=False, indent=2) + "\n"
)
PY
부동산 주소 기반 입력 예시는 동/호수까지 필요한 경우가 있으므로 data/iros_realties.json 형식을 upstream README에서 확인하되, 실제 주소 원문은 $workdir/realty-input.json 같은 로컬 파일에만 둔다.
사업자번호 조회나 종합 리포트 마법사 흐름에서 쓰는 고객 Excel도 upstream repo data/가 아니라 $workdir/customer-list.xlsx 같은 저장소 밖 파일에 둔다. 실제 고객 목록을 upstream data/고객리스트.xlsx에 복사하지 않는다.
config.json도 저장소에 커밋하지 않는 로컬 파일로 두고, 민감 입력·로그·산출물 경로를 모두 $workdir 아래로 돌린다.
python3 - "$workdir" <<'PY'
import json
import pathlib
import sys
workdir = pathlib.Path(sys.argv[1])
config = json.loads(pathlib.Path("config.json").read_text())
config.update({
"corpnum_list": str(workdir / "corp-input.json"),
"companies_list": str(workdir / "companies-input.json"),
"realty_list": str(workdir / "realty-input.json"),
"excel_path": str(workdir / "customer-list.xlsx"),
"save_dir": str(workdir / "downloads"),
"realty_save_dir": str(workdir / "downloads" / "realty"),
"pdf_dir": str(workdir / "downloads"),
"report_output": str(workdir / "output" / "corp-report.xlsx"),
"extract_output": str(workdir / "output" / "corp-extract.json"),
"bizno_cache": str(workdir / "logs" / "bizno-cache.json"),
"bizno_results": str(workdir / "logs" / "bizno-results.json"),
"realty_cart_log": str(workdir / "logs" / "cart-realty-log.json"),
"realty_download_log": str(workdir / "logs" / "download-realty-log.json"),
"cart_log": str(workdir / "logs" / "cart-log.json"),
"cart_corpnum_log": str(workdir / "logs" / "cart-corpnum-log.json"),
"download_log": str(workdir / "logs" / "download-log.json"),
"download_temp": str(workdir / "tmp-downloads"),
})
pathlib.Path("config.json").write_text(json.dumps(config, ensure_ascii=False, indent=2) + "\n")
PY
법인등록번호를 알고 있으면 정확도가 높은 upstream iros_cart_by_corpnum.py 흐름을 우선한다. 상호명만 있으면 iros_cart.py를 사용하되 사명변경·특수문자 때문에 실패할 수 있어 실패분은 법인등록번호로 재시도한다.
python iros_cart_by_corpnum.py
# 또는
python iros_cart.py
완료되면 브라우저의 결제대상목록으로 이동한다. 사용자는 브라우저에서 페이지당 10건 단위로 직접 카드 결제를 완료하고, 터미널에는 결제가 끝난 뒤 Enter를 입력한다.
결제가 끝난 법인 등기부등본은 upstream iros_download.py 또는 마법사 메뉴의 법인 열람·저장 흐름으로 저장한다.
python iros_download.py
저장 경로는 config.json의 save_dir로 관리하되, 위 예시처럼 $workdir/downloads를 사용하고 공개 저장소 하위 경로를 사용하지 않는다. companies_list가 $workdir/companies-input.json을 가리키는지 결제 전에 확인하면 결제 후 iros_download.py가 FileNotFoundError로 중단되는 일을 피할 수 있다.
부동산은 주소 목록 반복 입력과 장바구니 담기까지만 자동화를 우선 권장한다.
python iros_cart_realty.py
결제, 열람, 다운로드는 인터넷등기소 웹 UI에서 사용자가 직접 일괄 결제·일괄열람출력·일괄저장을 수행하는 것이 보통 더 빠르고 안전하다. 필요할 때만 iros_download_realty.py를 검토한다.
처음 쓰는 사용자는 upstream iros_wizard.py 메뉴가 가장 안전하다.
python iros_wizard.py
메뉴 요약:
excel_path는 $workdir/customer-list.xlsx)excel_path와 pdf_dir는 저장소 밖 경로)challengekim/iros-registry-automation — https://github.com/challengekim/iros-registry-automation로그인 없이 가능한 검증:
pip install -r requirements.txtplaywright install chromiumpython iros_wizard.py 실행 후 메뉴/입력 파일 안내가 정상 표시되는지 확인로그인 세션이 필요한 최종 smoke:
challengekim과 참고 구현 링크가 포함됐다.sickn33/antigravity-awesome-skills
rohitg00/pro-workflow
supercent-io/skills-template