
블로그 이미지 자동화하기: Pillow 아키텍처 다이어그램 + Doubao API 배너
요약
Pillow 라이브러리와 Doubao API를 활용하여 블로그용 아키텍처 다이어그램과 배너 이미지를 자동으로 생성하는 파이프라인 구축 방법을 소개합니다. 생성된 이미지를 WeChat 자산 라이브러리에 자동으로 업로드하고 삽입하는 전체 워크플로우를 다룹니다.
핵심 포인트
- Pillow 스크립트를 이용한 4계층 아키텍처 다이어그램 자동 생성
- Doubao API 호출을 통한 배너 이미지 생성 및 Endpoint ID 활용법
- WeChat 플랫폼 규격에 맞는 이미지 업로드 및 삽입 형식 준수
- 1인 기업을 위한 콘텐츠 제작 시간 단축 및 자동화 워크플로우
블로그 이미지 자동화하기: Pillow 아키텍처 다이어그램 + Doubao API 배너
고충 (The Pain): 글은 다 썼는데 이미지가 완성되지 않았습니다. 그래서 직접 30분 동안 그리거나, 아무 사진이나 대충 가져와서 마무리하곤 합니다. 모든 포스트에는 이미지가 필요하며, 1인 기업(One-person company)에게 디자인 소프트웨어에서 보내는 매 시간은 실제 업무에서 빼앗긴 시간과 같습니다.
학습 내용:
- 4단계 이미지 파이프라인: Pillow 다이어그램 → Doubao 배너 → WeChat 자산 라이브러리 (asset library) → 기사에 삽입
- 1초도 안 되어 일관된 4계층 아키텍처 다이어그램을 그리는 100줄의 Pillow 스크립트 — 빈 박스만 생성하게 만드는 폰트 경로(font-path) 함정 포함
- 단 한 번의 Doubao API 호출로 배너를 생성하는 방법 — 그리고 왜 모델 파라미터에 모델 이름이 아닌 엔드포인트 ID (Endpoint ID)가 들어가는지
- WeChat이 요구하는 정확한 업로드 및 삽입 형식 (
data-src,rich_pages wxw-img,mmbiz.qpic.cn) — 형식을 틀리면 게시 승인 단계에서 기사가 차단됩니다
1. 현재 기사 이미지를 만드는 방식
대부분의 사람들에게 기사 이미지 작업 루틴은 다음과 같습니다:
PPT/PS 열기 -> 박스 + 화살표 그리기 -> 이미지 내보내기 -> WeChat 에디터 열기
-> 자산 라이브러리 (asset library)에 업로드 -> 기사에 삽입 -> 위치가 어긋남 -> 다시 하기
기사 하나당 이미지 3개, 그러면 한 시간이 사라집니다. 1인 기업 (OPC, One-person company) 창업자에게 시간은 가장 희소한 자원입니다.
이 시리즈의 이전 글인 — 1인 편집 부서: 솔로 빌더를 위한 자동화된 콘텐츠 공장 (The One-Person Editorial Department: An Automated Content Factory for Solo Builders) — 에서 저는 주제 기획, AI 생성, 품질 검증 (quality gates), 데이터 피드백을 포함한 완전한 콘텐츠 생성 파이프라인을 구축했습니다. 콘텐츠 측면은 해결되었습니다. 그때 다음 병목 현상이 나타났습니다: 콘텐츠는 존재하지만, 이미지는 없습니다.
그래서 저는 저를 위한 이미지 파이프라인을 구축했습니다. 아키텍처 다이어그램은 Pillow 스크립트로 그려지고, 배너는 단 한 번의 Doubao API 호출로 생성되며, 두 가지 모두 WeChat 자산 라이브러리 (asset library)로 바로 들어갑니다. 오늘 저는 이것을 여러분께 공개하려고 합니다.

이미지 파이프라인: Pillow가 아키텍처 다이어그램을 그리고, Doubao가 배너를 생성하며, 두 가지 모두 자산 라이브러리 (asset library)에 업로드되고, 기사에 이들이 임베드(embed)됩니다.
2. 1단계: Pillow를 사용하여 아키텍처 다이어그램 생성하기
아키텍처 다이어그램 (Architecture diagrams)은 가장 흔한 이미지 유형이자 자동화에 가장 친화적인 유형입니다. 상자, 화살표, 텍스트, 고정된 위치, 높은 반복성 등이 특징입니다. 아래 스크립트는 100줄의 코드로 완전한 아키텍처 다이어그램을 그립니다:
from PIL import Image, ImageDraw, ImageFont
# 폰트 (CJK 지원 필요)
...
이 코드에서는 세 가지 작업이 수행됩니다:
- 캔버스 생성: 800×400 픽셀, 어두운 배경
- 상자 그리기:
rounded_rectangle이 각 레이어를 그립니다 - 텍스트 쓰기:
text가 이름과 설명을 라벨링합니다
✅ 검증됨: 스크립트가 완료되고 1초 이내에 이미지를 출력합니다.

architecture.png — 스크립트가 그리는 결과물: 네 개의 레이어, 일관된 스타일, 언제든 재생성 가능.
🩸 함정 (Pitfall): 폰트 경로가 가장 큰 함정입니다. 서버에서는 Noto Sans CJK 폰트가 truetype/noto/ 대신 opentype/noto/ 아래에 있을 수 있습니다. CJK 경로가 틀리면 Pillow는 에러를 발생시키지 않고, 텍스트가 그냥 빈 상자로 렌더링됩니다. 먼저 find /usr/share/fonts -name "*.ttc"를 실행하여 경로를 확인한 다음 스크립트를 작성하세요.
💼 가치 (Value): 동일한 스크립트가 매번 일관된 스타일을 생성합니다. 새로운 레이어가 필요하신가요? 코드 한 줄만 바꾸면 됩니다. 디자인 소프트웨어를 다시 열 필요가 없습니다.
▸ 인지적 도약 (Cognitive leap): 이미지를 만드는 것은 디자인 작업이 아니라 프로그래밍 작업입니다. "그림을 그리는 것"을 "스크립트를 실행하는 것"으로 바꾸는 순간, 모든 것이 자동화됩니다.
3. 2단계: Doubao API 호출 한 번으로 배너 생성하기
커버와 배너에는 디자인 감각과 시각적 임팩트가 필요합니다. Pillow는 적절한 도구가 아닙니다. 여기서 Volcano Engine의 Doubao 텍스트-이미지 (text-to-image) 모델이 등장합니다.
명령어 한 번으로 배너 하나 생성:
curl -s "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
...
응답에는 다운로드 URL이 포함되어 있습니다. 이미지를 가져와 WeChat 에셋 라이브러리에 업로드하세요.
주요 파라미터 (Key parameters):
model: 모델 이름이 아니라, Volcano Engine 콘솔에서 생성한 **엔드포인트 ID (Endpoint ID)**를 입력해야 합니다 (형식: `ep-2026xxxxxxxx-xxx")size: 최소1920×1920(3.68 메가픽셀 — 이보다 작으면 에러가 발생합니다)prompt: 일상적인 언어로 충분합니다. 시각적 스타일과 여백(whitespace)을 원하는 위치를 설명하세요.
✅ 검증 완료: 제가 바로 앞에서 이 명령어를 실행했으며, 반환된 이미지 URL은 브라우저에서 미리보기가 가능합니다.

Doubao 배너 흐름: 하나의 curl 호출로 하나의 이미지 생성 — 그리고 모두를 당황하게 만드는 단 하나의 파라미터.
🩸 함정 (Pitfall): 엔드포인트 ID (Endpoint ID)는 모델 이름이 아닙니다. 많은 사람들이 doubao-seedream-5-0를 모델 파라미터로 전달하여 "model not found" 에러를 겪습니다. 먼저 Volcano Engine 콘솔에서 엔드포인트를 생성한 다음, 반환된 ep-xxxx를 model 필드에 넣으세요.
💼 가치 (Value): 커버 디자인을 위해 디자이너를 고용하는 비용은 예전에 200위안부터 시작했습니다. 이제는 curl 호출 한 번이면 됩니다. 만족스럽지 않으신가요? 프롬프트 (prompt)를 바꾸고 다시 실행하세요. 비용은 제로입니다.
▸ 인지적 도약 (Cognitive leap): "디자인"이 인간의 기술에서 API 호출로 이동하고 있습니다. 당신은 디자인을 알 필요가 없습니다 — 어떻게 묘사할지를 알면 됩니다.
4. 3단계: 모든 항목을 WeChat 자산 라이브러리 (Asset Library)에 업로드하기
Pillow에서 생성된 PNG와 Doubao에서 생성된 JPG, 두 가지 이미지 유형 모두 동일한 업로드 흐름을 거칩니다:
import urllib.request, json
# 액세스 토큰 (access token) 가져오기
...
반환된 url은 WeChat CDN 링크(mmbiz.qpic.cn)이며, 이를 기사 본문에서 직접 참조할 수 있습니다.
5. 4단계: 이미지 임베딩 (중요 — 형식이 틀리면 차단됨)
이미지가 자산 라이브러리에 저장되면, 기사 HTML에 임베딩할 때는 지름길 없이 반드시 정확한 형식을 사용해야 합니다:
<!-- 올바른 형식: 게시 승인을 통과함 -->
<img data-src="https://mmbiz.qpic.cn/mmbiz_png/xxxxx/640?wx_fmt=png"
class="rich_pages wxw-img"
...
세 가지 요구 사항, 모두 필수 사항입니다:
src대신data-src를 사용하세요 — WeChat 에디터가 생성하는 표준 형식입니다.class="rich_pages wxw-img"를 추가하세요 — WeChat에 이것이 기사 본문 이미지임을 알려줍니다.- 이미지는 반드시 WeChat 자산 라이브러리에 있어야 합니다 — 도메인은
mmbiz.qpic.cn입니다.
잘못된 형식 (게시 승인 단계에서 "불법 이미지 링크"라는 응답을 받음):
<img src="http://example.com/my-image.png" />
🩸 함정 (Pitfall): 저도 이 지뢰를 직접 밟았습니다. src=를 사용하여 임베딩했더니 게시 시점에 WeChat의 리스크 컨트롤 (risk control)에 의해 "불법 이미지 링크를 삽입하지 마세요"라는 오류와 함께 제출물이 차단되었습니다. src를 data-src로 바꾸고 클래스를 추가하자 첫 번째 재시도에서 해결되었습니다.

올바른 형식 vs 차단된 형식: 승인을 통과하는 세 가지 요구 사항 형식을 거부되는 src= 형식과 비교함.
6. 4단계 통합하기: 전체 체인을 위한 단 하나의 명령
이 네 가지 단계는 하나의 루틴으로 연결됩니다. 매일 기사를 작성한 후, 저는 단 하나의 명령어를 실행합니다:
python3 gen_arch_diagram.py # Pillow가 아키텍처 다이어그램을 그립니다
python3 gen_banner.py "topic prompt" # Doubao가 배너를 생성합니다
python3 upload_to_wechat.py # 자산 라이브러리에 업로드합니다
전체 프로세스가 자동화되었습니다: 30분의 수동 작업이 10초로 단축되었습니다.
✅ 검증됨: 이 기사의 이미지들은 파이프라인 (pipeline)의 결과물입니다. 아키텍처 다이어그램은 Pillow에서, 배너는 Doubao에서 생성되었으며, 둘 다 WeChat 자산 라이브러리에 업로드되었습니다.
💼 가치: 기사 + 이미지는 하나의 완전한 결과물 (deliverable)이 됩니다. 독자들은 텍스트만 덩그러니 보고 있는 것이 아니라, 풍부한 삽화가 포함되어 친절하게 안내하는 튜토리얼를 읽게 됩니다.
▸ 인지적 도약 (Cognitive leap): 이미지는 독립적인 작업이 아니라 콘텐츠 파이프라인 (content pipeline)의 한 단계입니다. 이를 파이프라인에 포함시키면 더 이상 이미지에 대해 고민할 필요가 없습니다.
7. 현재 당신의 위치
당신은 이제 이미지 하나를 만들기 위해 Photoshop을 열고 30분 동안 씨름하는 콘텐츠 제작자가 아닙니다. 당신은 코드로 이미지를 생성하고 API로 커버를 디자인하는 시스템 빌더 (system builder)가 되어가고 있습니다.
다음 기사에서는 이 파이프라인에 가드레일 (guardrails)을 설치할 것입니다. 에이전트 (Agent)가 단순히 작업을 수행할 수 있는 것을 넘어, 실수할 수 없도록 만들 것입니다.
🏷️ 엔티티 (Entities): Pillow, Volcano Engine, Doubao, ImageMagick
💼 가치: 이미지 자동화, 콘텐츠 파이프라인, OPC 효율성 도구
🧠 통찰: 디자인에서 프로그래밍으로 — 이미지는 창의적인 작업이 아니라 엔지니어링 작업입니다
저자 소개: Wu Ji (无记) — 에이전트 엔지니어링 (Agent engineering), 루프 엔지니어링 (Loop Engineering), 디지털 전환에 집중하는 AI 및 디지털화 실무자. 실용적이고 직접 따라 할 수 있는 튜토리얼 — 따라 하기만 하면 바로 작동합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기