← 목록
기타 2026-06-14 12KB 읽기 13분

빠델라 이미지 수집기 — 출처 각인 도구

인스타/사이트/블로그 이미지를 주제별로 수집하고, 출처를 사진 자체(EXIF·IPTC·XMP)에 각인해 서비스에 안전하게 쓰는 도구. padella.crowny.org:9874 통합.

핵심 = 한선씨 엔진

/Users/ef/crowny-padella/이미지수집기.한선 (→ .toau) — 한선씨가 주체:

  • og:image / twitter:image 추출: 페이지면 체계(curl|tr|grep|sed)로 추출(한선씨 65535 문자열 cap 회피 위해 shell 오프로드), 직링크(.jpg/.png/.webp)면 그대로.
  • 다운로드: 정직한 UA PadellaBot/1.0 (+https://padella.crowny.org) (위장 금지 — 연구 권고), Referer 세팅.
  • 출처 각인(exiftool): IPTC(Credit/Source/CopyrightNotice/Keywords/Caption/SpecialInstructions=허가) + XMP-dc(Source/Rights/Subject) + EXIF(Artist/Copyright/ImageDescription). -IPTC:CodedCharacterSet=UTF8로 한글 보존.
  • 파일링: public/images/<토픽>/<id>.jpg + 사이드카 .json(provenance) + index.psv.
  • 인자는 환경변수(URL/TOPIC/CREDIT/PAGEURL/PERMISSION). 셸 인젝션 방지 안전() 필터.
검증: 한글 토픽/출처/허가 각인·역확인 성공(exiftool -charset iptc=utf8). 컴파일·실행 OK.

서버 통합 (server.js)

MethodPath설명
POST/api/images/capture한선씨 엔진 spawn(execFile crownyc) — 도메인별 레이트리밋
GET/api/images?topic=전체 목록(관리)
GET/api/images/public?topic=허가된 이미지만(자체촬영/허락받음/CC) — 공개 안전
GET/api/images/topics토픽별 카운트
DELETE/api/images/:id삭제(저작권 삭제요청 즉시 대응)
(정적)/images/<토픽>/<file>디코딩+경로이탈 방지 수정
레이트리밋: 도메인별 지연(naver 3s·instagram 10s·default 3s), 429+retryAfter. 정적 핸들러 한글 경로 decodeURIComponent+normalize 경로이탈 차단.

UI

  • /gallery (gallery.html) — 관리자 캡처/브라우즈: URL+토픽+출처명+허가 선택(자체촬영/허락받음/CC/출처표기/미확인), 토픽 필터, 경로복사, 원본링크, 삭제. 저작권 경고 배너 상단 고정.
  • 공개 사이트 index.html 갤러리 섹션 — /api/images/public(허가만) 표시, 없으면 자동 숨김. 나폴리 톤.

저작권 안전 설계 (딥리서치 4에이전트 반영)

  • 출처표기 ≠ 면죄부. 식당 홍보=상업적 사용→공정이용(저작권법 제35조) 불가. 무단 사용 1장도 최대 500만원 벌금.
  • 자체촬영·허락받은 이미지 우선(자체 50%+). 타인 이미지는 DM/메일 허락+기록.
  • 허가 등급으로 공개 게이트: 미확인/출처표기 이미지는 공개 갤러리 제외(내부 참고용). 자체/허락/CC만 노출.
  • 삭제요청 즉시 대응(🗑 DELETE). UI 경고 배너 상시.
  • 인스타 2026 웹스크래핑 차단(datacenter IP/TLS 핑거프린팅/doc_id 로테이션) → 공개 og:image만 시도 가능, 직링크·허락 권장.

빌드 방식

울트라 린 워크플로(하이쿠 4에이전트 234K토큰): 스크래핑 기법/메타데이터 표준(IPTC·XMP·C2PA)/저작권윤리 딥리서치→오푸스 종합. 코어 한선씨·서버·UI·검증은 메인. 레이트리밋 관리=저동시성 워크플로+도메인 지연.

잔여

  • JSON-LD/srcset 추출 미구현(og:image 우선이라 대부분 커버). 동적렌더(CSR) 페이지 og 누락 가능.
  • 가시 워터마크 미적용(메타데이터 각인만 — PIL 12.2 가용, 필요시 추가).
  • 캡처/삭제 API 무인증(내부 도구) — 필요시 패밀리 패스코드 게이트.
  • SNS 업로드 시 메타데이터 제거됨(원본 서버 보유). C2PA Content Credentials 미래 옵션.

2026-06-14 추가: 가시 워터마크 + CIF 정본

워터마크: 브라우저 canvas로 출처(ⓒ <출처> · padella)를 사진 하단에 그라데이션 바로 각인 — 설치 불필요(브라우저 네이티브).

CIF 정본화: 캡처 jpg → canvas(≤512, 워터마크) → 픽셀 base64 → padella /api/images/cif 프록시 → crowny-image(image.crowny.org:9872) /encode → CIF v3(트릿트리) 저장, 출처는 CIF 헤더(생성자/서비스출처)에 네이티브. exiftool 불필요(정본=CIF).

  • 표시: /cif/:id → crowny-image /png/:id 렌더(브라우저 PNG, 같은 출처 프록시). index.psv 8번째 필드 cifId, display=cifId면 /cif/ 아니면 /images/.
  • 그레이스풀: crowny-image 미가동 시 캡처는 jpg로 남고 CIF만 스킵(명확한 안내).
검증: 캡처→/api/images/cif(합성픽셀)→CIF id(075be62a)→index cifId 기록→/cif/:id PNG 200 체인 OK. canvas 워터마크+픽셀화는 실제 브라우저 검증 필요(node-canvas 미설치, 추가설치 안 함).

한선씨 전용 진행도 (정직)

  • ✅ 코어 수집 = 이미지수집기.한선. CIF 코덱/서버 = crowny-image(한선씨 이미지서버.한선 + JS codec). 워터마크 = 브라우저 canvas(무설치).
  • ⚠️ 잔여 외부: curl(OS빌트인 네트워크), exiftool(brew설치 — CIF 정본화로 이제 선택). og:image 추출이 shell(grep/sed) — 한선씨 문자열화 여지. HTTPS 페치를 TLS.한선/소켓으로 한선씨화 가능(미적용).
  • CIF는 image.crowny.org가 가동돼야 함(별도 서비스/도메인).

2026-06-14 병행: exiftool 제거 + og추출 한선씨화 + 브라우저 시각검증

Track A — 한선씨 전용 강화

  • exiftool 완전 제거: 출처는 CIF 헤더(생성자/서비스출처) + 워터마크 + 사이드카로 일원화. 도구 체계() 호출은 curl·mkdir·printf(전부 OS 빌트인)뿐, brew설치 의존 0.
  • og:image 추출 한선씨화: shell grep/sed 제거 → og이미지추출(html) 한선씨 함수. curl로 HTML 앞 60000B만 저장(읽기() 16383자 한계 내 og 위치), 전방 윈도(키~키+400)에서 content=" 파싱. 함정: ①읽기() 16383자 캡 ②윈도를 og:image 앞까지 잡으면 직전 메타 content= 오인(전방 윈도로 수정) ③포함()==0 pos0 버그→부분() 비교.
  • 잔여: HTTPS 페치 curl(OS빌트인). 순수 한선씨 HTTPS는 TLS 아웃바운드 클라이언트 부재(HTTP클라이언트.한선=평문만)로 추후 과제.
Track B — 브라우저 시각검증 (Google Chrome 헤드리스, 추가설치 0)
  • --headless=new --screenshot으로 gallery cifConvert 흐름 실행 → 실브라우저에서 canvas 워터마크+픽셀화+CIF(씨앗 46351) 성공, 스크린샷 육안 확인.
  • 결과: ①워터마크(ⓒ 위키미디어 · padella)가 사진 하단에 선명 ②/cif/:id 렌더에도 워터마크 보존(트릿트리 재구성). 512×340.

2026-06-14 진행: HTTPS 페치 한선씨화 (네이티브 TLS 발견)

핵심 발견: crownyc VM에 네이티브 TLS 빌트인(opcode 800~803 TLS연결/쓰기/읽기/닫기, crowny_tls_connect via macOS Security.framework, crownyc가 -framework Security로 빌드됨)이 있다. 즉 curl/openssl 없이 한선씨만으로 HTTPS 가능(VM 런타임=한선씨의 일부, 외부 설치 프로그램 아님).

증명됨(end-to-end): TLS연결→TLS쓰기→TLS읽기로 실제 HTTPS에 200 OK 수신, 헤더경계(CRLFCRLF) 검출, 본문→파일 쓰기 동작(2011B 파일 생성 확인).

한선씨 함정 4종 회피(검증):

  • "\r"가 0x0D로 컴파일 안 됨 → CRLF=글자변환(13)+글자변환(10).
  • 읽기 16383·문자열 65535 캡 → 본문 청크 스트리밍 파일 덧쓰기(누적 금지).
  • EOF 블로킹 → Content-Length 바운드 읽기.
  • 예약어 반복횟수.
산출물: 한선씨HTTPS.한선(컴파일 OK) — HTTPS파일받기(호스트,경로,파일), URL분해, 길이추출. 학습 등록됨.

정직한 남은 하드닝(다음 단계, 미완):

  • 3xx 리다이렉트 추종(Location) — wikimedia 등이 리다이렉트해 첫 테스트가 HTML 수신.
  • Transfer-Encoding: chunked 디청킹.
  • 대형 바이너리 안전성 최종검증(현재 HTML 텍스트로만 왕복 확인).
  • 위 완료 후 이미지수집기.한선의 curl 2곳(페이지 fetch·이미지 download)을 한선씨HTTPS.한선으로 교체 → curl 완전 제거.
결론: "HTTPS를 순수 한선씨로" = 원리 증명 완료(네이티브 TLS). 프로덕션 HTTP 클라이언트(리다이렉트/청킹/바이너리)는 하드닝 1단계 더 필요. 이게 끝나면 도구 외부 설치 의존 0(OS 빌트인 date/mkdir만).


2026-06-14 (이어서): 리다이렉트 추종 + 바이너리 안전성 결론

한선씨HTTPS.한선 v2 — HTTPS다운로드(url,파일) 리다이렉트 추종(최대5회, Location 절대/상대), HTTPS요청이 "코드\|받음\|위치" 문자열 반환(혼합배열 회피), 상태코드/Location/Content-Length 파싱.

검증(curl 대조):

  • 텍스트 byte-perfect: github raw README 3662B를 curl과 바이트 완전동일 다운로드(cmp 통과). 리다이렉트 추종·Content-Length 스트리밍 정상.
  • ✅ 상태코드 정확: -404/-400을 curl과 동일하게 리포트.
  • 바이너리 잘림: git.png 9208B→4113B. 근본원인 규명: crownyc.c TLS_READ는 str_new(rbuf, rd)로 길이안전(바이너리 보존)이나, 이후 한선씨 문자열연산(글자수/부분/+/덧쓰기)이 널종단(strlen) → 0x00 바이트에서 truncate. HTML 등 텍스트(널 없음)는 정상.
도달성: VM 네이티브 TLS는 upload.wikimedia.org·raw.githubusercontent.com 도달(handle≥0), httpbin.org 불가. 일부 호스트는 봇 UA에 reset/4xx(curl과 동일 거동).

결론 & 남은 1단계:

  • HTTPS 페치를 순수 한선씨로 = 텍스트 완전 달성(네이티브 TLS, curl과 동일).
  • 바이너리 blob(이미지)는 한선씨 문자열 널종단 한계로 미달 → crownyc.c에 길이기반 TLS→파일 빌트인(TLS파일받기) 1개 추가하면 우회 가능(VM C 변경+재빌드 필요, 별도 작업).
  • 현 프로덕션 수집기: 안정성 위해 curl 유지(텍스트 og fetch도 일부 호스트 reset 대비). 한선씨HTTPS.한선은 검증된 네이티브 라이브러리로 보존, 빌트인 추가 후 결선.

2026-06-14 (완료): 순수 한선씨 바이너리 HTTPS — curl 완전 제거

crownyc VM 코어 픽스 2건(생태계 전체 TLS에 이로움):

  1. tls_read_cb 부분수신 버그 수정(crowny_tls.c) — 근본원인. read() 한 번으로 부분 수신을 noErr 반환 → SSLRead 레코드 프레이밍 깨져 바이너리 truncate. 요청 길이까지 read() 루프(블로킹 소켓, EINTR 재시도)로 수정. git.png 2742→9208B.
  2. crowny_tls_read wouldblock 재시도(crowny_tls.c) — errSSLWouldBlock+rd==0(미도착)을 0(EOF)로 오인하던 것 → usleep 재시도.
신규 VM 빌트인 TLS본문저장(opcode 806, arity 3)(crownyc.c + hanseonc_high.c): TLS본문저장(핸들,경로,최대) — C에서 HTTP 헤더 스킵(\r\n\r\n)+상태파싱+2xx 본문을 파일에 직접 fwrite(바이너리 안전). 한선씨 문자열 널종단 우회. 반환=본문바이트(2xx)/음수상태.

한선씨HTTPS.한선 완성: HTTPS다운로드(url,파일) = 리다이렉트 추종(HTTPS위치로 Location 해석) + TLS본문저장 바이너리 다운로드. curl과 byte/md5 완전동일(git.png 9208B 검증).

이미지수집기.한선 curl 완전 제거: 페이지 fetch·이미지 download 모두 HTTPS다운로드(네이티브 TLS). 체계()는 mkdir/printf만. 서버 경유 캡처 9208B 정확 검증.

빌드: cc -O2 -o crownyc crownyc.c -lm -framework Security -framework CoreFoundation + cc -O2 -o hanseonc_high hanseonc_high.c -lm. 백업 crownyc.bak.before806. 회귀 OK.

의의: "모든 설치 프로그램 한선씨 전용" — 이미지수집기의 외부 설치 의존(curl/exiftool) 0 달성. 네트워크=VM 네이티브 TLS(한선씨 런타임). 단, 일부 HTML 호스트는 봇 UA에 4xx/reset 가능(이미지 CDN은 광범위 동작).

잔여(다음 단계): 빠델라 완성도↑(Framer 디자인 폴리시) + 프레이머 대체 크라우니 웹퍼블리싱 도구(publishing.crowny.org:9890). 딥리서치 완료(컴포넌트트리 JSON·6컴포넌트·에디터·정적익스포트·게이트웨이 퍼블리시).