Tag Archives: AutoIT

AutoIT MS워드 자동화

전에 AutoIT을 통한 자동화에 대한 글을 쓴적이 있는데, 얼마전에 자동화할때 MS워드에서 정보를 추출할 일이 있어서 AutoIT에 포함된 워드 모듈을 써볼 기회가 있었습니다. AutoIT에서 제공하는 워드 함수에 대한 문서만으로는 자동화하기는 부족하더군요. MSDN을 참고해서 워드의 객체 모델을 어느정도 이해하시고 Range 객초 참고하시면 큰 도움이 될듯합니다. MSDN이 Visual Basic 위주로 되어 있지만, 문법은 동일하게 쓰면 됩니다.

아래 예제 보시면 어느정도 감이 오실듯하네요.

#include <word.au3>

; 화면에 보이지 않고 포커스 안가져가도록 인자 전달
$oWordApp = _WordCreate(“”, 0, 0, 0)

; test.doc 문서 열기
$doc = _WordDocOpen($oWordApp, “test.doc”)

; 문단 객체 가져오기
$paragraph = $doc.Paragraphs
 
; 첫번째 문단 텍스트 가져오기 (텍스트만)
$paragraph1text = $paragraph(1).Range.Text

; 두번째 문단 클리보드에 복사 (포맷,링크,그림등 포함)
$paragraph(2).Range.Copy

; 세번째 문단부터 끝까지 클립보드에 복사
$doc.Range($paragraph(3).Range.Start).Copy

; 세번째 문단부터 다섯번째 문단까지 텍스트 가져오기

$paragraph3to5text = $doc.Range($paragraph(3).Range.Start, $paragraph(5).Range.End).Text

; 문서내 모든 링크 가져와서 출력하고 다른 주소로 변경
For $hyper in $doc.HyperLinks
    ConsoleWrite(“link=” & $hyper.Address & @CRLF) ; 링크 출력
    $hyper.Address = “http://mix1009.net” ; 모든 링크 바꾸기 —
Next

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”)