mirror of
https://github.com/NomaDamas/k-skill.git
synced 2026-09-14 16:37:18 +08:00
c0b38fc517
The IROS docs now make the corp-number happy path produce the company-name list that pinned upstream iros_download.py opens after payment, and route the customer workbook excel_path into the same private workdir boundary as other sensitive inputs and outputs. Constraint: Live IROS login/payment smoke requires user credentials, certificate/authentication, and card payment authority Rejected: Rely on upstream data/ defaults | leaves real customer workbook and company list paths inside the cloned repository Confidence: high Scope-risk: narrow Tested: node --test --test-name-pattern='iros-registry-automation' scripts/skill-docs.test.js Tested: ./scripts/validate-skills.sh Tested: npm run lint && npm run typecheck && npm test Tested: npm run ci Tested: cloned pinned upstream SHA and verified companies_list, excel_path, and configured paths resolve under private temp workdir Not-tested: Live IROS login/payment smoke; requires user credentials/authentication/payment authority
171 lines
9.6 KiB
Markdown
171 lines
9.6 KiB
Markdown
# 등기부등본 자동화 가이드
|
|
|
|
`iros-registry-automation`은 인터넷등기소(IROS)에서 법인/부동산 등기부등본(등기사항증명서)을 여러 건 발급해야 할 때, 사용자가 직접 로그인·결제하는 브라우저 흐름을 전제로 장바구니, 열람, 저장 작업을 보조하는 스킬이다.
|
|
|
|
이 문서는 원 저작자 `challengekim`의 MIT 참고 구현 [`challengekim/iros-registry-automation`](https://github.com/challengekim/iros-registry-automation)을 기준으로 작성했다. 스킬 답변이나 파생 문서에도 이 원 저작자 링크를 남긴다.
|
|
|
|
## 할 수 있는 일
|
|
|
|
- 법인등기부등본: 법인등록번호 기반(`iros_cart_by_corpnum.py`) 또는 상호명 기반(`iros_cart.py`)으로 장바구니에 담고, 사용자가 직접 결제한 뒤 열람·저장한다.
|
|
- 부동산등기부등본: 주소/동호수 JSON을 사용해 `iros_cart_realty.py`로 장바구니에 담는다. 결제·열람·다운로드는 인터넷등기소 웹 UI에서 수동 처리하는 것을 기본 권장한다.
|
|
- TouchEn nxKey 설치, Playwright/Chromium 준비, 입력 파일 형식, 저장 폴더를 점검한다.
|
|
- 다운로드된 PDF와 법인정보 리포트 같은 산출물을 저장소 밖 안전한 경로에 두도록 안내한다.
|
|
|
|
## 먼저 알아둘 점
|
|
|
|
- 로그인은 사용자가 직접 한다. 아이디/비밀번호, 공동인증서 비밀번호, 간편인증, OTP, 보안카드 입력을 에이전트에게 맡기지 않는다.
|
|
- 결제는 사용자가 직접 한다. 카드 번호와 승인 절차는 브라우저에서 사람이 처리한다.
|
|
- 법인 발급은 upstream 문서 기준 **페이지당 10건** 결제 제약을 전제로 한다. 10건을 넘으면 사용자가 10건 단위로 반복 결제한다.
|
|
- 부동산은 인터넷등기소 웹 UI의 10만원 미만 일괄 결제와 일괄열람출력/일괄저장 기능을 쓰는 편이 빠르고 안전한 경우가 많다. 이 스킬은 부동산 주소 목록을 장바구니에 반복 담는 부분에 초점을 둔다.
|
|
- TouchEn nxKey가 설치되어 있지 않으면 중간에 보안 프로그램 설치 페이지가 뜰 수 있다. 설치 후 브라우저/PC를 재시작하고 처음부터 다시 실행한다.
|
|
- 이 기능은 참고용 발급 자동화 가이드다. 법률 자문, 권리관계 해석, 발급 결과의 법적 효력 판단을 하지 않는다.
|
|
|
|
## 설치
|
|
|
|
이 스킬은 로그인·인증·결제 인접 브라우저 자동화를 mutable upstream `HEAD`에 맡기지 않는다. 실행 전 이 저장소의 `iros-registry-automation/scripts/upstream.pin`에 적힌 reviewed SHA로 checkout한다.
|
|
|
|
```bash
|
|
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
|
|
```
|
|
|
|
업스트림 핀 업데이트는 새 upstream diff 검토가 필요한 보안/신뢰 경계 변경이다. `scripts/upstream.pin`과 설치 예시의 `git checkout` SHA를 같은 PR에서 함께 갱신한다.
|
|
|
|
Chrome/Chromium, Python 3.10+, IROS 로그인 수단, 결제 카드, TouchEn nxKey가 필요하다.
|
|
|
|
## 안전한 작업 폴더
|
|
|
|
발급 대상 목록과 PDF에는 법인등록번호, 주소, 동호수, 회사명 등 개인정보/민감정보가 들어갈 수 있다. 저장소 밖 비공개 디렉터리에서 다루고, PR·테스트 로그·공개 문서에 실제 값을 커밋하지 않는다.
|
|
|
|
```bash
|
|
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`, `$workdir/realty-input.json`, `$workdir/customer-list.xlsx`처럼 저장소 밖에 둔다. upstream `data/` 디렉터리는 샘플 형식 확인용으로만 보고, 실제 법인등록번호·주소·동호수·고객 Excel 원문을 넣지 않는다.
|
|
|
|
```bash
|
|
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
|
|
```
|
|
|
|
`iros_download.py`는 결제 후 열람·저장 단계에서 `companies_list`를 열어 저장 파일명을 맞춘다. 법인등록번호 기반 `iros_cart_by_corpnum.py`를 쓰더라도 결제 전에 `$workdir/companies-input.json`을 준비해야 결제 후 다운로드가 로컬 `FileNotFoundError` 없이 이어진다.
|
|
|
|
`config.json`의 입력·로그·save_dir 관련 값을 `$workdir`로 돌리면 upstream 스크립트를 실행해도 저장소 하위 `data/`, `logs/`, `output/`에 실제 업무 정보가 남지 않는다.
|
|
|
|
```bash
|
|
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
|
|
```
|
|
|
|
## 법인등기부등본 흐름
|
|
|
|
1. 법인등록번호 또는 상호명 목록을 준비한다.
|
|
2. 법인등록번호가 있으면 `iros_cart_by_corpnum.py`를 우선 사용한다. 상호명만 있으면 `iros_cart.py`를 사용한다.
|
|
3. 브라우저가 열리면 사용자가 직접 IROS에 로그인한다.
|
|
4. 자동 처리로 법인 검색 → 말소사항포함 등 선택 → 장바구니 담기를 진행한다.
|
|
5. 결제대상목록 페이지가 뜨면 사용자가 직접 카드 결제를 완료한다. 법인은 페이지당 10건 단위 제약을 전제로 한다.
|
|
6. 결제 후 `iros_download.py` 또는 마법사 메뉴 2번으로 열람·저장한다.
|
|
|
|
```bash
|
|
python iros_cart_by_corpnum.py
|
|
python iros_download.py
|
|
```
|
|
|
|
위 명령은 로컬 `config.json`을 읽으므로, 먼저 `corpnum_list`, `companies_list`, `save_dir`가 각각 `$workdir/corp-input.json`, `$workdir/companies-input.json`, `$workdir/downloads`를 가리키는지 확인한다.
|
|
|
|
## 부동산등기부등본 흐름
|
|
|
|
1. 주소/동호수 JSON을 준비한다.
|
|
2. `iros_cart_realty.py`로 주소 검색 → 소재지번 선택 → 용도(열람)/등기기록유형(전부)/미공개 → 장바구니 담기를 진행한다.
|
|
3. 사용자가 인터넷등기소 웹 UI에서 직접 결제, 일괄열람출력, 일괄저장을 수행한다.
|
|
4. 자동 저장이 꼭 필요한 경우에만 `iros_download_realty.py`를 별도로 검토한다.
|
|
|
|
```bash
|
|
python iros_cart_realty.py
|
|
```
|
|
|
|
부동산은 결제·열람·다운로드까지 무조건 자동으로 밀어붙이기보다, 장바구니 단계 자동화 후 브라우저의 일괄 기능을 쓰는 경로를 먼저 권한다.
|
|
|
|
## 마법사 사용
|
|
|
|
처음 쓰는 사용자는 upstream 마법사를 먼저 실행한다.
|
|
|
|
```bash
|
|
python iros_wizard.py
|
|
```
|
|
|
|
마법사는 법인/부동산 장바구니, 결제 후 열람·저장, 사업자번호 기반 법인정보 조회, 다운로드된 법인 PDF 종합 리포트 생성을 메뉴로 제공한다. 사업자번호/고객 workbook 경로는 `excel_path`가 `$workdir/customer-list.xlsx`를 가리키게 한 뒤 사용하고, upstream repo `data/고객리스트.xlsx`에는 실제 고객 Excel을 두지 않는다.
|
|
|
|
## 트러블슈팅
|
|
|
|
| 증상 | 원인 | 대응 |
|
|
| --- | --- | --- |
|
|
| 보안 프로그램 설치 페이지가 뜸 | TouchEn nxKey 미설치 | 설치 후 브라우저/PC 재시작, 스크립트 처음부터 재실행 |
|
|
| 법인 상호 검색 결과가 맞지 않음 | 사명변경, 특수문자, 동명 법인 | 법인등록번호 기반으로 재시도 |
|
|
| 10건 초과 법인 결제가 한 번에 되지 않음 | 페이지당 10건 제약 | 10건 단위로 반복 결제 |
|
|
| 부동산 저장 자동화가 느림 | 웹 UI 일괄 기능이 더 적합 | 장바구니만 자동화하고 결제·일괄열람출력·일괄저장은 수동 처리 |
|
|
|
|
## 보안/개인정보 원칙
|
|
|
|
- IROS 계정, 인증서 비밀번호, 카드 정보를 저장하지 않는다.
|
|
- 발급 대상 JSON, 다운로드 PDF, Excel 리포트는 저장소 밖에 둔다.
|
|
- 테스트와 PR에는 샘플/마스킹 값만 사용한다.
|
|
- 산출물 경로가 개인 이름·주소를 포함하면 공유 요약에서 경로도 마스킹한다.
|
|
|
|
## 출처
|
|
|
|
- 인터넷등기소(IROS): https://www.iros.go.kr
|
|
- 원 저작자 참고 구현: `challengekim/iros-registry-automation` — https://github.com/challengekim/iros-registry-automation
|
|
- upstream license: MIT
|