반응형

 

 

루파디움 설치 및 사용법

 

오토핫키 [AHK] 셀레니움 크롬 드라이버 없이 사용하기

안녕하세요, 본 원문은 https://github.com/Xeo786/Rufaydium-Webdriver 의 자료를 가지고 제작되었습니다. 크롬 셀레니움을 사용할때 오토핫키, 혹은 다른 언어도 크롬 드라이버를 사용하였습니다. 이 Rufay

peuming.tistory.com

 

네이버 로그인 페이지 구조 및 테스트 방법

 

오토핫키 [AHK] 루파디움(셀레니움 대용) 네이버 로그인하기-1

Xeo786/Rufaydium-Webdriver / Github https://github.com/Xeo786/Rufaydium-Webdriver 루페디움 깃허브에 들어가서code -> download ZIP 를 눌러 알집으로 다운로드 합시다 알집을 풀면 Lib 폴더를 제외하고 위 이미지처럼

peuming.tistory.com

 

오토핫키 [AHK] 루파디움(셀레니움 대용) 네이버 로그인하기-2

https://peuming.tistory.com/11 오토핫키 [AHK] 셀레니움 크롬 드라이버 없이 사용하기안녕하세요, 본 원문은 https://github.com/Xeo786/Rufaydium-Webdriver 의 자료를 가지고 제작되었습니다. 크롬 셀레니움을 사

peuming.tistory.com

 

 

루파디움을 통해 웹 조작 매크로를 작성하기에 앞서 

 

안녕하세요 

오토핫키 루파디움을 이용한( 셀레니움 대용으로) 동적 페이지를 조작 및 파싱하는 단계 중 가장 기본적인

부분만 빠르고 쉽게 알려드리려고 합니다. 

 

JavaScript , HTML , PHP 등을 몰라도, 간단하게 동적 웹페이지를 조작하고 배울 수 있는 기회를 제공하는 것을 목표로 두고 있습니다.

 

제가 서치능력이 낮아서 인지 몰라도, 루파디움에 대한 한국어 기준으로 자세히 강의를 해주는 블로그를 많이 보지 못했고, 많은 시행착오 끝에 저도 100% 10% 정도 사용하는 정도 까지 능력을 키우게 되었네요.

 

코드들은 초보자들 기준으로 가장 쉽고, 이해하기 편하도록 작성될 예정이며, 코드의 줄 수 를 줄이는 것은 여러분의
몫 입니다. 

 

 

 

네이버 로그인 

네이버 로그인 인터페이스.ahk
0.00MB

 

스크립트에 네이버 로그인을 하기위해 아이디를 입력하면서 실행을 누르는 것보단

인터페이스가 있는 상태가 더 직관적이고 작업하기 편할 것입니다. 

 

스마트구이를 통해 간단한 인터페이스를 구축합시다.

인터페이스의 역활은 아래와 같습니다. 

 

EDIT   아이디 비밀번호를 입력할 수 있는 칸
LISTVIEW   현재 프로그램이 어떤 부분을 지나가고 있으며, 상황을 볼 수 있는 뷰
BUTTON   사용자가 실행을 하기위한 트리거 역활

 

 

#SingleInstance,Force
#Include Lib\Rufaydium.ahk
title:= "N Login"
Gui, Add, Button, x12 y9 w100 h20 +Disabled,ID
Gui, Add, Edit, x122 y9 w100 h20 vid,
Gui, Add, Button, x232 y9 w100 h20 +Disabled,PW
Gui, Add, Edit, x342 y9 w100 h20 +Password vpw,
Gui, Add, ListView, x12 y39 w430 h110 ,no | 상황
Gui, Add, Button, x12 y159 w430 h30 gstart,로그인하기
Gui, Show, x989 y489 h205 w455,% title
Return

return
start:
gui,submit,nohide


return
GuiClose:
ExitApp

 

 

간단한 인터페이스 구축이 되었으면, 각 Edit 및 Button에 v Label 을 달아주시기 바랍니다.

 

 

 

루파디움 WebDriver 사용

Chrome := new Rufaydium(A_WorkingDir "\Lib\chromedriver.exe")

 

Chrome 이라는 변수에

루파디움의 클래스의 인스턴트를 생성합니다. 이때 인스턴스를 생성할 때 생성자에 인수를 전달해야하는데, 

그 위치는, Lib 폴더안에 담겨있는  Chromedriver.exe 입니다. 

 

Page := Chrome.getSessionByUrl(네이버로그인주소)
if !isobject(page){
	Page := Chrome.NewSession()
	Page.Navigate(네이버로그인주소)
}else{
	msgbox,64,안내, 객체오류입니다
	return
}

 

 

Page := Chrome.getSessionByUrl(네이버로그인주소)

 

Chorme 변수에 할당된 객체에 getSessionByUrl 메서드를 호출하여, 네이버로그인 주소 URL에 세션을 Page 변수에 담습니다.

 

if !isobject(page){
	Page := Chrome.NewSession()
	Page.Navigate(네이버로그인주소)
}else{
	msgbox,64,안내, 객체오류입니다. 관리자에게 문의주세요
	return
}

 

if !isobject(Page) 함수는 변수가 객체인지 아닌지 여부를 판단합니다. 

만약, page 변수가 객체가 아니라면, Chrome 객체에 새로운 세션을 제공하여,

page변수에 담고 네이버 로그인 주소로 접속합니다.

 

pag변수가 객체라면, 메세지를 띄우고 스크립트를 종료합니다. 

 

Page.cdp.QuerySelector("#id").sendkey(id)
Page.getElementsByName("id")[0].SendKey(key.tab) ;ArrowDown
Page.cdp.QuerySelector("#pw").sendkey(pw)
Page.getElementsByName("pw")[0].SendKey(key.enter) ;ArrowDown

 

1. Page 객체에 cdp 형식의 QuerySelector 메소드를 호출하고 sendkey(id) 아이디 값을 적용합니다.

이때 id 값은 gui v라벨의 id 값을 가져옵니다. 

 

2. 1번과 동일하게 메서드를 호출하고 ( cdp X ) key.tab 값을 호출합니다. 

 

3. Page 객체에 cdp 형식의 QuerySelector 메소드를 호출하고 sendkey(pw) 패스워드 값을 적용합니다.

이때 pw 값은 gui v라벨의 id 값을 가져옵니다. 

 

4.  1번과 동일하게 메서드를 호출하고 ( cdp X ) key.enter 값을 호출합니다. 

 

 

 

완성 코드

#SingleInstance, Force
#Include Lib\Rufaydium.ahk
title:= "N Login"
Gui, Add, Button, x12 y9 w100 h20 +Disabled,ID
Gui, Add, Edit, x122 y9 w100 h20 vid,
Gui, Add, Button, x232 y9 w100 h20 +Disabled,PW
Gui, Add, Edit, x342 y9 w100 h20 +Password vpw,
Gui, Add, ListView, x12 y39 w430 h110 ,no | 상황
Gui, Add, Button, x12 y159 w430 h30 gstart,로그인하기
Gui, Show, x989 y489 h205 w455,% title

global naver_login_site := "https://nid.naver.com/nidlogin.login"
LV_Add(,LV_GetCount()+1,"프로그램 시작")
Return

return
start:
gui,submit,nohide
Chrome := new Rufaydium(A_WorkingDir "\Lib\chromedriver.exe")
Page := Chrome.getSessionByUrl(naver_login_site)
if !isobject(page){
	Page := Chrome.NewSession()
	Page.Navigate(naver_login_site)
}else{
	msgbox,64,안내, 객체오류입니다. 관리자에게 문의주세요
	return
}

Page.cdp.QuerySelector("#id").sendkey(id)
Page.getElementsByName("id")[0].SendKey(key.tab) ;ArrowDown
LV_Add(,LV_GetCount()+1,"아이디 입력")
Page.cdp.QuerySelector("#pw").sendkey(pw)
Page.getElementsByName("pw")[0].SendKey(key.enter) ;ArrowDown
LV_Add(,LV_GetCount()+1,"패스워드 입력 및 로그인시도")

return
GuiClose:
ExitApp

 

네이버 로그인.ahk
0.00MB

 

루파디움 Rufaydium.ahk 라이브러리는, 페이지가 호출 , 리디렉션 및 페이지 로딩을 자동으로 기다려줍니다. 

따로, 페이지에 대한 정보를 통해 페이지가 변경되었구나 라는 조건을 따로 적용해주실 필요없습니다.

 

다만 네이버 로그인 페이지 같은경우에는, 동적 페이지가 아니므로 가능한 경우입니다.

 

 

 

 

예외 : 로그인 실패시

사용자가 로그인에 실패했을 경우의 변수도 생각해야합니다.

이때 네이버 로그인을 실패했을 경우, 여러가지 환경을 확인해봐야할 필요가 있습니다.

 

  사용자가 아이디를 입력하지 않았을때    사용자가 비밀번호를 입력하지 않았을때
  사용자가 아이디 및 비밀번호를 입력하지 않았을때 아이디 및 비밀번호가 틀렸을
실패했을때 URL 주소가 변경되는가? 반대로 로그인 성공시와 실패시 페이지의 차이점

 

여러가지 확인 법이 있지만 대체적으로 이렇게 예외상황에 대한 환경을 분석하여

예외처리를 할 수있습니다.

 

아주간단하게, 로그인시 네이버 페이지가 변화하고 

네이버 메인 홈 호출되는 부분을 볼 수 있는데요 .

 

 

 

로그아웃, 로그인 부분을 체크해볼 것입니다

로그인 페이지에 보여지지 않은, 혹은 로그아웃 이라는 글자가 있다면, 로그인성공으로 본다.라고 정의를 내리고 

코드를 작성해봅시다. 

( Page.Html 을 사용할 예정이라서, 만약 다른 사이트에서 페이지 내부 <!------ 로그아웃 시 ------> 이러한 주석 코드가 있다면 다른 방법으로 하셔야합니다 .)

 

 

#SingleInstance, Force
#Include Lib\Rufaydium.ahk
title:= "N Login"
Gui, Add, Button, x12 y9 w100 h20 +Disabled,ID
Gui, Add, Edit, x122 y9 w100 h20 vid,
Gui, Add, Button, x232 y9 w100 h20 +Disabled,PW
Gui, Add, Edit, x342 y9 w100 h20 +Password vpw,
Gui, Add, ListView, x12 y39 w430 h110 ,no | 상황
Gui, Add, Button, x12 y159 w430 h30 gstart,로그인하기
Gui, Show, x989 y489 h205 w455,% title

global naver_login_site := "https://nid.naver.com/nidlogin.login"
LV_Add(,LV_GetCount()+1,"프로그램 시작")
Return

return
start:
gui,submit,nohide
Chrome := new Rufaydium(A_WorkingDir "\Lib\chromedriver.exe")
Page := Chrome.getSessionByUrl(naver_login_site)
if !isobject(page){
	Page := Chrome.NewSession()
	Page.Navigate(naver_login_site)
}else{
	msgbox,64,안내, 객체오류입니다. 관리자에게 문의주세요
	return
}

Page.cdp.QuerySelector("#id").sendkey(id)
Page.getElementsByName("id")[0].SendKey(key.tab) ;ArrowDown
LV_Add(,LV_GetCount()+1,"아이디 입력")
Page.cdp.QuerySelector("#pw").sendkey(pw)
Page.getElementsByName("pw")[0].SendKey(key.enter) ;ArrowDown
LV_Add(,LV_GetCount()+1,"패스워드 입력 및 로그인시도")


Data := Page.html
RegExMatch(data,"로그아웃",Check_ver)
if(Check_ver != ""){
LV_Add(,LV_GetCount()+1,"로그인 성공")
}else{
LV_Add(,LV_GetCount()+1,"로그인 실패")
}



return
GuiClose:
ExitApp

 

 

 

프로그램 종료시 실행된 ChromeDriver 종료까지

#SingleInstance, Force
#Include Lib\Rufaydium.ahk
title:= "N Login"
Gui, Add, Button, x12 y9 w100 h20 +Disabled,ID
Gui, Add, Edit, x122 y9 w100 h20 vid,
Gui, Add, Button, x232 y9 w100 h20 +Disabled,PW
Gui, Add, Edit, x342 y9 w100 h20 +Password vpw,
Gui, Add, ListView, x12 y39 w430 h110 ,no | 상황
Gui, Add, Button, x12 y159 w430 h30 gstart,로그인하기
Gui, Show, x989 y489 h205 w455,% title

global naver_login_site := "https://nid.naver.com/nidlogin.login"
LV_Add(,LV_GetCount()+1,"프로그램 시작")
Return

return
start:
gui,submit,nohide
Chrome := new Rufaydium(A_WorkingDir "\Lib\chromedriver.exe")
Page := Chrome.getSessionByUrl(naver_login_site)
if !isobject(page){
	Page := Chrome.NewSession()
	Page.Navigate(naver_login_site)
}else{
	msgbox,64,안내, 객체오류입니다. 관리자에게 문의주세요
	return
}

Page.cdp.QuerySelector("#id").sendkey(id)
Page.getElementsByName("id")[0].SendKey(key.tab) ;ArrowDown
LV_Add(,LV_GetCount()+1,"아이디 입력")
Page.cdp.QuerySelector("#pw").sendkey(pw)
Page.getElementsByName("pw")[0].SendKey(key.enter) ;ArrowDown
LV_Add(,LV_GetCount()+1,"패스워드 입력 및 로그인시도")


Data := Page.html
RegExMatch(data,"로그아웃",Check_ver)
if(Check_ver != ""){
LV_Add(,LV_GetCount()+1,"로그인 성공")
}else{
LV_Add(,LV_GetCount()+1,"로그인 실패")
}



return
Page_exit(){
	Page.close()
	Page.exit()
	Chrome.QuitAllSessions()
	Chrome.Driver.Exit() ; then exits driver
return
}
Return
GuiClose:
Page_exit()
ExitApp
return

 

네이버 로그인.ahk
0.00MB

 

반응형

+ Recent posts