프로젝트/블로그 자동화 프로그램

셀레니움을 이용해 티스토리 자동 글쓰기

print() 2025. 5. 10. 02:48
300x250

 

셀레니움 공식 문서를 보며 먼저 공부를 하는 게 맞겠지만 ChatGPT를 이용해 샘플 소스를 얻은 다음 필요한 부분만 공부하는 방식으로 진행하려고 한다.

 

먼저 ChatGPT에게 셀레니움 샘플 소스를 만들어달라고 해보자.

 

셀레니움 티스토리에 글쓰기 샘플 소스 질문

 

 

아무런 조 건없이 샘플 소스를 달라고 하니 가장 많이 쓰는 파이썬을 기반으로 알려주었다. 자바로 다시 질문해 보자.

 

자바로 다시 알려달라고 요청하였다

 

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.time.Duration;

public class TistoryAutoWriter {

    public static void main(String[] args) {
        // 사용자 정보
        String userId = "your_email@domain.com";
        String userPw = "your_password";
        String blogWriteUrl = "https://yourblog.tistory.com/manage/posts/write";

        // ChromeDriver 설정
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");

        WebDriver driver = new ChromeDriver(options);

        try {
            // 1. 로그인 페이지 이동
            driver.get("https://www.tistory.com/auth/login");
            Thread.sleep(2000);

            // 2. ID / PW 입력 후 로그인
            WebElement idInput = driver.findElement(By.name("loginId"));
            WebElement pwInput = driver.findElement(By.name("password"));
            idInput.sendKeys(userId);
            pwInput.sendKeys(userPw);

            driver.findElement(By.cssSelector("button[type='submit']")).click();
            Thread.sleep(4000); // 로그인 완료 대기

            // 3. 글쓰기 페이지 이동
            driver.get(blogWriteUrl);
            Thread.sleep(5000); // 에디터 로딩 대기

            // 4. 제목 입력
            WebElement titleInput = driver.findElement(By.cssSelector("input[placeholder='제목을 입력하세요']"));
            titleInput.sendKeys("자바 셀레니움 테스트 제목");

            // 5. iframe 내부 본문 입력
            WebElement editorIframe = driver.findElement(By.cssSelector("iframe[title='에디터 영역']"));
            driver.switchTo().frame(editorIframe);

            WebElement contentEditable = driver.findElement(By.cssSelector("div[contenteditable='true']"));
            contentEditable.sendKeys("이 글은 Java + Selenium 으로 자동 작성되었습니다.");

            driver.switchTo().defaultContent();

            // 6. 발행 버튼 클릭
            WebElement publishBtn = driver.findElement(By.xpath("//button[contains(text(),'발행')]"));
            publishBtn.click();

            Thread.sleep(5000); // 발행 대기

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit(); // 브라우저 종료
        }
    }
}

 

 

GPT가 알려준 샘플 소스인데 단계별로 분석을 진행해 보자.

 

// 사용자 정보

글을 작성할 아이디와 패스워드 그리고 글쓰기 화면 URL을 입력한다.

 

// ChromeDriver 설정

크롬 드라이버를 세팅한다.

 

// 1. 로그인 페이지 이동

driver.get() - 함수를 통해 해당 URL로 이동한다.

 

// 2. ID / PW 입력 후 로그인

driver.findElement(By.name("loginId")) - 태그 중 name 속성이 loginId인 것을 찾는다.

idInput.sendKeys(userId) - 해당 태그에 변수에 입력해둔 사용자 정보를 입력한다.

driver.findElement(By.cssSelector("button[type='submit']")).click() - 버튼 태그 중 sumit 타입인 태그를 찾고 클릭한다.

 

// 3. 글쓰기 페이지 이동

driver.get(blogWriteUrl) - 사용자 정보에서 입력해둔 글쓰기 화면 URL로 이동한다.

 

// 4. 제목 입력

제목 태그를 찾아 제목을 입력한다.

 

// 5. iframe 내부 본문 입력

/* 이전 소스 */
WebElement editorIframe = driver.findElement(By.cssSelector("iframe[title='에디터 영역']"));
driver.switchTo().frame(editorIframe);

WebElement contentEditable = driver.findElement(By.cssSelector("div[contenteditable='true']"));
contentEditable.sendKeys("이 글은 Java + Selenium 으로 자동 작성되었습니다.");

driver.switchTo().defaultContent();

/* 변경 후 소스 */
WebElement editorIframe = driver.findElement(By.cssSelector("iframe[id='editor-tistory_ifr']"));
driver.switchTo().frame(editorIframe);

WebElement contentEditable = driver.findElement(By.cssSelector("body[contenteditable='true']"));
contentEditable.sendKeys("이 글은 Java + Selenium 으로 자동 작성되었습니다.");

driver.switchTo().defaultContent();

 

 

GPT가 알려준 내용과 현재 티스토리 화면 구조와 다른 부분이 있어 소스코드를 수정했다.

 

// 6. 발행 버튼 클릭

현재 발행 버튼을 클릭해서 바로 글 작성이 되지 않고 완료 버튼을 클릭 후 공개 발행 버튼을 한 번 더 눌려야 글이 발행되기 때문에 이에 맞춰 소스코드를 수정하였다. 아래 최종 코드를 참고.

 

package autoWrite;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class start {

    public static void main(String[] args) {
        // 사용자 정보
        String userId = "본인 아이디";
        String userPw = "본인 패스워드";
        String blogWriteUrl = "https://codejjang.tistory.com/manage/newpost/";

        // ChromeDriver 설정
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");

        WebDriver driver = new ChromeDriver(options);

        try {
            // 1. 로그인 페이지 이동
        	System.out.println("1. 로그인 페이지 이동");
            driver.get("https://accounts.kakao.com/login/?continue=https%3A%2F%2Fkauth.kakao.com%2Foauth%2Fauthorize%3Fclient_id%3D3e6ddd834b023f24221217e370daed18%26state%3DaHR0cHM6Ly93d3cudGlzdG9yeS5jb20v%26redirect_uri%3Dhttps%253A%252F%252Fwww.tistory.com%252Fauth%252Fkakao%252Fredirect%26response_type%3Dcode%26auth_tran_id%3DBiuQx8j9U_E~mr7zRH2KFCaJZLEkFR0.Rg6d~lKmNtUW3hq5.SpKylG1~SkM%26ka%3Dsdk%252F2.7.3%2520os%252Fjavascript%2520sdk_type%252Fjavascript%2520lang%252Fko-KR%2520device%252FWin32%2520origin%252Fhttps%25253A%25252F%25252Fwww.tistory.com%26is_popup%3Dfalse%26through_account%3Dtrue&talk_login=hidden#login");
            Thread.sleep(2000);

            // 2. ID / PW 입력 후 로그인
            System.out.println("2. ID / PW 입력 후 로그인");
            WebElement idInput = driver.findElement(By.name("loginId"));
            WebElement pwInput = driver.findElement(By.name("password"));
            idInput.sendKeys(userId);
            pwInput.sendKeys(userPw);

            driver.findElement(By.cssSelector("button[type='submit']")).click();
            Thread.sleep(4000); // 로그인 완료 대기

            // 3. 글쓰기 페이지 이동
            System.out.println("3. 글쓰기 페이지 이동");
            driver.get(blogWriteUrl);
            Thread.sleep(5000); // 에디터 로딩 대기

            // 4. 제목 입력
            System.out.println("4. 제목 입력");
            WebElement titleInput = driver.findElement(By.cssSelector("input[placeholder='제목을 입력하세요']"));
            titleInput.sendKeys("자바 셀레니움 테스트 제목");

            // 5. iframe 내부 본문 입력
            System.out.println("5. iframe 내부 본문 입력");
            WebElement editorIframe = driver.findElement(By.cssSelector("iframe[id='editor-tistory_ifr']"));
            driver.switchTo().frame(editorIframe);

            WebElement contentEditable = driver.findElement(By.cssSelector("body[contenteditable='true']"));
            contentEditable.sendKeys("이 글은 Java + Selenium 으로 자동 작성되었습니다.");

            driver.switchTo().defaultContent();

            // 6. 완료 버튼 클릭
            System.out.println("6. 완료 버튼 클릭");
            WebElement publishBtn = driver.findElement(By.xpath("//button[contains(text(),'완료')]"));
            publishBtn.click();

            Thread.sleep(1000); // 완료 대기
            
            // 7. 공개 발행 버튼 클릭
            System.out.println("7. 공개 발행 버튼 클릭");
            WebElement publishBtn2 = driver.findElement(By.xpath("//button[contains(text(),'공개 발행')]"));
            publishBtn2.click();

            Thread.sleep(5000); //  공개 발행 대기

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit(); // 브라우저 종료
        }
    }
}

 

 

중간중간 로그를 찍어 어느 정도 진행 된 지 알 수 있도록 하였다.

 

그러면 실행!

 

과감히 실행했지만 에러가 발생

 

 

에러가 발생했다. 이유가 무엇인지 GPT에게 물어보자.

 

크롬 드라이버는 별도로 설치해야 한다

 

 

GPT가 친절히 에러 해결 방법을 알려주었다.

 

https://googlechromelabs.github.io/chrome-for-testing/ 해당 주소에서 현재 안정적인 버전 136.0.7103.92을 다운 받았다. 용량은 161메가.

 

D:\workspace\chrome-win64 해당 경로에 압축 해제하였다.

 

System.setProperty("webdriver.chrome.driver", "D:\\workspace\\chrome-win64\\chrome.exe");

 

소스코드에 드라이버 경로 수정 후 실행해 보았더니 또 오류가 발생했다.

 

Caused by: org.openqa.selenium.WebDriverException: Timed out waiting for driver server to bind the port.

 

해당 오류는 현재 쓰고 있는 크롬 버전과 맞지 않는 크롬 드라이버를 받아서 그렇다고 한다.

 

이런.. 계속 안돼서 공식 문서를 확인해 보니 크롬 드라이버는 받을 필요도 없었다. 참고해서 코드를 수정 후 실행해 보니 로그인부터 글 쓰는 화면까지는 잘 이동되었다. 그러나 4번 제목 입력 부분부터 오류가 발생하였다. 오늘은 늦은 관계로 다음 글에서 완성된 소스코드를 들고 오겠다!

 

300x250