지난 글에서는 수동 업로드 노동에서 해방되기 위해 셀레늄(Selenium) 브라우저 자동화와 공식 API를 결합한 멀티채널 자동 업로드 시스템의 설계 사상을 소개해 드렸습니다. 매일 아침 단 한 번의 마우스 더블 클릭만으로 티스토리와 유튜브 쇼츠까지 무인으로 등록되는 시스템을 꿈꾸며, 저는 곧장 신이 나서 파이썬 코딩을 시작했습니다.
하지만 실제 코드를 구현하기 시작하자마자 온갖 버그와 장벽에 부딪혔습니다.
단순히 크롬 드라이버를 띄워 로그인 버튼을 누르고 본문 입력창에 글씨를 쓰게(send_keys) 하면 될 줄 아는데, 티스토리 에디터의 독특한 웹 구조 때문에 텍스트가 엉뚱한 곳에 적히거나 영문/한글이 뒤섞여 깨지는 현상이 발생했습니다. 이번 글은 셀레늄 자동화 스크립트를 구현하면서 겪었던 세 가지 기술적 지옥(로그인 차단, 에디터 iframe, 대량 텍스트 타이핑 버그)을 어떻게 영리한 파이썬 코딩 팁으로 극복했는지에 대한 상세한 개발 기록입니다.
이 코드 트릭들을 이해하신다면, 여러분도 어떤 웹사이트의 까다로운 에디터 폼이든 자유자재로 다루며 무인 업로더를 직접 만드실 수 있습니다.

웹 에디터가 자동화 봇을 가로막는 두 가지 장벽
파이썬 셀레늄 자동화 코드를 짤 때 가장 먼저 겪는 복병은 아이프레임(iframe)의 존재와 복잡한 에디터 구조입니다.
에디터 페이지를 크롬 개발자 도구(F12)로 뜯어보고 본문 입력창의 ID를 찾아 driver.find_element를 호출했지만, 파이썬 콘솔에는 해당 요소를 찾을 수 없다는 에러(NoSuchElementException)만 뱉어졌습니다.
원인은 웹페이지 내부에 또 다른 독립된 웹페이지를 중첩시키는 iframe 태그 때문이었습니다.
티스토리 에디터의 글쓰기 공간은 메인 페이지와 단절된 별도의 iframe 영역(tx_canvas_wysiwyg 등)에 둥지를 틀고 있어, 크롬 드라이버의 제어 컨텍스트를 해당 iframe 내부로 스위칭해 주지 않으면 그 안의 에디터 폼을 전혀 건드릴 수 없었습니다.
또한, 일반적인 텍스트 input 상자가 아니라 리치 텍스트 에디터(Rich Text Editor) 구조이기 때문에 셀레늄의 기본 입력 방식인 element.send_keys()를 무턱대고 호출하면 커서가 튕겨 나가며 오동작이 일어났습니다.

send_keys를 버리고 Ctrl+V 클립보드 복붙 트릭으로 돌파하다
더 큰 문제는 대량의 마크다운 텍스트를 입력하는 속도와 안정성이었습니다.
블로그 본문은 보통 공백 포함 3,000자 이상으로 깁니다. 이 방대한 텍스트를 셀레늄의 send_keys()로 한 땀 한 땀 타이핑하게 시키면 글자가 한 자씩 입력되는 데 수십 초 이상 걸릴 뿐만 아니라, 영문 드라이버와 윈도우 한글 입력기가 충돌을 일으켜 '안녕하세요'가 'dksdudgktpdy'처럼 영타로 깨져 들어가는 치명적인 입력 버그가 수시로 재발했습니다.
이 골치 아픈 문제를 단 1초 만에 해결해 준 묘책은 바로 클립보드(Clipboard) 복사-붙여넣기 꼼수였습니다.
파이썬의 클립보드 제어 라이브러리인 pyperclip을 사용하여 전체 마크다운 본문을 통째로 메모리에 복사(Copy)한 뒤, 크롬 드라이버를 통해 본문창에 Ctrl+V (붙여넣기) 단축키 명령을 전송하는 방식이었습니다.
이 방식을 채택하자 다음과 같은 놀라운 변화가 일어났습니다.
- 인코딩/오타 에러 0%: 한글/영문 입력기 전환 문제를 거칠 필요가 없기 때문에 오타가 전혀 발생하지 않습니다.
- 압도적인 처리 속도: 5,000자가 넘는 장문의 블로그 글이 타이핑 딜레이 없이 0.5초 만에 본문에 즉시 주입됩니다.
- 안정적인 서식 유지: 마크다운 문장 부호와 띄어쓰기 서식이 흐트러짐 없이 원본 그대로 보존됩니다.
복잡한 브라우저 타이핑 메커니즘과 머리를 싸매며 싸우기보다, 우리 일상에 친숙한 'Ctrl+C / Ctrl+V'라는 OS 단축키 트릭을 코드로 투사하는 것이 엔지니어링적으로 훨씬 단순하고 완벽한 해답이 되었습니다.

핵심 셀레늄 업로드 자동화 파이썬 소스코드
실제로 제가 티스토리 자동 업로드 모듈에 사용한 파이썬 핵심 제어 코드 조각입니다.
import time
import pyperclip
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 1. 크롬 드라이버 실행 및 에디터 이동
driver = webdriver.Chrome()
driver.get("티스토리_글쓰기_주소")
time.sleep(3)
# 2. 제목 입력 (XPath 매칭)
title_input = driver.find_element(By.XPATH, '//*[@id="titleInput"]')
title_input.send_keys("009편 테스트 제목입니다.")
# 3. 에디터 iframe 내부로 스위칭 (★가장 중요)
driver.switch_to.frame("tx_canvas_wysiwyg")
# 4. 본문 입력창 활성화
editor_body = driver.find_element(By.TAG_NAME, "body")
editor_body.click()
# 5. pyperclip을 이용한 본문 고속 복사 및 Ctrl+V 입력
blog_content = "실제 블로그 포스팅에 들어갈 방대한 마크다운 텍스트 원고..."
pyperclip.copy(blog_content)
editor_body.send_keys(Keys.CONTROL, 'v') # Mac은 Keys.COMMAND, 'v'
# 6. 메인 페이지 컨텍스트로 복귀
driver.switch_to.default_content()
이 간단한 흐름이 수백 줄의 수동 매핑 코드보다 안정적으로 작동합니다. iframe을 만났을 때는 switch_to.frame을 해주고, 다 쓴 뒤에는 다시 switch_to.default_content를 통해 원래 영역으로 돌아와 발행 버튼을 눌러야 한다는 흐름만 숙지하면 코딩의 절반은 완성된 셈입니다.

결론: 코딩의 화려함보다 단순하고 확실한 해킹이 이깁니다
이번 셀레늄 파이썬 코드 구현을 통해 얻은 가장 큰 깨달음은 이것입니다.
기술을 다룰 때 가장 훌륭한 아키텍처는 가장 화려한 코드가 아니라, 예외 처리가 필요 없는 가장 단순한 꼼수(Hack)다.
웹 브라우저의 내부 API 구조를 분석하고 리치 텍스트 개체의 클래스 메서드에 직접 텍스트를 밀어 넣으려 했다면 개발에만 수주일이 걸렸을 것입니다. 하지만 클립보드 임시 복사와 OS 단축키 복제라는 영리한 트릭 덕분에 단 몇 줄의 코드로 완벽한 자동 포스팅 모듈을 구축할 수 있었습니다.
다음 글에서는 셀레늄 자동화가 작동하는 도중 구글이나 네이버가 봇 감지 엔진으로 차단하는 현상(블락킹)을 우회하기 위한 3대 보안 우회 설정(User-Agent, Options 가드 등)에 대한 노하우를 정리해 보겠습니다.
'Python 업무 자동화' 카테고리의 다른 글
| 클릭 한 번으로 블로그와 쇼츠를 여러 채널에 동시에 업로드하는 방법 (0) | 2026.05.30 |
|---|