โ† All skills
Tencent SkillHub ยท AI

Bizcard

Business card scanner + Google Contacts manager. Auto-detects business card images, extracts contact info via OCR (imageModel), confirms with user, saves to...

skill openclawclawhub Free
0 Downloads
0 Stars
0 Installs
0 Score
High Signal

Business card scanner + Google Contacts manager. Auto-detects business card images, extracts contact info via OCR (imageModel), confirms with user, saves to...

โฌ‡ 0 downloads โ˜… 0 stars Unverified but indexed

Install for OpenClaw

Quick setup
  1. Download the package from Yavira.
  2. Extract the archive and review SKILL.md first.
  3. Import or place the package into your OpenClaw setup.

Requirements

Target platform
OpenClaw
Install method
Manual import
Extraction
Extract archive
Prerequisites
OpenClaw
Primary doc
SKILL.md

Package facts

Download mode
Yavira redirect
Package format
ZIP package
Source platform
Tencent SkillHub
What's included
README.md, SKILL.md, _meta.json, config.json, references/people-api-fields.md, templates/AGENTS.md

Validation

  • Use the Yavira download entry.
  • Review SKILL.md after the package is downloaded.
  • Confirm the extracted package contains the expected setup assets.

Install with your agent

Agent handoff

Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.

  1. Download the package from Yavira.
  2. Extract it into a folder your agent can access.
  3. Paste one of the prompts below and point your agent at the extracted folder.
New install

I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete.

Upgrade existing

I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run.

Trust & source

Release facts

Source
Tencent SkillHub
Verification
Indexed source record
Version
0.1.2

Documentation

ClawHub primary doc Primary doc: SKILL.md 45 sections Open source page

Bizcard โ€” ๋ช…ํ•จ ์Šค์บ๋„ˆ + ์—ฐ๋ฝ์ฒ˜ ๊ด€๋ฆฌ

๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์ž๋™ ๊ฐ์ง€ โ†’ ์ „์ฒ˜๋ฆฌ โ†’ OCR โ†’ ์‚ฌ์šฉ์ž ํ™•์ธ โ†’ Google Contacts ์ €์žฅ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Pipeline Overview

์ด๋ฏธ์ง€ ์ˆ˜์‹  โ†’ ๋ช…ํ•จ ์ž๋™ ๊ฐ์ง€ โ†’ Gemini Flash OCR โ†’ ํ•„๋“œ ํŒŒ์‹ฑ โ†’ Name ํฌ๋งท ์ ์šฉ โ†’ ์‚ฌ์šฉ์ž ํ™•์ธ โ†’ ์ค‘๋ณต ๊ฐ์ง€ โ†’ Nano Banana Pro ๋ณด์ • โ†’ Google Contacts ์ €์žฅ + ์‚ฌ์ง„ ์ฒจ๋ถ€

ํ‚ค์›Œ๋“œ ๋งค์นญ (API ํ˜ธ์ถœ ์—†์Œ)

๋ฉ”์‹œ์ง€์— ๋‹ค์Œ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜๋ฉด ์ฆ‰์‹œ ๋ช…ํ•จ ์ฒ˜๋ฆฌ ๋ชจ๋“œ ์ง„์ž…: ํ•œ๊ตญ์–ด: "๋ช…ํ•จ", "์—ฐ๋ฝ์ฒ˜ ์ €์žฅ", "์—ฐ๋ฝ์ฒ˜ ์ถ”๊ฐ€" ์˜์–ด: "bizcard", "business card", "save contact"

์ด๋ฏธ์ง€ ๋ถ„์„ (ํ‚ค์›Œ๋“œ ์—†์ด ์ด๋ฏธ์ง€๋งŒ ์˜ฌ๋ผ์™”์„ ๋•Œ)

imageModel์— ๋‹ค์Œ์„ ์š”์ฒญ: ์ด ์ด๋ฏธ์ง€๊ฐ€ ๋ช…ํ•จ(business card)์ธ์ง€ ํŒ๋‹จํ•ด. ๋ช…ํ•จ์ด๋ฉด YES, ์•„๋‹ˆ๋ฉด NO๋งŒ ๋‹ตํ•ด. ๋ช…ํ•จ = ์‚ฌ๋žŒ์˜ ์ด๋ฆ„, ํšŒ์‚ฌ๋ช…, ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๊ฐ€ ์ธ์‡„๋œ ์นด๋“œ ํ˜•ํƒœ. ์Œ์‹, ํ’๊ฒฝ, ์Šคํฌ๋ฆฐ์ƒท, ๋ฉ”๋ชจ, ์˜์ˆ˜์ฆ ๋“ฑ์€ NO. YES โ†’ ๋ช…ํ•จ ์ฒ˜๋ฆฌ ์ง„ํ–‰ NO โ†’ ๋ฌด์‹œ (๋‹ค๋ฅธ ์Šคํ‚ฌ์— ๋„˜๊ธฐ๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ์‘๋‹ต)

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-567802-1234-5678+82-2-1234-5678031-123-4567+82-31-123-4567 ๊ทœ์น™: 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•œ๊ตญ ๋ฒˆํ˜ธ โ†’ ์•ž์˜ 0์„ +82-๋กœ ๊ต์ฒด +๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•ด์™ธ ๋ฒˆํ˜ธ โ†’ ์›๋ณธ ์œ ์ง€ ์ˆซ์ž ์‚ฌ์ด - ๋˜๋Š” ๊ณต๋ฐฑ์€ -๋กœ ํ†ต์ผ

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 ํฌ๋งท ์ ์šฉ

5-3. Korean Reading (config: koreanReading=true)

์™ธ๊ตญ์–ด ๋ช…ํ•จ์ผ ๋•Œ, ์ด๋ฆ„๊ณผ ํšŒ์‚ฌ๋ช…์„ ํ•œ๊ตญ์–ด๋กœ ๋…์Œ(transliteration)ํ•˜์—ฌ ๊ธฐ๋ก: ์›๋ณธ๋…์ŒJohn Smith์กด ์Šค๋ฏธ์ŠคGoogle LLC๊ตฌ๊ธ€Toyota Motorํ† ์š”ํƒ€ ๋ชจํ„ฐFranรงois Dupontํ”„๋ž‘์ˆ˜์•„ ๋’คํ ์ ์šฉ ๋ฐฉ๋ฒ•: imageModel์— "์ด ์ด๋ฆ„/ํšŒ์‚ฌ๋ช…์„ ํ•œ๊ตญ์–ด ์™ธ๋ž˜์–ด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋…์Œํ•ด์ค˜" ์š”์ฒญ ์ด๋ฆ„ ๋…์Œ โ†’ People API phoneticName ํ•„๋“œ์— ์ €์žฅ (๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ!) ํšŒ์‚ฌ๋ช… ๋…์Œ โ†’ biographies์— ๊ธฐ๋ก People API ์ €์žฅ: names[].phoneticGivenName = "ํ€˜ ํ›™ ์›จ์ธ" โ† ํ’€๋„ค์ž„ ๋…์Œ์„ ํ•˜๋‚˜๋กœ names[].phoneticFamilyName = "" โ† ๋น„์›€ ๊ทœ์น™: ๋…์Œ์€ ์„ฑ/์ด๋ฆ„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ’€๋„ค์ž„ ๋…์Œ์„ phoneticGivenName์— ํ†ต์งธ๋กœ ๋„ฃ๋Š”๋‹ค. ์˜ˆ์‹œ: Kweh Hoong Wayne โ†’ phoneticGivenName=ํ€˜ ํ›™ ์›จ์ธ ์˜ˆ์‹œ: Franรงois Dupont โ†’ phoneticGivenName=ํ”„๋ž‘์ˆ˜์•„ ๋’คํ ํšจ๊ณผ: Google Contacts์—์„œ "ํ€˜ ํ›™ ์›จ์ธ"์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด๋„ ํ•ด๋‹น ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. koreanReading=false์ด๋ฉด ๋…์Œ ์ƒ๋žต.

6. Name ํฌ๋งท ์ ์šฉ

config ์„ค์ •์„ ์ฝ์–ด unstructuredName (displayName)์„ ์ƒ์„ฑํ•œ๋‹ค.

์ ์šฉ ์ˆœ์„œ

1. ๊ธฐ๋ณธ ์ด๋ฆ„: "ํ™๊ธธ๋™" 2. hashtag=true โ†’ "#ํ™๊ธธ๋™" 3. appendTitle=true โ†’ "#ํ™๊ธธ๋™ ๊ณผ์žฅ" 4. appendCompany=true โ†’ "#ํ™๊ธธ๋™ ๊ณผ์žฅ (ABC์ฃผ์‹ํšŒ์‚ฌ)"

์กฐํ•ฉ ์˜ˆ์‹œ

hashtagappendTitleappendCompany๊ฒฐ๊ณผoffoffoffํ™๊ธธ๋™onoffoff#ํ™๊ธธ๋™offonoffํ™๊ธธ๋™ ๊ณผ์žฅoffoffonํ™๊ธธ๋™ (ABC์ฃผ์‹ํšŒ์‚ฌ)ononon#ํ™๊ธธ๋™ ๊ณผ์žฅ (ABC์ฃผ์‹ํšŒ์‚ฌ)

People API ์ €์žฅ ์‹œ (ํ•œ๊ตญ์‹)

names[].unstructuredName โ†’ ํฌ๋งท๋œ displayName (์˜ˆ: #ํ™๊ธธ๋™ ๊ณผ์žฅ) names[].givenName โ†’ ํ’€๋„ค์ž„ (์˜ˆ: ํ™๊ธธ๋™) names[].familyName โ†’ ๋น„์›€

People API ์ €์žฅ ์‹œ (์™ธ๊ตญ์‹)

names[].unstructuredName โ†’ ํฌ๋งท๋œ displayName (์˜ˆ: #John Smith, VP) names[].givenName โ†’ first name (์˜ˆ: John) names[].familyName โ†’ last name (์˜ˆ: Smith)

7. ์‚ฌ์šฉ์ž ํ™•์ธ ํ”Œ๋กœ์šฐ

OCR + ํฌ๋งท ๊ฒฐ๊ณผ๋ฅผ ์•„๋ž˜ ํ…œํ”Œ๋ฆฟ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ํฌ๋งท ๋ณ€๊ฒฝ ๊ธˆ์ง€. ํ•œ๊ตญ ๋ช…ํ•จ ํ…œํ”Œ๋ฆฟ (์ด ํฌ๋งท ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ): ๐Ÿ“‡ ๋ช…ํ•จ ์ธ์‹ ๊ฒฐ๊ณผ ๐Ÿ‘ค #ํ™๊ธธ๋™ ๊ณผ์žฅ (ABC์ฃผ์‹ํšŒ์‚ฌ) ๐Ÿข ABC์ฃผ์‹ํšŒ์‚ฌ / ์˜์—…๋ถ€ ๐Ÿ’ผ ๊ณผ์žฅ ๐Ÿ“ฑ +82-10-1234-5678 ๐Ÿ“ง gdhong@example.co.kr ๐ŸŒ www.example.co.kr ๐Ÿ“ ๋ณธ์‚ฌ: ๐Ÿ“ž +82-63-450-3500 / ๐Ÿ“  +82-63-450-3517 ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 123 ๐Ÿ“ ์˜์—…๋ถ€: ๐Ÿ“ž +82-2-597-8071~3 / ๐Ÿ“  +82-2-586-4388 ๊ฒฝ๊ธฐ๋„ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ํŒ๊ต๋กœ 456 ๐Ÿ–ผ๏ธ ๋ช…ํ•จ ์‚ฌ์ง„ โ†’ ์—ฐ๋ฝ์ฒ˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์œผ๋กœ ์ €์žฅ 1. ์ €์žฅ 2. ์ˆ˜์ • 3. ์ทจ์†Œ ๊ฑฐ์ ์ด 1๊ฐœ๋ฟ์ด๋ฉด ๐Ÿ“ label ์—†์ด ํ•œ ์ค„๋กœ: ๐Ÿ“ž +82-2-9876-5432 ๐Ÿ“  +82-2-9876-5433 ๐Ÿ“ ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 123 ์™ธ๊ตญ ๋ช…ํ•จ ํ…œํ”Œ๋ฆฟ (koreanReading=true, ์ด ํฌ๋งท ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ): ๐Ÿ“‡ ๋ช…ํ•จ ์ธ์‹ ๊ฒฐ๊ณผ ๐Ÿ‘ค John Smith (์กด ์Šค๋ฏธ์Šค) ๐Ÿข Google LLC (๊ตฌ๊ธ€) ๐Ÿ’ผ VP of Engineering ๐Ÿ“ฑ +1-555-123-4567 ๐Ÿ“ง jsmith@example.com ๐Ÿ–ผ๏ธ ๋ช…ํ•จ ์‚ฌ์ง„ โ†’ ์—ฐ๋ฝ์ฒ˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์œผ๋กœ ์ €์žฅ 1. ์ €์žฅ 2. ์ˆ˜์ • 3. ์ทจ์†Œ ๊ทœ์น™: ์ด๋ชจ์ง€ ์ˆœ์„œ ๊ณ ์ •: ๐Ÿ‘ค๐Ÿข๐Ÿ’ผ๐Ÿ“ฑ๐Ÿ“ž๐Ÿ“ ๐Ÿ“ง๐ŸŒ๐Ÿ“๐Ÿ–ผ๏ธ ์—†๋Š” ํ•„๋“œ๋Š” ํ•ด๋‹น ์ค„ ์ž์ฒด๋ฅผ ์ƒ๋žต (๋นˆ ์ค„ ๊ธˆ์ง€) ๋ถ€๊ฐ€ ์„ค๋ช…์ด๋‚˜ "20๋…„์ฐจ ์ „๋ฌธ๊ฐ€" ๊ฐ™์€ OCR ์žก๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„์— ๋„ฃ์ง€ ๋งˆ๋ผ. ํƒ€์ดํ‹€ ํ•„๋“œ์—๋งŒ ํ‘œ์‹œ. ์ด๋ฆ„ ๋ผ์ธ(๐Ÿ‘ค)์—๋Š” config ํฌ๋งท๋งŒ ์ ์šฉ: #์ด๋ฆ„ ์งํ•จ (ํšŒ์‚ฌ๋ช…) ์งํ•จ์€ ๐Ÿ’ผ ์ค„์— ๋ณ„๋„ ํ‘œ์‹œ. ๐Ÿ‘ค ์ค„์˜ ์งํ•จ์€ config appendTitle ์ ์šฉ ์‹œ์—๋งŒ, ์งง๊ฒŒ. ALL CAPS ๊ธˆ์ง€. โœ… ๐Ÿ‘ค #Kweh Hoong Wayne + ๐Ÿ’ผ Technical Service Manager โŒ ๐Ÿ‘ค #Kweh Hoong Wayne TECHNICAL SERVICE MANAGER ํ•˜๋‹จ์€ ๋ฐ˜๋“œ์‹œ 1. ์ €์žฅ / 2. ์ˆ˜์ • / 3. ์ทจ์†Œ ๋ฒˆํ˜ธ ์„ ํƒ. "์ €์žฅํ• ๊นŒ?" ๊ฐ™์€ ์„œ์ˆ ํ˜• ๊ธˆ์ง€. ๋ณต์ˆ˜ ๊ฑฐ์ : ๋ช…ํ•จ์— ์ฃผ์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด ๊ฑฐ์ (location) ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ์ถœ๋ ฅ. ๊ฐ ๊ฑฐ์ ์€ ๐Ÿ“ label + ํ•ด๋‹น ๊ฑฐ์ ์˜ ๐Ÿ“ž/๐Ÿ“ /์ฃผ์†Œ๋ฅผ ๋ฌถ์–ด์„œ ํ‘œ์‹œ. ๋ช…ํ•จ์—์„œ ์ „ํ™”/ํŒฉ์Šค/์ฃผ์†Œ๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ๋ณ„๋„ ๊ฑฐ์ ์œผ๋กœ ๋ถ„๋ฆฌ. ์ ˆ๋Œ€ ๋ณ‘ํ•ฉํ•˜์ง€ ๋งˆ๋ผ. ๊ฑฐ์  label(๋ณธ์‚ฌ/๊ณต์žฅ/์˜์—…๋ถ€ ๋“ฑ)์€ ๋ช…ํ•จ์—์„œ ์ถ”์ถœ. ์—†์œผ๋ฉด "๊ฑฐ์ 1", "๊ฑฐ์ 2"๋กœ ํ‘œ์‹œ.

์‘๋‹ต ์ฒ˜๋ฆฌ

์ž…๋ ฅ๋™์ž‘1์ €์žฅ ์ง„ํ–‰2"๋ญ˜ ์ˆ˜์ •ํ• ๊นŒ?" ๋ฌผ์€ ๋’ค, ์ˆ˜์ • ํ›„ ๋‹ค์‹œ 1/2/3 ์„ ํƒ3์ทจ์†Œ ๋ฒˆํ˜ธ ์™ธ ํ…์ŠคํŠธ ์ž…๋ ฅ๋„ ํ—ˆ์šฉ: "ใ…‡ใ…‡", "ok" โ†’ 1๋ฒˆ ์ฒ˜๋ฆฌ, "์ทจ์†Œ" โ†’ 3๋ฒˆ ์ฒ˜๋ฆฌ. ํ•˜์ง€๋งŒ ๋ฒˆํ˜ธ ์ž…๋ ฅ์„ ์šฐ์„  ์œ ๋„ํ•œ๋‹ค.

8. ๋ช…ํ•จ ์ด๋ฏธ์ง€ ๋ณด์ • + ์‚ฌ์ง„ ์—…๋กœ๋“œ (ํ•ญ์ƒ ์‹คํ–‰)

cardAsPhoto=true์ด๋ฉด ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•œ๋‹ค. ๋ชจ๋“  ๋ช…ํ•จ์„ ์ผ๊ด€๋˜๊ฒŒ ๋ณด์ •ํ•œ๋‹ค. ๋ง๋กœ๋งŒ "์ ์šฉํ–ˆ์–ด" ํ•˜์ง€ ๋ง๊ณ  ์‹ค์ œ๋กœ exec ๋„๊ตฌ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ผ.

8-1. ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ /tmp์— ๋ณต์‚ฌ

BIZCARD_TMP=$(mktemp -d /tmp/bizcard-XXXXXXXX) cp /path/to/์›๋ณธ๋ช…ํ•จ์ด๋ฏธ์ง€.jpg "$BIZCARD_TMP/raw.jpg"

8-2. Nano Banana Pro๋กœ ์ด๋ฏธ์ง€ ๋ณด์ • (ํ•ต์‹ฌ!)

์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ Nano Banana Pro์— ๋ณด๋‚ด์„œ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ + ์ •๋ฉด ๋ณด์ • + 1:1 ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋ณ€ํ™˜. python3 <<'PYEOF' import urllib.request, json, base64, os with open(os.environ["BIZCARD_TMP"] + "/raw.jpg", "rb") as f: img_b64 = base64.b64encode(f.read()).decode() api_key = os.environ.get("NANO_BANANA_API_KEY", "") if not api_key: print("ERROR: NANO_BANANA_API_KEY not set") exit(1) url = f"https://generativelanguage.googleapis.com/v1beta/models/nano-banana-pro-preview:generateContent?key={api_key}" payload = { "contents": [{ "parts": [ {"inlineData": {"mimeType": "image/jpeg", "data": img_b64}}, {"text": "์ด ์‚ฌ์ง„์—์„œ ๋ช…ํ•จ ์นด๋“œ๋งŒ ์ž˜๋ผ๋‚ด์„œ ์ •๋ฉด์œผ๋กœ ๋ณด์ •ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ค˜. ๋ฐฐ๊ฒฝ ์™„์ „ ์ œ๊ฑฐ, ๋ช…ํ•จ๋งŒ ๋‚จ๊ธฐ๊ณ , ํฐ์ƒ‰ ์—ฌ๋ฐฑ์„ ์ถ”๊ฐ€ํ•ด์„œ 1:1 ์ •์‚ฌ๊ฐํ˜• ๋น„์œจ๋กœ ๋งŒ๋“ค์–ด์ค˜. ๋ช…ํ•จ ๋‚ด์šฉ์€ ์ „๋ถ€ ๋ณด์กดํ•ด."} ] }], "generationConfig": { "responseModalities": ["TEXT", "IMAGE"] } } data = json.dumps(payload).encode() req = urllib.request.Request(url, data=data, method="POST") req.add_header("Content-Type", "application/json") resp = urllib.request.urlopen(req, timeout=60) result = json.loads(resp.read()) for part in result["candidates"][0]["content"]["parts"]: if "inlineData" in part: img_data = base64.b64decode(part["inlineData"]["data"]) with open(os.environ["BIZCARD_TMP"] + "/clean.jpg", "wb") as f: f.write(img_data) print(f"OK: clean.jpg ({len(img_data)} bytes)") elif "text" in part: print(f"Text: {part['text'][:100]}") PYEOF ๊ฒฐ๊ณผ: $BIZCARD_TMP/clean.jpg โ€” 1024x1024, ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ, ์ •๋ฉด ๋ณด์ •, 1:1 ์ •์‚ฌ๊ฐํ˜•.

8-3. ๋ณด์ •๋œ ์ด๋ฏธ์ง€๋ฅผ Google Contacts์— ์—…๋กœ๋“œ

clean.jpg๋ฅผ ์—…๋กœ๋“œํ•œ๋‹ค. raw.jpg๊ฐ€ ์•„๋‹ˆ๋‹ค. python3 <<'PYEOF' import urllib.request, os, json, base64 with open(os.environ["BIZCARD_TMP"] + "/clean.jpg", "rb") as f: photo_bytes = base64.b64encode(f.read()).decode() data = json.dumps({"photoBytes": photo_bytes}).encode() resource_name = os.environ["RESOURCE_NAME"] req = urllib.request.Request( f"https://gateway.maton.ai/google-contacts/v1/{resource_name}:updateContactPhoto", data=data, method="PATCH" ) req.add_header("Authorization", f"Bearer {os.environ['MATON_API_KEY']}") req.add_header("Content-Type", "application/json") result = json.load(urllib.request.urlopen(req)) print("Photo uploaded:", result.get("person", {}).get("resourceName", "unknown")) PYEOF

8-4. ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ

rm -rf "$BIZCARD_TMP" ์ ˆ๋Œ€ ๊ธˆ์ง€: ๋ณด์ •์„ "์‹คํ–‰ํ–ˆ๋‹ค"๊ณ  ๋ง๋งŒ ํ•˜๊ณ  ์‹ค์ œ exec๋ฅผ ์•ˆ ํ•˜๋Š” ๊ฒƒ clean.jpg ๋Œ€์‹  raw.jpg(์›๋ณธ)๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ ImageMagick -deskew๋‚˜ -distort Perspective ์‚ฌ์šฉ (Nano Banana Pro๊ฐ€ ์ „๋ถ€ ์ฒ˜๋ฆฌ) Nano Banana Pro API ์‹คํŒจ ์‹œ: ์›๋ณธ(raw.jpg)์„ ๊ทธ๋Œ€๋กœ ์—…๋กœ๋“œํ•˜๊ณ  "์ด๋ฏธ์ง€ ๋ณด์ • ์‹คํŒจ: ์›๋ณธ์œผ๋กœ ์ €์žฅ" ์•Œ๋ฆผ.

9. ์ค‘๋ณต ๊ฐ์ง€ (์ž๋™ 2ํ•„๋“œ ๋งค์นญ)

์ €์žฅ ์ „ ๋ฐ˜๋“œ์‹œ ์ด๋ฆ„ + ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ 2๊ฐœ ํ•„๋“œ๋กœ ๊ธฐ์กด ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ž๋™ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜์ง€ ์•Š์•„๋„ ํ•ญ์ƒ ์‹คํ–‰.

๊ฒ€์ƒ‰ ๋กœ์ง

# 1๋‹จ๊ณ„: ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ GET /google-contacts/v1/people:searchContacts?query=ํ™๊ธธ๋™&readMask=names,phoneNumbers,emailAddresses # 2๋‹จ๊ณ„: ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ๋กœ ๊ฒ€์ƒ‰ GET /google-contacts/v1/people:searchContacts?query=%2B82-10-1234-5678&readMask=names,phoneNumbers,emailAddresses ๋ฒˆํ˜ธ ๊ฒ€์ƒ‰ ์‹œ ์ •๊ทœํ™”๋œ +82 ํฌ๋งท๊ณผ ์›๋ณธ(010) ํฌ๋งท ๋ชจ๋‘๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ˆ„๋ฝ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋งค์นญ ํŒ์ •

์ด๋ฆ„ ์ผ์น˜๋ฒˆํ˜ธ ์ผ์น˜ํŒ์ •๋™์ž‘โœ…โœ…ํ™•์ • ์ค‘๋ณต์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ต์…˜ ์ œ์‹œโœ…โŒ๋™๋ช…์ด์ธ ๊ฐ€๋Šฅ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ ํ›„ ์ง„ํ–‰โŒโœ…๋ฒˆํ˜ธ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ ํ›„ ์ง„ํ–‰โŒโŒ์‹ ๊ทœ๋ฐ”๋กœ ์ €์žฅ

ํ™•์ • ์ค‘๋ณต ์‹œ ์ถœ๋ ฅ (์ด๋ฆ„+๋ฒˆํ˜ธ ๋ชจ๋‘ ์ผ์น˜)

์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ํฌ๋งท ๋ณ€๊ฒฝ ๊ธˆ์ง€. โš ๏ธ ์ค‘๋ณต ์—ฐ๋ฝ์ฒ˜ ๋ฐœ๊ฒฌ ๊ธฐ์กด: ๐Ÿ‘ค ํ™๊ธธ๋™ ๐Ÿ“ฑ +82-10-1234-5678 ๐Ÿ“ง gdhong@example.co.kr ์ด๋ฒˆ ๋ช…ํ•จ: ๐Ÿ‘ค #ํ™๊ธธ๋™ ๊ณผ์žฅ (ABC์ฃผ์‹ํšŒ์‚ฌ) ๐Ÿ“ฑ +82-10-1234-5678 ๐Ÿ“ง gdhong@example.co.kr 1. ์ƒˆ๋กœ ์ €์žฅ 2. ๊ธฐ์กด ์—…๋ฐ์ดํŠธ 3. ์ทจ์†Œ

๋ถ€๋ถ„ ์ผ์น˜ ์‹œ ์ถœ๋ ฅ (์ด๋ฆ„๋งŒ ๋˜๋Š” ๋ฒˆํ˜ธ๋งŒ ์ผ์น˜)

์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ํฌ๋งท ๋ณ€๊ฒฝ ๊ธˆ์ง€. โ„น๏ธ ์œ ์‚ฌ ์—ฐ๋ฝ์ฒ˜ ๋ฐœ๊ฒฌ ๊ธฐ์กด: ๐Ÿ‘ค ํ™๊ธธ๋™ ๐Ÿ“ฑ +82-10-9999-0000 ์ด๋ฒˆ ๋ช…ํ•จ: ๐Ÿ‘ค #ํ™๊ธธ๋™ ๊ณผ์žฅ (ABC์ฃผ์‹ํšŒ์‚ฌ) ๐Ÿ“ฑ +82-10-1234-5678 ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ„. ๊ทธ๋Œ€๋กœ ์ƒˆ๋กœ ์ €์žฅํ• ๊นŒ?

์‹ ๊ทœ (์ค‘๋ณต ์—†์Œ)

์ค‘๋ณต ์—†์œผ๋ฉด ์ค‘๋ณต ๊ด€๋ จ ๋ฉ”์‹œ์ง€ ์ž์ฒด๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ”๋กœ ์‚ฌ์šฉ์ž ํ™•์ธ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

10. Google Contacts ์ €์žฅ

Maton API Gateway (People API)๋ฅผ ์‚ฌ์šฉ. ์ „์ฒด ํ•„๋“œ + ์ปค์Šคํ…€ Name + ์‚ฌ์ง„ ์ง€์›.

์—ฐ๋ฝ์ฒ˜ ์ƒ์„ฑ

python <<'EOF' import urllib.request, os, json # ํ•œ๊ตญ์‹ ๋ช…ํ•จ ์˜ˆ์‹œ (koreanStyleName=true) contact = { "names": [{ "unstructuredName": "#ํ™๊ธธ๋™ ๊ณผ์žฅ", "givenName": "ํ™๊ธธ๋™", "familyName": "" }], "organizations": [{ "name": "ABC์ฃผ์‹ํšŒ์‚ฌ", "title": "๊ณผ์žฅ", "department": "์˜์—…๋ถ€", "type": "work" }], "emailAddresses": [ {"value": "gdhong@example.co.kr", "type": "work"} ], "phoneNumbers": [ {"value": "+82-10-1234-5678", "type": "mobile"}, {"value": "+82-2-9876-5432", "type": "work"} ], "addresses": [ {"formattedValue": "์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 123", "type": "work"} ], "urls": [ {"value": "https://www.example.co.kr", "type": "work"} ] } data = json.dumps(contact).encode() req = urllib.request.Request( 'https://gateway.maton.ai/google-contacts/v1/people:createContact', data=data, method='POST' ) req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') result = json.load(urllib.request.urlopen(req)) print(json.dumps(result, indent=2)) EOF

๋ช…ํ•จ ์‚ฌ์ง„์„ ์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„์œผ๋กœ ์ €์žฅ (cardAsPhoto=true)

Section 8์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”ฐ๋ฅธ๋‹ค. ๋ณด์ • + ์—…๋กœ๋“œ๋Š” Section 8์—์„œ ์ผ๊ด„ ์ฒ˜๋ฆฌ. ํŒŒ์ดํ”„๋ผ์ธ ์ข…๋ฃŒ ์‹œ (์„ฑ๊ณต, ์ทจ์†Œ, ์—๋Ÿฌ ๋ฌด๊ด€) $BIZCARD_TMP ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์ฒด ์‚ญ์ œ (rm -rf "$BIZCARD_TMP"). ๋‹ค๋ฅธ ์„ธ์…˜์˜ ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

์„ค์ • ์กฐํšŒ

์‚ฌ์šฉ์ž๊ฐ€ /bizcard config ๋˜๋Š” "๋ช…ํ•จ ์„ค์ •"์„ ์ž…๋ ฅํ•˜๋ฉด, ์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค. ์ ˆ๋Œ€ ๋‹ค๋ฅธ ํฌ๋งท์œผ๋กœ ๋ฐ”๊พธ์ง€ ๋งˆ๋ผ. on/off ๊ฐ’๋งŒ config.json ์‹ค์ œ ์ƒํƒœ์— ๋งž์ถฐ ๊ต์ฒด. ์ถœ๋ ฅ ํ…œํ”Œ๋ฆฟ (์ด ํฌ๋งท ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ): ๐Ÿ“‡ Bizcard Settings 1. Hashtag : on ๐ŸŸข โ€” #์ด๋ฆ„ (์นด์นด์˜ค ์ž๋™์ถ”๊ฐ€ ๋ฐฉ์ง€) 2. Append title : on ๐ŸŸข โ€” ์ด๋ฆ„ ๋’ค์— ์งํ•จ 3. Append company : off โŒ โ€” ์ด๋ฆ„ ๋’ค์— (ํšŒ์‚ฌ๋ช…) 4. Card as photo : on ๐ŸŸข โ€” ๋ช…ํ•จโ†’์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„ 5. Korean reading : on ๐ŸŸข โ€” ์™ธ๊ตญ ์ด๋ฆ„ ํ•œ๊ตญ์–ด ๋…์Œ 6. Korean style name : on ๐ŸŸข โ€” ์„ฑ ๋น„์›€, ์ด๋ฆ„์— ํ’€๋„ค์ž„ 00 = Reset โ™บ 38 = All on ๐ŸŸข 49 = All off โŒ ๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅํ•˜๋ฉด onโ†”off ์ „ํ™˜. ์ด๋ชจ์ง€ ๊ทœ์น™: on โ†’ ๐ŸŸข, off โ†’ โŒ. ๊ฐ’ ๋ฐ”๋กœ ๋’ค์— ์ด๋ชจ์ง€ ๋ถ™์ธ๋‹ค. ๊ทœ์น™: ๋ฒˆํ˜ธ, ํ•ญ๋ชฉ๋ช…, ์„ค๋ช…์€ ๊ณ ์ •. ๋ณ€๊ฒฝ ๊ธˆ์ง€. on / off ๊ฐ’๋งŒ config.json ์‹ค์ œ ์ƒํƒœ์— ๋งž์ถฐ ์ถœ๋ ฅ. ๋ถˆ๋ฆฟ ๋ฆฌ์ŠคํŠธ(โ€ข)๋‚˜ ๋‹ค๋ฅธ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ ๊ธˆ์ง€. ๋ถ€๊ฐ€ ์„ค๋ช…์ด๋‚˜ "์›ํ•˜๋ฉด ๋ฐ”๊ฟ”์ค„๊ฒŒ" ๊ฐ™์€ ๋ฉ˜ํŠธ ์ถ”๊ฐ€ ๊ธˆ์ง€.

์„ค์ • ๋ณ€๊ฒฝ โ€” ๋ฒˆํ˜ธ ํ† ๊ธ€

๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅํ•˜๋ฉด ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฐ˜๋Œ€๋กœ ์ž๋™ ์ „ํ™˜๋œ๋‹ค. config.json ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ์ˆ˜์ •ํ•˜๊ณ , ์•„๋ž˜ ์‘๋‹ต ํฌ๋งท ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ. ์„ธ์…˜ ๊ทœ์น™: /bizcard config ์‹คํ–‰ ํ›„ ๋‹ค์Œ 1ํšŒ ์ž…๋ ฅ๋งŒ ์„ค์ • ๋ณ€๊ฒฝ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ ์ดํ›„์˜ ์ˆซ์ž ์ž…๋ ฅ์€ ์ผ๋ฐ˜ ๋Œ€ํ™”๋กœ ์ทจ๊ธ‰. ์„ค์ •์„ ์—ฐ์† ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด /bizcard config๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅ. ์˜ˆ์‹œ 1: ํ˜„์žฌ 3. Append company : off ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ 3 ์ž…๋ ฅ ์‘๋‹ต (์ด ํฌ๋งท ๊ทธ๋Œ€๋กœ): 3. Append company : on ๐ŸŸข All set now. ์˜ˆ์‹œ 2: ํ˜„์žฌ 1. Hashtag : on ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ 1 ์ž…๋ ฅ ์‘๋‹ต (์ด ํฌ๋งท ๊ทธ๋Œ€๋กœ): 1. Hashtag : off โŒ All set now. ๊ทœ์น™: ๋ณ€๊ฒฝ๋œ ํ•ญ๋ชฉ๋งŒ ํ•œ ์ค„ ์ถœ๋ ฅ + "All set now." ๊ทธ ์™ธ ์ถ”๊ฐ€ ๋ฉ˜ํŠธ ๊ธˆ์ง€.

ํŠน์ˆ˜ ๋ช…๋ น

์ฝ”๋“œ๋™์ž‘์„ค๋ช…00Reset๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”38All on์ „์ฒด ์„ค์ • ์ผœ๊ธฐ49All off์ „์ฒด ์„ค์ • ๋„๊ธฐ ์ž…๋ ฅ: 49 ์‘๋‹ต: ๐Ÿ“‡ Bizcard Settings 1. Hashtag : off โŒ โ€” #์ด๋ฆ„ (์นด์นด์˜ค ์ž๋™์ถ”๊ฐ€ ๋ฐฉ์ง€) 2. Append title : off โŒ โ€” ์ด๋ฆ„ ๋’ค์— ์งํ•จ 3. Append company : off โŒ โ€” ์ด๋ฆ„ ๋’ค์— (ํšŒ์‚ฌ๋ช…) 4. Card as photo : off โŒ โ€” ๋ช…ํ•จโ†’์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„ 5. Korean reading : off โŒ โ€” ์™ธ๊ตญ ์ด๋ฆ„ ํ•œ๊ตญ์–ด ๋…์Œ 6. Korean style name : off โŒ โ€” ์„ฑ ๋น„์›€, ์ด๋ฆ„์— ํ’€๋„ค์ž„ 00 = Reset โ™บ 38 = All on ๐ŸŸข 49 = All off โŒ All off. All set now. ์ž…๋ ฅ: 00 ์‘๋‹ต: ๐Ÿ“‡ Bizcard Settings (defaults) 1. Hashtag : on ๐ŸŸข โ€” #์ด๋ฆ„ (์นด์นด์˜ค ์ž๋™์ถ”๊ฐ€ ๋ฐฉ์ง€) 2. Append title : on ๐ŸŸข โ€” ์ด๋ฆ„ ๋’ค์— ์งํ•จ 3. Append company : off โŒ โ€” ์ด๋ฆ„ ๋’ค์— (ํšŒ์‚ฌ๋ช…) 4. Card as photo : on ๐ŸŸข โ€” ๋ช…ํ•จโ†’์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„ 5. Korean reading : on ๐ŸŸข โ€” ์™ธ๊ตญ ์ด๋ฆ„ ํ•œ๊ตญ์–ด ๋…์Œ 6. Korean style name : on ๐ŸŸข โ€” ์„ฑ ๋น„์›€, ์ด๋ฆ„์— ํ’€๋„ค์ž„ 00 = Reset โ™บ 38 = All on ๐ŸŸข 49 = All off โŒ Reset to defaults. All set now.

๋ฒˆํ˜ธ-ํ‚ค ๋งคํ•‘ (๊ณ ์ •)

#config key์„ค๋ช…1hashtag์ด๋ฆ„ ์•ž์— # ์ถ”๊ฐ€ (์นด์นด์˜คํ†ก ์ž๋™์ถ”๊ฐ€ ๋ฐฉ์ง€)2appendTitle์ด๋ฆ„ ๋’ค์— ์งํ•จ ์ถ”๊ฐ€3appendCompany์ด๋ฆ„ ๋’ค์— (ํšŒ์‚ฌ๋ช…) ์ถ”๊ฐ€4cardAsPhoto๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„์œผ๋กœ ์ €์žฅ5koreanReading์™ธ๊ตญ ๋ช…ํ•จ ์ด๋ฆ„/ํšŒ์‚ฌ๋ฅผ ํ•œ๊ตญ์–ด ๋…์Œ์œผ๋กœ ๊ธฐ๋ก6koreanStyleNameํ•œ๊ตญ ๋ช…ํ•จ: familyName ๋น„์šฐ๊ณ  givenName์— ํ’€๋„ค์ž„

๊ธฐ๋ณธ๊ฐ’ (00 Reset ์‹œ ์ ์šฉ)

{ "hashtag": true, "appendTitle": true, "appendCompany": false, "cardAsPhoto": true, "koreanReading": true, "koreanStyleName": true }

12. ์ฒซ ์‚ฌ์šฉ ์˜จ๋ณด๋”ฉ

์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ๋ช…ํ•จ์„ ๋ณด๋‚ผ ๋•Œ (bizcard-log.jsonl์ด ์—†๊ฑฐ๋‚˜ ๋น„์–ด์žˆ์„ ๋•Œ): ๐Ÿ“‡ ๋ช…ํ•จ ์Šค์บ๋„ˆ ์ฒซ ์‚ฌ์šฉ! ๊ธฐ๋ณธ ์„ค์ •: 1. Hashtag : on 2. Append title : on 3. Append company : off 4. Card as photo : on 5. Korean reading : on 6. Korean style name : on ์„ค์ • ๋ณ€๊ฒฝ: /bizcard config ์ด ๋ช…ํ•จ ์ฒ˜๋ฆฌํ• ๊นŒ? ์ดํ›„์—๋Š” ์˜จ๋ณด๋”ฉ ์—†์ด ๋ฐ”๋กœ ์ฒ˜๋ฆฌ.

13. ๋ฉ”๋ชจ๋ฆฌ ๋กœ๊น…

์ €์žฅ ์„ฑ๊ณต ์‹œ memory/bizcard-log.jsonl์— ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ๊ธฐ๋กํ•œ๋‹ค. ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ PII๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์„ธ ์ •๋ณด๋Š” Google Contacts์—์„œ resourceName์œผ๋กœ ์กฐํšŒ. {"ts": "2026-02-20T14:30:00Z", "name": "ํ™๊ธธ๋™", "company": "ABC์ฃผ์‹ํšŒ์‚ฌ", "resourceName": "people/c1234567890"} PII ์ตœ์†Œํ™” ์›์น™: ๋กœ๊ทธ์—๋Š” ์ด๋ฆ„๊ณผ ํšŒ์‚ฌ๋ช…(๊ฒ€์ƒ‰์šฉ)๋งŒ ๋‚จ๊ธฐ๊ณ , ์ „ํ™”๋ฒˆํ˜ธ/์ด๋ฉ”์ผ/์ฃผ์†Œ๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

14. ๊ฒ€์ƒ‰ & ์กฐํšŒ

๋ช…๋ น๋™์ž‘"๋ช…ํ•จ ๊ฒ€์ƒ‰ ํ™๊ธธ๋™" / "bizcard search ํ™๊ธธ๋™"People API searchContacts ์‹คํ–‰"์ตœ๊ทผ ๋ช…ํ•จ" / "recent bizcards"bizcard-log.jsonl์—์„œ ์ตœ๊ทผ 10๊ฑด ํ‘œ์‹œ

15. ์—๋Ÿฌ ์ฒ˜๋ฆฌ

์—๋Ÿฌ ์ƒํ™ฉ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€OCR ์‹คํŒจ / ๋นˆ ๊ฒฐ๊ณผ"ํ…์ŠคํŠธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์–ด. ๋” ์„ ๋ช…ํ•œ ์‚ฌ์ง„์œผ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์ค˜"Maton API ์‹คํŒจ"Google Contacts ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด์ค˜. API ํ‚ค๋‚˜ OAuth๊ฐ€ ๋งŒ๋ฃŒ๋์„ ์ˆ˜ ์žˆ์–ด"๋นˆ ๋ช…ํ•จ (์ •๋ณด ์—†์Œ)"์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๋ฅผ ๋ชป ์ฐพ์•˜์–ด. ๋ช…ํ•จ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด์ค˜"๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜"๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด์ค˜"์‚ฌ์ง„ ์—…๋กœ๋“œ ์‹คํŒจ (์—ฐ๋ฝ์ฒ˜๋Š” ์ €์žฅ๋จ)"์—ฐ๋ฝ์ฒ˜๋Š” ์ €์žฅ๋๋Š”๋ฐ ์‚ฌ์ง„ ์—…๋กœ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ์–ด. ๋‹ค์‹œ ์‹œ๋„ํ• ๊นŒ?"config.json ํŒŒ์‹ฑ ์˜ค๋ฅ˜๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ๋ณต๊ตฌ ํ›„ "์„ค์ • ํŒŒ์ผ์ด ์†์ƒ๋ผ์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ณต๊ตฌํ–ˆ์–ด"

Config Reference

์„ค์ • ํŒŒ์ผ: skills/bizcard/config.json #key๊ธฐ๋ณธ๊ฐ’์„ค๋ช…1hashtagtrue์ด๋ฆ„ ์•ž์— # ์ถ”๊ฐ€ (์นด์นด์˜คํ†ก ์ž๋™์ถ”๊ฐ€ ๋ฐฉ์ง€)2appendTitletrue์ด๋ฆ„ ๋’ค์— ์งํ•จ ์ถ”๊ฐ€3appendCompanyfalse์ด๋ฆ„ ๋’ค์— (ํšŒ์‚ฌ๋ช…) ์ถ”๊ฐ€4cardAsPhototrue๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ์—ฐ๋ฝ์ฒ˜ ์‚ฌ์ง„์œผ๋กœ ์ €์žฅ5koreanReadingtrue์™ธ๊ตญ ๋ช…ํ•จ ์ด๋ฆ„/ํšŒ์‚ฌ๋ฅผ ํ•œ๊ตญ์–ด ๋…์Œ์œผ๋กœ ๊ธฐ๋ก6koreanStyleNametrueํ•œ๊ตญ ๋ช…ํ•จ: familyName ๋น„์šฐ๊ณ  givenName์— ํ’€๋„ค์ž„

Dependencies

ToolPurposeInstallMATON_API_KEYMaton API Gateway auth (People API proxy)maton.ai/settingsNANO_BANANA_API_KEYGoogle Gemini API key (used by Nano Banana Pro for image correction)aistudio.google.com

References

references/people-api-fields.md โ€” Google People API field reference Google People API docs

Category context

Agent frameworks, memory systems, reasoning layers, and model-native orchestration.

Source: Tencent SkillHub

Largest current source with strong distribution and engagement signals.

Package contents

Included in package
4 Docs2 Config
  • SKILL.md Primary doc
  • README.md Docs
  • references/people-api-fields.md Docs
  • templates/AGENTS.md Docs
  • _meta.json Config
  • config.json Config