Skip to content

Latest commit

 

History

History
207 lines (156 loc) · 7.29 KB

220220.md

File metadata and controls

207 lines (156 loc) · 7.29 KB

Day 128

업무자동화(RPA)

데스크탑 자동화

마우스 정보

import pyautogui
pyautogui.mouseInfo()

mouse_info

위의 창이 뜨는데 해당 창이 열려 있는 상태에서 f1을 누르면 해당 좌표와 색 코드가 클립보드에 복사된다.

데스크탑 자동화 코드가 실행 중일 때 모니터의 네 모서리에 마우스를 가져다 놓으면 강제 종료된다.

pyautogui.FAILSAFE = False
pyautogui.PAUSE = 1 # 모든 동작에 1초씩 sleep 적용

FAILSAFE는 모서리에 마우스를 가져가도 프로그램이 종료되지 않게 한다. 그래서 유사시에 강제 종료를 할 수 없기 때문에 사용하지 않는 것이 좋은 옵션이다.

PAUSE는 모든 동작에 sleep을 적용한다.

스크린

import pyautogui

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

#23,14 60,169,242 #3CA9F2
pixel = pyautogui.pixel(23, 14)
print(pixel)

print(pyautogui.pixelMatchesColor(23, 14, (60, 169, 242)))
print(pyautogui.pixelMatchesColor(23, 14, pixel))

(60, 169, 242)
True
True

pixel()은 해당 좌표에 해당하는 픽셀의 RGB 값을 가져온다.

pixelMatchesColor()는 주어진 좌표의 픽셀의 RGB값이 주어진 RGB값과 다르면 False 같으면 True를 반환한다.

이미지 처리 (기본)

import pyautogui

file_menu = pyautogui.locateOnScreen("./desktop_automation/file_menu.png")
print(file_menu)
pyautogui.click(file_menu)

Box(left=39, top=4, width=50, height=25)

file_menu

locateOnScreen()은 이미지 파일을 주면 그 이미지를 화면에서 찾아서 좌표를 반환한다.

그래서 pyautogui.click()에 반환된 좌표를 주면 해당 좌표로 이동해서 클릭한다.(여기서는 사각형 좌표가 반환되어 사각형의 중앙으로 이동)

이미지를 찾지 못하면 None을 반환한다.

pyautogui는 이미지 기반이어서 화면 해상도가 달라지면 작동하지 않을 확률이 매우 높다.

하나의 페이지에 여러 같은 이미지가 있을 때는 locateAllOnScreen()을 사용하면 된다.

import pyautogui

for i in pyautogui.locateAllOnScreen('./desktop_automation/checkbox.png'):
    print(i)
    pyautogui.click(i)

locateAllOnScreen()은 화면 내에서 지정한 이미지에 해당하는 모든 정보를 가져온다.

이미지 처리 (속도 개선)

# 속도 개선
# 1. GrayScale
file_menu = pyautogui.locateOnScreen("./desktop_automation/file_menu.png", grayscale=True)
pyautogui.moveTo(file_menu)

# 2. 범위 지정
file_menu = pyautogui.locateOnScreen("./desktop_automation/file_menu.png", region=(0, 0, 300, 300))
pyautogui.click(file_menu)

# 3. 정확도 조정
file_menu = pyautogui.locateOnScreen("./desktop_automation/file_menu.png", confidence=0.9)
pyautogui.click(file_menu)

grayscale은 말 그대로 이미지를 grayscale로 처리하여 비교하며 찾는 옵션으로 속도는 개선될 수 있지만 정확도가 떨어질 수 있다.

region은 (x, y, width, height)의 형태로 범위를 지정해서 해당 범위만을 찾게하는 것으로 속도를 개선한다.

confidence는 정확도를 조정하는 옵션이다. 0.9를 주면 주어진 이미지와 90% 이상 일치하면 인식한다.

이미지 처리 (대기)

자동화를 할 때 해당하는 화면이 바로 나오지 않고 잠시후에 나오는 경우가 있다. 그래서 해당 대상이 나올 때까지 기다릴 필요가 있다.

# 자동화 대상이 바로 보여지지 않는 경우
# 1. 계속 기다리기
check_box = pyautogui.locateOnScreen('./desktop_automation/checkbox.png')
while check_box is None:
    check_box = pyautogui.locateOnScreen('./desktop_automation/checkbox.png')

pyautogui.click(check_box)

# 2. 일정 시간동안 기다리기 (TimeOut)
timeout = 10 # 10초 대기
start = time.time() # 시작 시간 설정
check_box = None
while check_box is None:
    check_box = pyautogui.locateOnScreen('./desktop_automation/checkbox.png')
    end = time.time() # 종료 시간 설정
    if end - start > timeout: # 지정한 10초를 초과하면
        print('시간 종료')
        sys.exit()

pyautogui.click(check_box)

윈도우 다루기

import pyautogui

fw = pyautogui.getActiveWindow() # 현재 활성화된 창 정보를 가져온다.
print(fw.title) # 창의 제목 정보
print(fw.size)  # 창의 크기 정보 (width, height)
print(fw.left, fw.top, fw.right, fw.bottom) # 창의 좌표 정보
pyautogui.click(fw.left + 10, fw.left + 10)

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

w = pyautogui.getWindowsWithTitle('캡처 도구')[0]
print(w)
if w.isActive == False: # 현재 활성화가 되지 않았다면
    w.activate() # 활성화 (맨 앞으로 가져오기)

if w.isMaximized == False: # 현재 최대화가 되지 않았다면
    w.maximize() # 최대화

if w.isMinimized == False: # 현재 최소화가 되지 않았다면
    w.minimized() # 최소화

w.restore() # 화면 원복

w.close() # 윈도우 닫기

<Win32Window left="1576", top="161", width="643", height="329", title="캡처 도구">

active()는 최소화되어 있을 때는 작동하지 않는다.

키보드

import pyautogui
import pyperclip

w = pyautogui.getWindowsWithTitle('제목 없음')[0]
w.activate()

pyautogui.write('12345') # '12345'를 입력한다
pyautogui.write('KrTeaparty', interval=1) # 글자마다 1초 동안 기다리고 입력

pyautogui.write(['t', 'e', 's', 't', 'left', 'left', 'right', 'l', 'a', 'enter'], interval=0.25)
# t e s t 순서대로 적고 왼쪽 방향키 2번, 오른쪽 방향키 1번 l a 적고 엔터키 입력

# 특수 문자
pyautogui.keyDown('shift') # shift 키를 누른 상태에서
pyautogui.press('4')       # 숫자 4를 입력하고
pyautogui.keyUp('shift')   # shift 키를 뗀다

# 조합키 (Hot key)
pyautogui.keyDown('ctrl')
pyautogui.keyDown('a')
pyautogui.keyUp('a')    # press('a')
pyautogui.keyUp('ctrl') # Ctrl + A

# 간편한 조합키
pyautogui.hotkey('ctrl', 'a') # ctrl 누름 > a 누름 > a 뗌 > ctrl 뗌

# 한글 입력
pyperclip.copy('안녕') # '안녕' 글자를 클립보드에 저장
pyautogui.hotkey('ctrl', 'v') # ctrl + v

pyautogui.write는 한글을 입력하지 못한다. 그래서 클립보드에 저장하고 붙여넣기 하는 방식으로 한글을 입력해야한다.

ctrl + alt + del를 입력하면 자동화 프로그램이 종료된다.

메세지 박스

import pyautogui

pyautogui.countdown(3) # 카운트 다운을 해줌 (3 2 1)
print('Automation Start')

pyautogui.alert('Something Wrong', 'Alert title')  # 확인 버튼만 있는 팝업
result = pyautogui.confirm('Continue?', 'Confirm') # 확인, 취소 버튼
print(result) # 확인이면 'OK', 취소면 'Cancel'
result = pyautogui.prompt('Write centence', 'input') # 사용자 입력
print(result) # 입력하면 입력한 문자열, 취소하면 None
result = pyautogui.password('input password')        # 암호 입력
print(result)

password는 입력한 부분이 *로 치환되어 무엇을 입력하고 있는지 보이지 않게 해주는 것이다.