AI/자동화

블로그 자동화 하기 첫 걸음

억삼이 2026. 1. 5. 23:10
반응형

티스토리, 네이버 블로그는 openapi 서비스를 제공하지 않는다.

결국 에디터를 통해 입력을 해야 한다.

제미나이에 물어보니

플레이라이트(Playwright) 를 추천해주었다.

셀레니움은 E2E 테스트를 해봤을 때 사용을 해봤지만 플레이라이트는 생소했다.

간단한 구현 예제까지 만들어서 실행 해보니 로그인 까지는 진행이 되지만, 제목 입력 부터 되지 않았다.

문제는 제목 입력 폼 태그를 작성해줬는데 맞지 않았다. 플레이라이트를 뜨워서 제목에 해당하는 부분을 가져오려고 보니 다소 달랐다.(왜 최신으로 못따라가는거니?)

page.get_by_role("textbox", name="제목을 입력하세요").click()
page.get_by_role("textbox", name="제목을 입력하세요").fill(title)
#page.fill("#post-title-field", title)

#post-title-field 를 page.get_by_role("textbox", name="제목을 입력하세요") 로 변경 하였다.

같은 폼이 있을 땐 어떻게 나오는지 아직 알아보지는 않았다.

이런 부분들을 수정해놓고 다시 해보니 글 작성이 잘 되었다.

수행되는 참고 영상

https://youtu.be/8ZgMH-gew8A

 

참고 코드이다.

import time
from playwright.sync_api import sync_playwright

def auto_post_tistory():
    with sync_playwright() as p:
        # 이전에 저장한 auth.json 세션을 불러와 브라우저 실행
        browser = p.chromium.launch(headless=False) # 과정을 보기 위해 False 설정
        context = browser.new_context(storage_state="auth.json")
        page = context.new_page()

        # 1. 글쓰기 페이지 진입 (자신의 블로그 주소로 수정)
        blog_name = "yourblogname"
        page.goto(f"https://{blog_name}.tistory.com/manage/post")
        page.wait_for_load_state("networkidle")

        # 2. 제목 입력
        title = "플레이라이트로 작성한 자동화 포스팅 테스트"
        page.get_by_role("textbox", name="제목을 입력하세요").click()
        page.get_by_role("textbox", name="제목을 입력하세요").fill(title)
        #page.fill("#post-title-field", title)
        print("제목 입력 완료")

        # 3. 본문 작성 (에디터 iframe 접근)
        # 티스토리 에디터는 #editor-root 안의 iframe 내부에 존재합니다.
        editor_frame = page.frame_locator("#editor-root iframe")

        # 실제 글이 써지는 body 영역을 찾아 클릭 후 내용 입력
        content_area = editor_frame.locator("body#tinymce")
        content_area.click()
        content_area.fill("이 내용은 Playwright를 통해 자동으로 입력되었습니다.<br>2026년 자동화 전략의 핵심 도구입니다.")
        print("본문 내용 입력 완료")

        # 4. 발행 버튼 클릭
        page.get_by_role("button", name="완료").click()
        #page.click("button.btn_publish") # 하단 발행 버튼
        time.sleep(1) # 설정 레이어 팝업 대기

        # 5. 최종 발행 설정 (카테고리 선택 등 추가 가능)
        # 여기서는 바로 '발행' 버튼을 누르는 것으로 진행
        page.get_by_role("button", name="공개 발행").click()

        print(f"포스팅 완료! 주소: {page.url}")

        time.sleep(3) # 완료 화면 확인을 위해 잠시 대기
        browser.close()

if __name__ == "__main__":
    auto_post_tistory()

 

반응형