diff --git a/README.md b/README.md index e21eb85..dc6a124 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ PIT3000/PM2000V6에서 확인한 **의약품 상세정보, 식별 이미지, 약 ## 핵심 결론 +> ★**이미지/약품정보를 실제로 가져오려면 [docs/healthkr-json-api-SOLVED.md](docs/healthkr-json-api-SOLVED.md) 를 보세요.** +> 로컬 BLOB(`PM_IMAGE..DrugImg`) 매칭키 분석은 막혔지만, **약학정보원 JSON API**로 평문 DIK_CODE로 안정 해결됨(운영 POS 반영). +> 정답 경로 = `CD_GOODS.BARCODE → CD_BARCODE.DIK_CODE → ajax_result_drug2.asp(JSON)`. CD_GOODS.DIK_CODE 직접·로컬 BLOB은 함정. + +0. **(권장 경로)** 약품 이미지·상세는 로컬 BLOB이 아니라 **약학정보원 JSON API**에서 받는다. 위 SOLVED 문서 참조. 1. 화면/인쇄에 쓰이는 약품 상세정보는 로컬 DB(`PM_DRUG`, `PM_IMAGE`)와 외부 health.kr URL을 병행합니다. 2. `DRUGCODE`에서 `DIK_CODE`, `SUNG_CODE`를 조회합니다. 3. `SUNG_CODE`는 **성분코드**입니다. 보험코드가 아닙니다. diff --git a/docs/healthkr-json-api-SOLVED.md b/docs/healthkr-json-api-SOLVED.md new file mode 100644 index 0000000..5ef9fa1 --- /dev/null +++ b/docs/healthkr-json-api-SOLVED.md @@ -0,0 +1,86 @@ +# ★해결: 약학정보원(health.kr) JSON API로 약품정보+이미지 가져오기 + +> 이 문서는 **실제 운영 POS(ANIPOS)에 구현·배포된 정답 경로**입니다. +> 로컬 BLOB(`PM_IMAGE..DrugImg`) 매칭키 분석([drugimg-key-findings.md](drugimg-key-findings.md))은 +> "암호화 image key라 어렵다"에서 멈췄지만 — **애초에 로컬 BLOB을 쓸 필요가 없습니다.** +> 약품 이미지·상세정보는 **약학정보원 JSON API**에서 평문 DIK_CODE로 안정적으로 받습니다. +> 실측 환경: `192.168.0.69\PM2014` (PIT3000), 검증일 2026-06-29. + +## TL;DR — 다른 AI는 이것만 보면 됨 + +``` +POS 상품(DrugCode 또는 바코드) + → PM_DRUG..CD_GOODS.BARCODE (마스터 바코드) + → PM_DRUG..CD_BARCODE.DIK_CODE ★연결고리는 여기 (CD_GOODS.DIK_CODE 아님) + → health.kr drug_cd = 평문 DIK_CODE + → https://health.kr/searchDrug/ajax/ajax_result_drug2.asp?drug_cd={DIK} + → JSON 배열 [{...64필드...}] : 약품명/성분/효능/이미지URL 전부 +``` + +- **로컬 BLOB(DrugImg) 안 씀.** 44자 base64 image key 푸는 노력 불필요. +- **직접 이미지 URL 추측 금지.** `big3/{DIK}.jpg`는 대부분 404 — JSON 안의 이미지 필드를 써야 함. + +## ★핵심 함정 1 — DIK_CODE 출처는 CD_BARCODE + +판매상세/장바구니의 시작점은 `DrugCode`(예 `LB000000169`, `ZP00000178`, 조제약은 9자리). +거기서 DIK로 가는 경로 도달률 실측 (19개 샘플): + +| 경로 | 도달 | 비고 | +|---|---|---| +| **A: `CD_GOODS.BARCODE → CD_BARCODE.DIK_CODE`** | **18/19** ✅ 정답 | | +| B: `CD_BARCODE.DRUGCODE` 직접 조인 | 0/19 | CD_BARCODE.DRUGCODE엔 우리 DrugCode 없음 | +| C: `CD_GOODS.DIK_CODE` 직접 | 14/19 | LB채번 약 누락 | + +> 실증: **용각산(대) `LB000000169`** = `CD_GOODS.DIK_CODE = NULL`(C 실패)인데 +> `BARCODE 8806419031329 → CD_BARCODE.DIK = A11AJJJJJ0220`(A 성공) → health.kr 이미지 `exists=True`. +> CD_GOODS.DIK 직접만 믿으면 이런 약이 통째로 빠진다. + +```sql +SELECT TOP 1 b.DIK_CODE +FROM PM_DRUG..CD_GOODS g +JOIN PM_DRUG..CD_BARCODE b ON g.BARCODE = b.BARCODE +WHERE g.DrugCode = ? AND ISNULL(b.DIK_CODE,'') <> ''; +``` + +CD_BARCODE.DIK_CODE 채움률 = **210,529 / 307,078 (69%)** (CD_GOODS.DIK 44%보다 높음). +조제약(ETC)도 9자리 약품코드로 동일 경로 도달 9/10 (바코드 없는 약만 누락). + +## ★핵심 함정 2 — 정답 엔드포인트는 ajax_result_drug2.asp (JSON) + +``` +사람용 HTML : https://health.kr/searchDrug/result_drug_simple.asp?drug_cd={DIK} +정답 JSON : https://health.kr/searchDrug/ajax/ajax_result_drug2.asp?drug_cd={DIK} +``` + +- 응답 content-type은 `text/html`이지만 본문은 **순수 JSON 배열**(`json.loads` OK). +- `zoom.asp` 파싱조차 불필요 — JSON에 이미지 URL이 직접 들어있다. +- 헤더에 `Referer: https://health.kr/` 권장. + +### JSON 주요 필드 (64개 중) +| 필드 | 내용 | +|---|---| +| `drug_name` / `drug_enm` | 한글명 / 영문명 | +| `upso_name` | `제조사\|영문\|주소\|전화\|...` (파이프 구분, 첫 토큰만) | +| `list_sunb_name` | 성분 | +| `cls_code` | 약효분류 / `drug_form` 제형 / `charact` 성상 | +| `boh` | 보험/비급여 | +| `effect`/`dosage`/`caution`/`mediguide`/`additives` | 효능/용법/주의/복약지도/첨가제 | +| `drug_pic` / `pack_img` | 낱알/포장 이미지 URL (`common.health.kr/...`) | +| `picto_img` | 픽토그램 URL들, `\|` 구분 | + +⚠ 본문 텍스트(effect 등)는 줄바꿈을 리터럴 `brbr` / `
` / ``로 섞어 줌 → `