Monthly Archives: May 2008

AutoIT3으로 단순 작업 자동으로~

회사에서 웹에서 검색하고 정보를 취합하는 일이 생겨서 고민하다가, 그전부터 알고 있던 툴을 이용하여 자동화했습니다. 원래 3 M/M 정도 예상했었는데 4시간 정도 투자해서 자동화에 거의 성공했습니다. 자동화해서 돌리면 넉넉하게 5일 정도면 돌릴수 있을거 같네요.

AutoIT은 스크립팅 언어로 마우스와 키보드 입력을 자동화하는 툴로, 시스템 관리자들이 많이 쓴다고 합니다. 스크립팅 언어이지만 EXE로 만들어서 배포할수 있으며, 이 경우 AutoIT을 설치하지 않아도 되므로, 간단한 어플은 AutoIT을 통해서 만들어서 EXE로 배포되는것도 있습니다.

윈도우즈가 기본적으로 GUI기반으로 되어있기때문에 유닉스의 쉘에서는 쉽게 할수 있는게 처리할 자료의 양이 많아지면 난감해지는 경우가 있죠. 그럴 경우 AutoIT이 아주 유용할수 있죠.

어제 AutoIT을 배우면서 시험삼아 예전에 사용하던 Zope 웹서버의 쌓인 스팸을 지웠습니다. 5만개 정도(!)가 쌓였었는데… Zope 인터페이스가 웹기반이라 마우스로 하나씩 찍어서 지워야합니다. 이게 귀찮아서 그냥 냅뒀었는데… 간단히 마우스와 키보드를 저장하여 프로그램화하여 한 10분만에 모두 지웠습니다 ^^v

AutoIT을 설치하면 에디터가 같이 설치되는데 개발할때 정말 유용하네요. 에디터에서 F5(실행), Ctrl-Break(중지)는 필수죠. 그리고 디버깅할때도 ConsoleWrite 함수를 이용하면 에디터 하단에 출력내용이 표시됩니다.

사실 AutoIT에서 사용하는 스크립트가 좀 현대적이지 못해서 불편합니다. 자바스크립트나 파이썬 정도의 언어로 이런일을 할수 있으면 더 편할것 같더군요. 그리고 웹에서 괜찮은 튜토리얼이 별로 없더군요. 제가 작업하면서 배운 내용들을 간단하게 설명할께요.

설치하시면 AutoIt Window Info라는 툴이 있습니다. 여기서 창 이름, 마우스의 위치 등을 확인할수 있습니다. 옵션에 보면 Coord Mode를 Window에 맞추세요. 아니면 창위치가 바뀌면 곤란해집니다. 그리고 스크립트 맨앞에 아래를 추가하세요.

AutoItSetOption(“MouseCoordMode”, 0)

기본적인 사용방법은 아주 간단합니다.
먼저 입력할 윈도우를 찾고 마우스 클릭이나 키보드 입력을 전달하면 됩니다. 아래는 메모장을 띄우고 텍스트를 입력하고 마우스로 메뉴를 클릭하면 종료하는 내용입니다.

AutoItSetOption(“MouseCoordMode”, 0)

Send(“#r”)                        ;    Windows-r (실행)
WinWaitActive(“실행”)            ; 실행창 기다리기
Send(“notepad{ENTER}”)            ; 메모장 실행
WinWaitActive(“제목 없음 – 메모장”)    ; 메모장 창 기다리기
Send(“Hello AutoIT!”)            ; 메모장에 키 입력
MouseClick(“left”,26,38)        ; 파일 클릭
Sleep(500)                           ; 500ms (0.5초) 기다리기
MouseClick(“left”,26,185)         ; 끝내기 클릭

Send에서 #은 윈도우키, ^은 Ctrl, -는 Shift, !은 Alt입니다. 그리고 {}에 들어가는 키들은 메뉴얼을 참고하세요.

WinWaitActive는 새창으로 뜨는 창을 기다리는 것이고, 이미 떠있는 창을 찾으려면 WinActivate 함수를 이용하면 됩니다.

Sleep함수 호출은 위에서 필요없지만… 시스템이 느리거나 네트웍을 통해서 정보를 받아오거나 하면 Sleep를 얼마나 줄지 정하는게 매우 중요해집니다.

한글을 Send로 보내면 깨지는데 이럴경우 클립보드를 이용해서 보내면 안깨집니다. 클립보드로 복사하고 Ctrl-v로 붙이기하면 됩니다.

ClipPut(“한글을 클립보드를 통해서 보내면 됩니다.”)
Send(“^v”)

디버깅은 WriteConsole 함수 이용하면 됩니다. 변수는 아래처럼 쓰고, 문자열은 &로 합칠수 있고, @CRLF가 다음줄로 넘어가는 겁니다.

$var = “value”
WriteConsole(“var =” & $var & @CRLF)

프로그램이 복잡해지다보면 함수를 정의하시면 됩니다. 다만 함수 내에서 사용하는 인자를 제외한 변수들이 전역 변수로 취급됩니다! 아래 프로그램 실행하면 “2, 3″이 출력됩니다.

$g = “1”
$x = “3”
testFunction($x)
ConsoleWrite($g & “, ” & $x & @CRLF)

Func testFunction($z)
   $z = “4”
   $g = “2”
EndFunc

위에 설명한 내용과 조건문과 반복문 정도(메뉴얼 참고하세요) 알면 어느정도 자동화를 할수 있습니다. 문제는 화면 출력이 일정하지 않을때인데… 대부분 웹페이지들의 출력이 일정하지 않습니다. 이럴때 필요한 것이 IE.au3 입니다. Internet Explorer 모듈인데 사용하기 전에 아래처럼 사용한다고 포함해야합니다.

#include <IE.au3>

함수들은 모두 _IE로 시작합니다. IE에 네이버 띄우고 검색창에 AutoIT입력하고 검색하는 예제입니다.

#include “IE.au3″

$oIE = _IECreate(“www.naver.com”)
$query = _IEGetObjById($oIE, “query”)
_IEDocInsertText($query, “AutoIT”)
$form = _IEFormGetObjByName($oIE, “search”)
_IEFormSubmit($form)

AutoIT의 버그인지 모르겠으나 이미 존재하는 창에 _IEAttach가 잘 안되었는데 윈도우 핸들을 먼저 구해서 붙이면 잘 붙더군요…

$hWnd = WinGetHandle ($winname)
$oIE = _IEAttach($hWnd, “HWND”)