-
간단한 사용법: Java/Selenium과 함께한 자동로그인(이라고 쓰고 삽질이라고 읽는 것)기타 2022. 8. 5. 16:16
* 한 줄 요약: 셀레니움은 짱인데 투팩터 로그인까지 시키기에는 부담이 너무 크다
Selenium
브라우저를 직접 실행시켜서 자동화 된 작업을 할 수 있도록 도와주는 라이브러리. 간단한 스크립트로 웹애플리케이션을 테스트 할 수...도 있지만 나는 자동로그인에 사용하려고 했다.
발단
4개월째 부트캠프 수업을 듣고 있는데 춘추가 춘추인지라 자꾸 출석체크를 까먹는 것이다...
아침에 부지런히 로그인 해놓고 왜 출석버튼을 누르질 못하니 왜...
오늘은 너무 짜증이 나서 그냥 '로그인 시켜보자'는 마음이 들었다. 누구한테? 컴퓨터한테...
금방 Selenium이라는 유용한 라이브러리를 찾을 수 있었다.
간단한 사용법 안내
1. build.gradle에 추가.
2. 사용중인 chrome 버전을 확인
크롬 설정(...) -> 도움말 -> chrome 정보에서 볼 수 있다.
3. chrome driver를 설치
chromium 사이트에 가면 쉽게 latest 버전을 받을 수 있...지만 정말 최근에 업데이트 된 크롬이라면 해당 버전이 없을 수도 있다. 일단 사이트 참고.
https://chromedriver.chromium.org/
4. 다운로드 후 압축을 풀고 /resources의 적당한 곳으로 옮긴다. 난 그냥 resources 바로 밑에 놨다.
5. class를 하나 만들어서 아래와 같은 식으로 코딩한다. 로그인 뿐만이 아니라 뭐든 지나치게 잘 작동한다. 적절히 용도에 맞게 수정해서 돌려보자. 헤드리스 옵션 같이 유용한 옵션들도 있으니 필요하다면 API를 참고해보자.
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class AutoLoginConfirm { private static WebDriver driver; private static final String WEB_DRIVER_NAME = "webdriver.chrome.driver"; private static final String WEB_DRIVER_PATH = System.getProperty("user.dir") + "/src/main/resources/chromedriver.exe"; private static final int SLEEP_TIME = 1000; private static final String START_URI = "접속하려는 곳의 주소"; private static final String CLASSNAME_FOR_MAINLOGIN = "btn__login"; private static final String CLASSNAME_FOR_KAKAOLOGINBUTTON = "login-form__button--kakao"; private static final String CLASSNAME_FOR_AUTHCODE = "input__wrapper"; public static void main(String[] args) throws InterruptedException { setWebDriver(); initChromeDriver(); driver.get(START_URI); if (driver.getTitle().contains("접속하려는 곳이 맞는지 확인하는 부분, 나는 title값을 비교해보았다")) { sleep(); WebElement aForMainLogin = findElementBySelector(CLASSNAME_FOR_MAINLOGIN); aForMainLogin.click(); sleep(); WebElement buttonForKakaoLogin = findElementBySelector(CLASSNAME_FOR_KAKAOLOGINBUTTON); buttonForKakaoLogin.click(); sleep(); WebElement inputForAuthCode = findElementBySelector(CLASSNAME_FOR_AUTHCODE); inputForAuthCode.sendKeys(); } else { System.out.println("### something wrong: " + driver.getTitle()); } destroyChromeDriver(true); } private static String setWebDriver() { return System.setProperty(WEB_DRIVER_NAME, WEB_DRIVER_PATH); } private static void initChromeDriver() { driver = new ChromeDriver(); } private static void sleep() throws InterruptedException { Thread.sleep(SLEEP_TIME); } private static WebElement findElementBySelector(String classNameForKakaoLoginButton) { return driver.findElement(By.className(classNameForKakaoLoginButton)); } private static void destroyChromeDriver(boolean destroy) { if (driver != null && destroy) { driver.quit(); } } }
메인 메서드 끝 즈음의 WebElement#sendKeys()는 문자열을 파라미터로 넘겨 해당하는 인풋을 채워주는 메서드다.
잘 돌아가고 있었는데 중간에 그만 둔 이유
간단한 로그인이면, 이 정도의 코드만으로도 간단하게 성공한다.
내가 로그인하려는 곳은 2-factor login 방식이었다. 폰으로 받은 인증코드를 입력하거나, 로그인을 실행하기 전에 요청을 미리 날려서 결과값을 가로채서 쿵짝쿵짝 하는 방식이 필요한데.
아침에는 졸음이 오는 김에 출석이 빵꾸가 나서 짜증이 났었지만
잠이 깨고 나니 무슨 짓을 하고 있는건가 정신이 든 것이다.
자동으로 출석하자고 보안 수준을 낮출 수는 없잖아? 정신 차려 임마.... 그런 생각을 하며 IDE를 닫게 된 것이다.
하지만 Selenium이라는 아주 강력한(그리고 조금 느린) 라이브러리를 알게 되어서 재미있었다.
언젠가는 써먹을 기회가 있겠지 뭐.
혹시 자동 회원가입이나 자동 티켓팅 같은데에 이 소스코드를 갖다가 어찌해보려는 분이 계시다면 일찌감치 포기하시기를 바란다.
관리가 잘 되고 있는 메이저 사이트에서 자동 브라우징으로 뭔가 하려고 하면 바로 영구차단 되기 때문이다.
'기타' 카테고리의 다른 글
질문답변: DTO를 만들 때 왜 HTTP Method별로 따로 만들어야 하나요? (0) 2022.10.22 어제는 프로젝트 발표일이었다. 코드스테이츠 백엔드 부트캠프의. (2) 2022.10.13 대략적인 서버 구성 (0) 2022.08.25 미세Tip: 특정 포트(프로그램) PID 찾기 & 종료 (0) 2022.08.02 WSL : "nautilus ." 실행 안됨 (Error on getting connection: ...) (4) 2022.05.01 회고 방법 : KPT (0) 2022.05.01