bizcard
Business card scanner + Google Contacts manager. Auto-detects business card images, extracts contact info via OCR (imageModel), confirms with user, saves to Google Contacts with configurable name format and card photo. Trigger: image that looks like a business card, or keywords "명함", "bizcard", "연락처 저장". Settings: /bizcard config
Install via CLI (Recommended)
clawhub install openclaw/skills/skills/project820/bizcardBizcard — 명함 스캐너 + 연락처 관리
명함 이미지를 받으면 자동 감지 → 전처리 → OCR → 사용자 확인 → Google Contacts 저장까지 처리한다.
Pipeline Overview
이미지 수신 → 명함 자동 감지
→ Gemini Flash OCR → 필드 파싱 → Name 포맷 적용
→ 사용자 확인 → 중복 감지 → Nano Banana Pro 보정 → Google Contacts 저장 + 사진 첨부
1. 자동 감지 (Trigger Detection)
키워드 매칭 (API 호출 없음)
메시지에 다음 키워드가 포함되면 즉시 명함 처리 모드 진입:
- 한국어: "명함", "연락처 저장", "연락처 추가"
- 영어: "bizcard", "business card", "save contact"
이미지 분석 (키워드 없이 이미지만 올라왔을 때)
imageModel에 다음을 요청:
이 이미지가 명함(business card)인지 판단해.
명함이면 YES, 아니면 NO만 답해.
명함 = 사람의 이름, 회사명, 연락처 정보가 인쇄된 카드 형태.
음식, 풍경, 스크린샷, 메모, 영수증 등은 NO.
- YES → 명함 처리 진행
- NO → 무시 (다른 스킬에 넘기거나 일반 응답)
2. 이미지 전처리 (ImageMagick)
2-1. 품질 평가
imageModel에 요청:
이 명함 이미지의 품질을 평가해:
- 텍스트가 선명하게 읽히는가? (CLEAR / BLURRY)
- 기울어져 있는가? (STRAIGHT / TILTED)
- 전체적으로 전처리가 필요한가? (NEEDS_PROCESSING / SKIP)
JSON으로 답해: {"clarity": "...", "tilt": "...", "preprocessing": "..."}
2-2. 전처리 실행 (NEEDS_PROCESSING일 때만)
# 요청별 고유 디렉터리 생성
BIZCARD_TMP=$(mktemp -d /tmp/bizcard-XXXXXXXX)
# 1. Deskew (기울기 보정)
magick "$BIZCARD_TMP/raw.jpg" -deskew 40% "$BIZCARD_TMP/deskew.jpg"
# 2. 콘트라스트 개선 + 선명화
magick "$BIZCARD_TMP/deskew.jpg" -normalize -sharpen 0x1 "$BIZCARD_TMP/enhanced.jpg"
전처리된 이미지로 OCR 진행.
2-3. SKIP일 때
원본 그대로 OCR 진행. 전처리 건너뜀.
3. OCR 필드 추출
imageModel(Gemini Flash)에 다음 JSON 구조로 추출 요청:
이 명함 이미지에서 연락처 정보를 추출해. 다음 JSON 형식으로 답해.
읽을 수 없는 필드는 null로 남겨.
{
"name_ko": "한글 이름",
"name_en": "English name",
"company_ko": "한글 회사명",
"company_en": "English company name",
"title_ko": "한글 직함",
"title_en": "English title",
"department": "부서",
"mobile": ["개인 휴대폰 배열"],
"email": ["이메일 배열"],
"locations": [
{
"label": "본사",
"phone": ["063-000-0000"],
"fax": ["063-000-0001"],
"address_ko": "서울특별시 강남구 테헤란로 123",
"address_en": null
},
{
"label": "영업부",
"phone": ["02-000-0000"],
"fax": ["02-000-0001"],
"address_ko": "경기도 성남시 분당구 판교로 456",
"address_en": null
}
],
"website": ["웹사이트 배열"],
"notes": "기타 (SNS, 자격증 등)",
"language": "명함의 주 언어 (ko / en / ja / zh / other)"
}
4. 전화번호 정규화
한국 번호를 국제 형식으로 변환:
| 원본 | 변환 |
|---|---|
010-1234-5678 | +82-10-1234-5678 |
02-1234-5678 | +82-2-1234-5678 |
031-123-4567 | +82-31-123-4567 |
규칙:
0으로 시작하는 한국 번호 → 앞의0을+82-로 교체+로 시작하는 해외 번호 → 원본 유지- 숫자 사이
-또는 공백은-로 통일
5. 이름 처리 규칙
5-1. 한국식 명함 (config: koreanStyleName=true, 기본값)
한국에서는 성과 이름을 분리하지 않는다. 비즈니스에서 "홍길동 대표", "김갑돌 과장"처럼 풀네임이 하나의 단위다.
People API 저장 시:
familyName→ 비움 (빈 문자열)givenName→ 풀네임 (예:홍길동)unstructuredName→ config 포맷 적용된 이름 (예:#홍길동 과장)
5-2. 외국 명함 (config: koreanStyleName=false이거나, OCR language가 ko가 아닌 경우)
외국인은 first name / last name 분리가 기본:
givenName→ first name (예:John)familyName→ last name (예:Smith)unstructuredName→ config 포맷 적용
Metadata
Not sure this is the right skill?
Describe what you want to build — we'll match you to the best skill from 16,000+ options.
Find the right skillPaste this into your clawhub.json to enable this plugin.
{
"plugins": {
"official-project820-bizcard": {
"enabled": true,
"auto_update": true
}
}
}