파이썬 Pyautogui로 매크로 만들기

취업 후 학습|2023. 2. 26. 18:54
728x90

파이썬은 인터프리터 언어라 컴파일 언어에 비해 비록 느리지만 사용자 친화적으로 쉬운 구문과 광범위한 응용 프로그램에 사용할 수 있단 장점이 있다.

 

특히 강력한 라이브러리로 데이터 분석, AI, 자동화 등에 강점을 보이는데 이번에는 자동화(매크로)에 자주 쓰이는 Pyautogui에 대해 알아보자.

 

시작 전에 처음 들어봤거나 확실하게 알지 못하는 사람들을 위해 매크로가 무엇인지 알아보자.

 

매크로란 컴퓨터 과학 분야에서 정해진 순서에 따라 특정한 입력 시퀀스가 출력 시퀀스를 정의하는 규칙이나 패턴을 말한다. (출처 : 위키백과)

 

즉, 쉽게 풀어서 말하자면 정해진 반복 작업을 컴퓨터가 수행하는 것이다.

 

특히 게임이나 티켓팅, 수강신청 등에서 매크로란 단어를 많이 접했을 텐데 이들의 공통점이 정해진 위치를 반복적으로 이동, 클릭, 입력한다는 점이다.

 

로직만 잘 구성한다면 불필요한 반복 작업을 컴퓨터에게 대신시킬 수 있기 때문에 아주 유용한 스킬이다.

 

Pyautogui 사용하기


그럼 Pyautogui를 설치해 보자.

 

필자는 윈도우 환경이며 Visual Studio Code를 사용하기 때문에 터미널에 바로 입력하면 된다.

 

Pyautogui 설치 로그
Pyautogui 설치 로그

 

명령어는 pip install pyautogui이고 위 사진처럼 Successfully installed 로그가 찍힌다면 설치가 완료된 것이다.

 

이제 Pyautogui를 설치했으니 관련 함수들을 알아보자.

 

함수들은 크게 마우스, 키보드, 이미지 관련 함수로 나눌 수 있는데 상당히 함수가 많기 때문에 그중에서도 자주 쓰일만한 함수들만 정리했다. 

 

특히 빨간 표시는 생략 가능한 옵션을 뜻한다.

 

 마우스 관련 함수
 position()  마우스의 현재 위치 좌표 출력
 mouseInfo()  마우스의 죄표, RGB Color 등 관련 정보
 moveTo(x, y, n)  좌표 (x, y)로 n 초 동안 이동
 dragTo(x, y, n)  좌표 (x, y)로 n 초 동안 드래그
 click(button=’right’)  왼쪽 클릭 (오른쪽 클릭)
 click(clicks=n, interval=t)  왼쪽 클릭 (t초 간격으로 n번 클릭)
 doubleClick()  왼쪽 더블 클릭
 scroll(x)  x만큼 스크롤 이동(양수면 위, 음수면 아래)
 키보드 관련 함수
 write(‘String’, interval=n)  영어 문자열을 n초 마다 입력 (한글 지원 X)
 keyDown(‘key’)  key에 해당하는 키를 누름
 keyUp(‘key’)  key에 해당하는 키를 뗌
 press([‘key’], presses=n, interval=t)  리스트에 있는 키를 t초에 한 번씩 n 입력
 hotkey(‘key1’, ’ key2’)  key1, key2 입력
 KEYBOARD_KEYS  입력 가능한 키 리스트
 이미지 관련 함수
 screenshot(‘test.png’, region=(x1, y1, x2, y2))  스크린샷 이미지 객체 반환, test.png 명으로 파일 저장, (x1, y1) 부터  (x2, y2)까지의 영역
 locateOnScreen(‘test.png’)  test.png 와 일치하는 영역 반환(left, top, width, height)
 locateAllOnScreen(‘test.png’)  test.png 와 일치하는 모든 영역 반환(left, top, width, height)
 locateCenterOnScreen(‘test.png’)  test.png 와 일치하는 영역의 중앙 좌표 반환
 기타 함수
 size()  주 모니터 크기 반환(width, height)
 countdown(n)  n초 동안 카운트 다운하며 각 숫자를 출력
 PAUSE = t  각 함수별 t초 딜레이(Default = 0.1초)

 

특히 매크로는 정해진 좌표를 반복 클릭하기 때문에 구현 단계에서 좌표를 얻을 수 있는 mouseInfo()가 상당히 유용한 함수다.

 

주의해야 할 점은 키보드 관련 함수에서 알파벳키를 입력하고 실제 입력 상황에서 한글로 되어 있다면 상관없지만 write로 직접 한글 입력은 지원하지 않기 때문에 한글 입력을 위해선 편법을 위한 추가 사항이 조금 필요하다.

 

바로 pyperclip을 설치해서 클립보드에 한글을 복사 후 붙여 넣기 하는 방식이다.

 

명령어는 pip install pyperclip이며 pyautogui를 설치할 때처럼 동일하게 하면 된다.

 

import pyperclip, pyautogui

# 클립보드에 한글 문자열 복사
pyperclip.copy('한글 입력 테스트')

# ctrl + v 로 붙여넣기
pyautogui.hotkey('ctrl', 'v')

 

설치 후 위 코드처럼 작성하면 한글을 입력하는 듯한 효과를 볼 수 있다.

 

모든 함수를 사용한 예제를 보기엔 너무 방대하므로 간단하게 특정 위치를 반복 클릭하는 매크로와 임시 비밀번호를 생성해서 저장하는 예제를 살펴보자.

 

반복 클릭 매크로


import pyautogui

# 첫 시작 위치로 이동
pyautogui.moveTo(334, 351)

# 시작 위치에서 마우스가 벗어나면 반복 중지
while pyautogui.position().x == 334 and pyautogui.position().y == 351:
    pyautogui.click()
    pyautogui.moveTo(320, 446)
    pyautogui.click()
    pyautogui.moveTo(334, 351)

 

위 코드는 특정 위치를 무한 반복 클릭하는 코드다.

 

이때 주의해야 할 점은 마우스를 다루기 때문에 딜레이나 무한 루프를 탈출할 조건을 사용하지 않을 경우 이도저도 못하는 난감한 상황이 발생할 수 있다.

 

해당 예제에서는 시작 위치를 정하고 마우스가 위치를 벗어날 경우 프로그램을 종료하도록 작성했다.

 

위와 같은 로직으로 미리 mouseInfo() 함수를 이용해서 좌표 정보를 얻고 작성하면 빠르게 반복 클릭할 수 있다.

 

임시 비밀번호 생성 후 저장


import pyautogui, random, time

# 길이가 8인 소문자 임시 비밀번호 생성
def temp_pw():
    pw = ''
    for i in range(8):
        pw += chr(random.randrange(97,123))
    return pw

# 메모장 위치
pyautogui.moveTo(496, 423)
pyautogui.doubleClick()

# 메모장이 켜질때까지 대기
time.sleep(1)

# 메모장에 커서 생성
pyautogui.moveTo(604, 713)
pyautogui.click()

# 5개의 임시 비밀번호 생성
for i in range(5):
    pyautogui.write(temp_pw()+'\n')

# 저장
pyautogui.hotkey('ctrl', 's')

# 메모장 종료
pyautogui.hotkey('alt', 'f4')

 

필자는 임시 비밀번호를 저장하기 위한 메모장을 생성했었고 해당 위치 좌표로 이동 후 더블 클릭으로 켰다.

 

너무 속도가 빨라 엉뚱한 곳을 클릭하는 것을 방지하기 위해 메모장이 켜질 때까지 대기하려 time.sleep(1)을 했다.

 

메모장이 켜지면 커서를 생성하기 위해 한번 클릭을 했고 소문자로 이루어진 8자리 임시 비밀번호를 저장 후 종료하는 로직이다.

 

이처럼 파이썬의 자동화 도구를 잘 사용하면 불필요한 반복 작업을 컴퓨터에게 시킬 수 있어 상당히 편리하고 개인에게 강력한 무기가 될 수 있다고 생각한다.

 

필자도 종종 필요한 경우 자동화 코드를 작성해서 편리했고 이를 본 주위 사람들이 신기해했던 경험이 있기 때문이다.

 

차후에 단순한 마우스, 키보드 자동화 말고도 엑셀 파일처럼 업무 자동화에 대해서도 가능한 자세히 포스팅하도록 하겠다.

728x90

'취업 후 학습' 카테고리의 다른 글

스프링이란? 스프링과 스프링 부트의 차이점은?  (0) 2023.06.20
리액트 data.map is not a function 에러 해결  (0) 2023.05.03
jQuery로 요소 찾기  (0) 2023.01.03
SAP ERP란  (0) 2022.09.29
Git Branch 전략  (0) 2022.08.17

댓글()