콘텐츠를 만들다 보면 이미지가 계속 필요합니다. 카드뉴스 표지 한 장, 블로그 썸네일 한 장. 매일 몇 장씩이요.
방법은 많습니다. 그런데 자동화하려고 보면 다 걸립니다. 좋은 건 API 키에 종량 과금이 붙고, 무료인 건 브라우저에서 사람이 클릭해야 합니다. 스크립트 안에서 한 줄로 부를 수 있는 무료 창구가 의외로 없어요.
그래서 서랍에 있던 공기계를 썼습니다. 폰에 깔린 앱을 PC에서 원격으로 조작해서, 이미지를 만들고 PC로 가져옵니다. 지금은 명령 한 줄입니다.
왜 굳이 폰이었나
선택지를 늘어놓고 보면 이유가 분명해집니다.
| 방법 | 비용 | 자동화 |
|---|---|---|
| 이미지 생성 API | 장당 과금 | 쉬움 |
| 웹 서비스 무료 플랜 | 무료 (한도) | 사람이 클릭해야 함 |
| 로컬 생성 모델 | 무료 | GPU 필요 · 설치 무거움 |
| 폰 앱 + 원격 조작 | 무료 | 스크립트에서 호출 |
폰 앱은 이미 무료로 쓸 수 있고, 안드로이드에는 ADB라는 공식 원격 조작 통로가 있습니다. 개발자 옵션만 켜면 PC에서 화면을 읽고, 좌표를 눌러 입력하고, 파일을 가져올 수 있어요. 원래 앱 개발·테스트용으로 만들어진 기능입니다.
그러니까 새로 만든 게 아니라, 있는 걸 이어 붙인 겁니다. 안 쓰는 폰 + 이미 있는 앱 + 표준 도구.
이런 소식, 남들보다 먼저 받으실 분?
직접 돌려보고 되는 것만 골라 매주 보내드립니다. 광고성 하이프는 거릅니다.
돌아가는 순서
스크립트가 하는 일은 사람이 폰으로 하던 것과 똑같습니다.
- 무선으로 폰에 연결한다
- 앱을 켜고 새 대화를 연다
- 프롬프트를 입력하고 전송한다
- 완료될 때까지 화면을 읽으며 기다린다 (1~3분)
- 이미지를 길게 눌러 저장하고, PC로 가져온다
4번이 핵심입니다. 생성 시간이 매번 다르니까 고정 시간으로 기다리면 안 됩니다. 화면의 요소를 주기적으로 읽어서 완료를 알리는 표시가 뜨는 순간을 잡습니다. 오류가 뜨면 재시도 버튼도 알아서 누릅니다.
이게 이 방식의 성격을 결정합니다. API가 아니라 사람 흉내예요. 그래서 앱 화면이 바뀌면 깨질 수 있고, 대신 API가 없는 서비스도 쓸 수 있습니다. 장단이 한 몸입니다.
실패를 전제로 만들었습니다
폰은 꺼질 수 있습니다. 배터리가 나가거나, 공유기가 재부팅되거나, 절전으로 Wi-Fi에서 사라지거나. 실제로 다 겪었습니다.
그래서 창구를 하나로 두고, 그 안에서 자동으로 넘어가게 했습니다. 폰이 안 되면 API 키가 필요 없는 웹 생성 서비스로 떨어집니다.
덕분에 이미지를 부르는 쪽 코드가 단순해집니다. 실패 처리도, 조건 분기도 없어요. "이 명령을 부르면 그 경로에 이미지가 하나 생긴다" — 이 계약 하나만 지키면 됩니다. 카드뉴스 파이프라인도, 블로그 표지도 전부 이 한 줄만 씁니다.
겪은 함정 세 가지
1. 영문 프롬프트만 들어갑니다
ADB의 기본 텍스트 입력이 ASCII만 지원합니다. 한글을 넣으면 그냥 안 들어가요. 그래서 프롬프트는 전부 영어로 씁니다. 어차피 이미지 모델들은 영어를 더 잘 알아듣기도 하고요.
2. 폰이 자면 사라집니다
화면이 꺼지고 절전에 들어가면 네트워크에서 아예 안 보입니다. 연결이 끊기는 게 아니라 기기를 못 찾습니다. 충전기를 꽂아두고 "화면 켜짐 유지"를 켜두는 게 사실상 필수입니다.
3. 결과물에 워터마크가 남습니다
무료 서비스라 우하단에 서비스 표시가 붙습니다. 저희는 하단 8%를 잘라내고 씁니다. 카드 표지는 어차피 아래쪽에 글자를 얹으니까 손해가 없어요.
ffmpeg -i 원본.png -vf "crop=iw:ih*0.92:0:0" 결과.png
이건 만능이 아닙니다. 앱 UI가 바뀌면 좌표와 감지 문구를 다시 맞춰야 하고, 생성 품질도 유료 서비스보다 낮습니다. 저희가 이걸 쓰는 이유는 매일 쓰는 표지 이미지라는 용도에 맞아서지, 모든 이미지 작업에 좋아서가 아닙니다.
같은 프롬프트를 계속 씁니다
도구보다 중요한 게 이겁니다. 생성 이미지를 브랜드에 쓰려면 톤이 매번 같아야 하는데, 프롬프트를 매번 새로 쓰면 그게 안 됩니다.
그래서 앞부분을 고정하고 주제만 갈아끼웁니다.
# 고정 — 한 글자도 안 바꾼다 cinematic product photograph, single hero object centered on pure near-black background, dramatic teal rim lighting from behind, shallow depth of field, no text no letters no words, 4:5 vertical composition, empty dark space in lower half for text overlay. SUBJECT: <이 글의 핵심을 물건 하나로>
SUBJECT는 물건 하나여야 합니다. 장면이나 사람, 여러 개를 넣으면 뭉개집니다. "유리 체크박스 하나", "빛나는 커서 하나"처럼 단일 오브젝트일 때 제일 선명하게 나옵니다.
가져가세요 — 시작하는 순서
안 쓰는 안드로이드 폰이 있으면 오늘 만들 수 있습니다.
# 1. 폰: 개발자 옵션 → 무선 디버깅 켜기 # (빌드 번호 7번 탭 → 개발자 옵션 활성화) # 2. PC: platform-tools 받아서 연결 adb pair <폰에 뜬 IP:포트> # 최초 1회 adb connect <폰 IP>:5555 # 3. 연결 확인 — device 로 나와야 한다 adb devices # 4. 화면 읽기 · 좌표 누르기 · 파일 가져오기 adb shell uiautomator dump /sdcard/ui.xml adb shell input tap <x> <y> adb pull /sdcard/파일 ./
상시 대기 조건: 충전기 연결 + 개발자 옵션의 "화면 켜짐 상태 유지" ON. 이 둘이 없으면 절전 때 기기를 못 찾습니다.
이 방식이 특별해서 쓰는 건 아닙니다. 무료라고 해서 따라해봤다가 안 됐던 경험이 있어서, 남의 한도에 의존하지 않는 창구를 하나 갖고 싶었을 뿐이에요. 서랍 속 공기계는 그런 용도로 꽤 쓸 만합니다. 같은 폰으로 다른 일도 시키고 있고요.
카드뉴스로도 정리했습니다
인스타그램에 올린 10장입니다.
이 글은 클로드 코드로 혼자 일하는 법 — 6편 정리 시리즈의 한 편입니다.