[Python] 파이썬 자동화 기초 : pyautogui 오토마우스, 오토키보드 자동화 명령어 모음

[Python] 파이썬 자동화 기초 : pyautogui 오토마우스, 오토키보드 자동화 명령어 모음

엑셀VBA에서도 오토마우스, 오토키보드가 가능했다.

파이썬에서는 훨씬 더 쉽고 간단하게 마우스 이동, 클릭, 키입력 등을 자동화할 수 있다.

pyautogui 설치

pip install pyautogui

단어 gui 는 알다시피 Graphic User Interface 의 약자이다.

대기하기

n초 대기하기

import pyautogui # 3초 대기 pyautogui.sleep(3)

카운트다운 출력하며 대기하기

# 3초 동안 카운트 다운 # 3 2 1 출력됨 pyautogui.countdown(3)

모든 명령어에 대기 적용하기

# 모든 동작에 1초씩 sleep을 적용 pyautogui.PAUSE = 1 # 테스트 코드 # for문임에도 불구하고 1초마다 마우스 100, 100 씩 이동하게 됨 for i in range(10): pyautogui.move(100, 100)

마우스 자동화 (오토마우스)

절대 좌표로 마우스 이동하기

import pyautogui # 절대 좌표로 마우스 이동하기 pyautogui.moveTo(100, 100) # 0.25초 동안 절대좌표로 마우스 이동 pyautogui.moveTo(100, 100, duration=0.25)

상대좌표로 마우스 이동 (현재 커서 위치 기준으로 이동)

# 상대좌표로 마우스 이동 (현재 커서 위치 기준으로 이동) pyautogui.move(100, 100) # 0.25초 동안 상대좌표로 마우스 이동 (현재 커서 위치 기준으로 이동) pyautogui.move(100, 100, duration=0.25)

마우스 위치 출력하기

# 마우스 위치 출력하기 # 예 : Point(x=700, y=600) print(pyautogui.position()) # 마우스 위치 x, y 각각 출력하기 p = pyautogui.position() # 예 : 700 600 print(p[0], p[1]) print(p.x, p.y)

마우스 클릭하기

# 현재 위치 마우스 클릭 pyautogui.click() # 절대 좌표의 마우스 클릭 pyautogui.click(700, 600) # 1초 동안 절대 좌표로 이동 후에, 마우스 클릭 (기능상 moveTo + mouseDown + mouseUp 를 합친 것과 같음) pyautogui.click(700, 600, duration=1)

마우스 더블클릭

# 마우스 더블클릭 pyautogui.doubleClick() # 마우스 연속 500번 클릭 pyautogui.click(clicks=500)

마우스 우클릭

# 마우스 우클릭 pyautogui.rightClick()

마우스 드래그

# 현재 위치부터 상대좌표 (100, 150) 까지 드래그 pyautogui.drag(100, 150, duration=0.25) # 현재 위치부터 절대좌표 (100, 150) 까지 드래그 pyautogui.dragTo(100, 150, duration=0.25) # 드래그 직접구현 : (200, 200)부터 (300, 350)까지 드래그 pyautogui.moveTo(200, 200) pyautogui.mouseDown() pyautogui.moveTo(300, 350) pyautogui.mouseUp()

마우스 스크롤

# 마우스 스크롤 : 양수이면 위 방향으로, 음수이면 아래 방향으로 스크롤 # 위 방향으로 300만큼 스크롤 pyautogui.scroll(300) # 아래 방향으로 300만큼 스크롤 pyautogui.scroll(-300)

현재 마우스 정보 표시하기 (MouseInfo 프로그램 실행)

import pyautogui pyautogui.mouseInfo()

<MouseInfo 프로그램 사용 방법>

마우스를 원하는 특정 위치로 옮겨놓고, F1키(Copy All)를 누르면, xy좌표나 픽셀 RGB 값 등이 클립보드에 복사된다. 이어서 Ctrl + V키로 메모장 같은 곳에 붙여넣기하면 F1키를 누른 시점의 마우스 정보가 나온다.

마우스 제어 중단하는 방법

pyautogui 로 마우스 제어 시, 사용자가 화면 네 귀퉁이에 마우스를 갖다놓으면 프로그램이 중단된다.

# 사용자가 화면 네 귀퉁이에 마우스를 갖다놓으면 프로그램이 중단됨

마우스 제어 중단하지 않도록 처리

만약 pyautogui.FAILSAFE 값을 False 로 대입하면, 화면 네 귀퉁이에 마우스를 갖다놓아도 제어를 계속한다.

# 사용자가 화면 네 귀퉁이에 마우스를 갖다놓으면 프로그램이 중단됨 # 아래 변수를 False 처리하면 화면 네 귀퉁이에 마우스를 갖다놓아도 제어 계속함 pyautogui.FAILSAFE = False

키보드 자동화 (오토키보드)

숫자 또는 영어 문장 입력하기 (한글은 불가)

pyautogui.write(“12345”) pyautogui.write(“Hello World”, interval=1)

차례대로 키입력

# world 입력 후, 좌측화살표 5번 누르고, hello 띄어쓰기 입력 후, 엔터키 입력하기 # left는 좌측 화살표, right는 우측 화살표, enter는 엔터키를 의미함 pyautogui.write([“w”, “o”, “r”, “l”, “d”, “left”, “left”, “left”, “left”, “left”, “h”, “e”, “l”, “l”, “o”, ” “, “enter”])

문자열

의미

‘a’, ‘b’, ‘c’, ‘A’, ‘B’, ‘C’, ‘1’, ‘2’, ‘3’, ‘!’, ‘@’, ‘#’ 등등

해당하는 단일문자

‘enter’ (또는 ‘return’ 또는 ‘\n’)

ENTER 키

‘esc’

ESC 키

‘shiftleft’, ‘shiftright’

왼쪽과 오른쪽 SHIFT 키

‘altleft’, ‘altright’

왼쪽과 오른쪽 ALT 키

‘ctrlleft’, ‘ctrlright’

왼쪽과 오른쪽 CTRL 키

‘tab’ (또는 ‘\t’)

TAB 키

‘backspace’, ‘delete’

BACKSPACE 키, DELETE 키

‘pageup’, ‘pagedown’

PAGE UP 키, PAGE DOWN 키

‘home’, ‘end’

HOME 키, END 키

‘up’, ‘down’, ‘left’, ‘right’

상, 하, 좌, 우 화살표 키

‘f1’, ‘f2’, ‘f3’ 등등

F1 ~ F12 키

‘volumemute’, ‘volumedown’, ‘volumeup’

음소거, 볼륨 감소 키, 볼륨 증가 키

(일부 키보드에는 이러한 키가 없지만 운영 체제에서는 시뮬레이션된 키입력을 이해할 수 있음)

‘pause’

PAUSE 키

‘capslock’, ‘numlock’, ‘scrolllock’

CAPS LOCK 키, NUM LOCK 키, SCROLL LOCK 키

‘insert’

INS 또는 INSERT 키

‘printscreen’

PRTSC 또는 PRINT SCREEN 키

‘winleft’, ‘winright’

왼쪽과 오른쪽 윈도우(WIN) 키 (Windows OS 전용)

‘command’

Command 키 (mac OS 전용)

‘option’

OPTION 키 (mac OS 전용)

조합키 입력하기 (ex : shift + 4, ctrl + a)

# 조합키 간편하게 입력 # 달러 기호($)에 해당하는 shift + 4 입력하기 pyautogui.hotkey(“shift”, “4”) # 전체선택 단축키인 ctrl + a 입력하기 pyautogui.hotkey(“ctrl”, “a”) # 조합키 직접 구현하기 (1) pyautogui.keyDown(“ctrl”) pyautogui.keyDown(“a”) pyautogui.keyUp(“a”) pyautogui.keyUp(“ctrl”) # 조합키 직접 구현하기 (2) pyautogui.keyDown(“ctrl”) pyautogui.press(“a”) pyautogui.keyUp(“ctrl”)

한글 문자열 입력하기 (복사 붙여넣기 이용)

import pyperclip pyperclip.copy(“복사할 문자열”) # 문자열 붙여넣기 pyautogui.hotkey(“ctrl”, “v”) # 문자열 출력하기 print(pyperclip.paste())

키보드 제어 중단하는 방법

# 윈도우 OS 는 ctrl + alt + del 키입력 시 키보드 제어 중단함 # 맥 OS 는 cmd + shift + option + q 키입력 시 키보드 제어 중단함

스크린 정보 가져오기 (화면 정보 가져오기)

화면 사이즈 가져오기

import pyautogui # 현재 화면의 스크린 사이즈 가져오기 size = pyautogui.size() print(size) # size[0] == width # size[1] == height

현재화면 스크린샷 찍기

import pyautogui # 스크린샷 찍기 img = pyautogui.screenshot() # 파일 저장 img.save(“screenshot.png”)

화면 특정좌표의 픽셀값 가져오기

pixel = pyautogui.pixel(0, 0) # RGB값 출력 ex) (60, 64, 67) print(pixel)

화면 특정좌표의 픽셀값 색상 일치하는지 검사

# if pyautogui.pixelMatchesColor(x좌표, y좌표, (R, G, B)): if pyautogui.pixelMatchesColor(0, 0, (60, 64, 67)): print(“색상 일치”) else: print(“색상 불일치”)

이미지 찾기

화면에 이미지 존재하는지 확인 (locateOnScreen)

import pyautogui target_img= pyautogui.locateOnScreen(“target_img.png”) print(target_img) # 이미지를 찾으면 결과는 다음과 같이 나온다. ex) Box(left=900, top=82, width=31, height=23) # 이미지를 찾지 못하면 결과는 None 이라고 나온다

이미지 찾아서 클릭하기

# 이미지 클릭 target_img= pyautogui.locateOnScreen(“target_img.png”) pyautogui.click(target_img)

이미지 찾아서 마우스 이동하기

# 이미지 찾아서 마우스 이동하기 target_img= pyautogui.locateOnScreen(“target_img.png”) pyautogui.moveTo(file_menu)

복수의 이미지(n개 이미지) 가져오기 (locateAllOnScreen)

# 이미지 1개 가져오기 (locateOnScreen) # 이미지가 n개인 경우 첫번째 이미지 객체를 가져온다. target_img= pyautogui.locateOnScreen(“target_img.png”) # 이미지 n개 가져오기 (locateAllOnScreen) # 이미지가 n개 인 경우 제너레이터를 리턴하므로, for문 처리하면 된다. # 예를 들어 n개 이미지를 0.25 초 주기로 차례대로 클릭하기 for i in pyautogui.locateAllOnScreen(“target_img.png”): pyautogui.click(i, duration=0.25)

이미지 찾기 속도 개선하기

# 1. GrayScale 로 찾기 # 흑백으로 전환해서 찾기. 정확도가 떨어지지만 30% 정도 속도가 개선됨 target_img= pyautogui.locateOnScreen(“target_img.png”, grayscale=True) print(target_img) # 2. 범위 지정해서 찾기 # 메뉴같은 경우 위쪽에만 있는 상황에서 사용 # target_img= pyautogui.locateOnScreen(“target_img.png”, region=(x, y, width, height)) target_img= pyautogui.locateOnScreen(“target_img.png”, region=(0, 0, 1024, 300)) print(target_img) # 3. 정확도를 낮춰서 찾기 # 분명히 똑같은 이미지로 자동화했는데 사소한 차이로 클릭이 안되는 상황에서 사용 # 주의) pip install opencv-python 명령어로 패키지 설치해야 한다. # confidence=0.999 값이 기본값이다(=99.9%). # 아래 코드에서는 80% 정확도로 해본다. target_img= pyautogui.locateOnScreen(“target_img.png”, confidence=0.8) print(target_img)

이미지가 나타날 때까지 기다려야 하는 경우 : 찾을 때까지 무한정 반복하는 코드

print(“이미지 찾기 시작”) target_img = None while target_img is None: target_img = pyautogui.locateOnScreen(“target_img.png”) pyautogui.sleep(1) print(“이미지 찾기 성공”)

이미지가 나타날 때까지 기다려야 하는 경우 : 1초 간격으로 100번 찾아보는 코드

print(“이미지 찾기 시작”) target_img = None for i in range(0, 100): target_img = pyautogui.locateOnScreen(“target_img.png”) pyautogui.sleep(1) if target_img is None: print(“이미지 찾기 실패”) else: print(“이미지 찾기 성공”)

윈도우 정보 가져오기 (창 정보 가져오기)

현재 활성화된 윈도우(창) 객체 가져오기 (getActiveWindow)

import pyautogui # 현재 활성화된 윈도우(창) 객체 win = pyautogui.getActiveWindow() print(win) # 창 제목 print(win.title) # 창 크기 print(win.size) print(win.left, win.top, win.right, win.bottom)

모든 윈도우(창) 객체 가져오기 (getAllWindows)

# 모든 윈도우 객체 가져오기 for win in pyautogui.getAllWindows(): print(win)

특정 문자열을 제목에 포함하는 윈도우 객체 가져오기 (getWindowsWithTitle)

# 특정 문자열을 제목에 포함하는 윈도우 객체 n개 가져오기 for win in pyautogui.getWindowsWithTitle(“메모장”): print(win) # 특정 문자열을 제목에 포함하는 윈도우 객체 1개 가져오기 win = pyautogui.getWindowsWithTitle(“메모장”)[0] print(win)

특정 윈도우(창) 활성화 시키기

win = pyautogui.getWindowsWithTitle(“메모장”)[0] # 최소화 되어있다면 원복 if win.isMinimized == True: win.restore() # 윈도우(창) 활성화 win.activate()

기타 윈도우(창) 정보

# 최대화 여부 : 최대화는 화면 전체만큼 큰 사이즈 상태임. restore 를 사용하면 원복 가능 print(win.isMaximized) # 최소화 여부 : 최소화는 작업 표시줄로 숨어있는 상태임. restore 를 사용하면 원복 가능 print(win.isMinimized) # 활성화 여부 print(win.isActive)

메시지 박스

메시지 박스 표시 (alert)

import pyautogui pyautogui.alert(“메시지 내용입니다”, “경고”)

확인 박스 표시 (confirm)

result = pyautogui.confirm(“확인하시겠습니까?”, “확인”) print(result) # 결과는 “OK” 또는 “Cancel”

문자열 입력받기 (prompt)

result = pyautogui.prompt(“파일명을 무엇으로 하시겠습니까?”, “입력”) print(result) # 취소하면 None 값 나옴 # 빈값 입력 후 확인하면 “” 값 나옴

참고사이트 1 : pyautogui 라이브러리 공식문서 https://pyautogui.readthedocs.io/

참고사이트 2 : 파이썬 프로그래밍으로 지루한 작업 자동화하기 https://automatetheboringstuff.com/2e/chapter20/

참고사이트 3 : 나도코딩 https://www.youtube.com/watch?v=exgO1LFl9x8&t=4285s