Python
Python RPA(업무자동화) 개념 및 실습 - pyautogui
developers developing
2022. 9. 24. 12:00
RPA(Robotic Process Automation)
- 웹, 윈도우, 어플리케이션(엑셀 등)을 사전에 설정한 시나리오에 따라 자동적으로 작동하여 수작업을 최소화하는 일련의 프로세스
- RPA 사용 소프트웨어
- Uipath, BluePrism, Automation Anywhere, WinAutomation
- RPA 라이브러리
- pyautogui, pyperclip, selenium
pyautogui : 윈도우의 화면상 마우스 조정, 키보드 조정, 좌표 인식 ...
라이브러리 설치 : pip install pyautogui
RPAbasic\pyautogui 폴더 - 1_env.py
윈도우 화면의 스크린 크기(모니터 사이즈, 해상도) 출력
import pyautogui
size = pyautogui.size()
print(size) # Size
print(size[0]) # width
print(size[1]) #height
RPAbasic\pyautogui 폴더 - 2_mouse_move.py
마우스 이동
좌표인식 - position()
현재 마우스가 위치한 좌표
pos = pyautogui.position()
print(pos)
print(pos.x, ", ", pos.y)
# 마우스 이동 - moveTo(x,y,시간) : 절대좌표
# 어디로 갈껀지
# duration=1 : 1초동안 움직이기
pyautogui.moveTo(100, 100, duration=1)
pyautogui.moveTo(200, 200, duration=1)
pyautogui.moveTo(300, 300, duration=1)
# 마우스 이동 - moveRel(x,y,시간) / move(x,y,시간) : 상대좌표
pyautogui.moveTo(300, 300, duration=1)
pyautogui.moveRel(100, 100, duration=0.5)
print(pyautogui.position())
RPAbasic\pyautogui 폴더 - 3_mouse_action.py
마우스 액션 : click, doubleclick, drag and drop, scroll
# 마우스 클릭 - 왼/오 클릭
# click() : 현재 위치에서 왼쪽 클릭이 기본
# click(x,y) : x,y 좌표에서 왼쪽 클릭
pyautogui.click()
# 원하는 곳 좌표 알아내기 : File
# pyautogui.sleep(초) : 초 뒤에 실행
pyautogui.sleep(3)
print(pyautogui.position())
# 알아낸 위치 클릭하기
pyautogui.click(x=70, y=17, duration=0.5)
# click(clicks=n) : n=2 인 경우 더블 클릭
pyautogui.sleep(1)
pyautogui.click(clicks=5) # 5번 클릭
# 2초 간격으로 오른쪽 버튼 2번 클릭
pyautogui.click(clicks=2, interval=2, button="right")
# 더블클릭 : 위치값 지정
pyautogui.doubleClick(x=487, y=142)
# 오른쪽 클릭
pyautogui.rightClick(500, 300)
# mouseDown() : 마우스 누르기
# mouseUp()
pyautogui.sleep(3) # 화면 바꿀 시간, 실행 후 그림판 띄우기
pyautogui.moveTo(200, 200)
pyautogui.mouseDown()
pyautogui.moveTo(300, 300)
pyautogui.mouseUp()
그림판에서 실행

# drag(x,y) : 상대 좌표로 움직이기
# dragTo(x,y) : 절대 좌표로 움직이기
# 메모장 위치 확인
pyautogui.sleep(3)
print(pyautogui.position()) # Point(x=997, y=147)
# 마우스가 메모장이 있는 곳으로 이동
pyautogui.moveTo(x=997, y=147)
# 상대좌표로 움직이기
pyautogui.drag(100, 0, duration=0.5)
# 절대좌표로 움직이기
pyautogui.dragTo(x=885, y=389)
# scroll(값) : 값이 음수이면 아래로 스크롤, 양수이면 위로 스크롤
pyautogui.scroll(-1000)
pyautogui.scroll(1000)
RPAbasic\pyautogui 폴더 - 4_mouse_info.py
# 마우스 위치 값 알아낼 수 있음.
pyautogui.mouseInfo() # 프로그램 생성

# [참고] 자동화 프로그램이 돌아가는 도중 멈추고 싶다면
# 모니터 4개의 귀퉁이로 마우스를 옮겨 버리면 에러메세지를 내며 멈춤
# 10번 반복
for i in range(10):
pyautogui.moveTo(100, 100)
pyautogui.sleep(1)
RPAbasic\pyautogui 폴더 - 5_screen.py
모니터 화면 캡쳐
import pyautogui as p # 별칭주기
# 모니터 전체 화면 캡쳐
p.screenshot("./RPAbasic/pyautogui1/screen.png")
img = p.screenshot() # 전체화면 캡쳐
img.save("./RPAbasic/pyautogui1/screen.png")
# 특정 영역 캡쳐
p.screenshot("./RPAbasic/pyautogui1/screen.png", region=(0, 0, 300, 400))

RPAbasic\pyautogui 폴더 - 6_image.py
이미지 인식 : 모니터마다 해상도가 달라서 꼭 현재 모니터만 인식
# locateOnScreen(path, confidence) : 캡쳐한 이미지의 화면상 좌표 구하기
# 이미지 기반이어서 해상도가 바뀌면 잘 안됨
# 이미지 파일명은 영문으로 작성
# 화면상 보여야지 값이 나옴
# 화면에 없거나, 못찾으면 None으로 나옴
screen_locate = p.locateOnScreen("./RPAbasic/pyautogui1/screen.png")
print(screen_locate)
# 찾아서 클릭까지
# confidence : 신뢰도(default 1, 0.8~0.9로 설정)
# 라이브러리 설치 : pip install opencv-python
# 이미지를 못찾는다면 confidence 값 주기
screen_locate = p.locateOnScreen("./RPAbasic/pyautogui1/file_menu.png", confidence=0.9)
print(screen_locate)
p.click(screen_locate)


마우스를 이용해서 체크박스 자동으로 체크
- 화면의 크기가 바뀔 수 있으므로 좌표를 찾지 않음
- 빈 체크 박스 캡쳐본 사용
locateAllOnScreen() : 찾아야 하는 이미지가 여러개 있는 경우
p.sleep(2)
for i in p.locateAllOnScreen("./RPAbasic/pyautogui1/checkbox.png", confidence=0.9):
print(i) # 사진으로 잘 찾는지 먼저 확인
p.click(i)
화면에 띄워놓고 찾았는지, 찾았다면 클릭. 체크박스 좌표 확인
# 찾아야 하는 대상이 화면에 늦게 나타나는 경우
# 1) 찾을때까지 반복시키기
file_menu = p.locateOnScreen("./RPAbasic/pyautogui1/checkbox.png", confidence=0.9)
# file_menu가 없다면 계속 찾아줘
while file_menu is None:
file_menu = p.locateOnScreen("./RPAbasic/pyautogui1/checkbox.png", confidence=0.9)
print("발견할 수 없음")
# 계속 찾다가 발견하면 클릭
p.click(file_menu)
# 2) 일정한 시간만큼만 기다리기
import time, sys
# 기다리는 시간 지정
timeout = 15
# 시작 시간
start = time.time()
file_menu = p.locateOnScreen("./RPAbasic/pyautogui1/checkbox.png", confidence=0.9)
# file_menu가 없다면 계속 찾아줘
while file_menu is None:
file_menu = p.locateOnScreen("./RPAbasic/pyautogui1/checkbox.png", confidence=0.9)
end = time.time()
if end - start > timeout:
print("시간종료")
sys.exit()
# 계속 찾다가 발견하면 클릭
p.click(file_menu)
RPAbasic\pyautogui 폴더 - 7_keyboard.py
키보드 자동화
import pyautogui as p
# 입력 : write()
p.write("write") # 커서 있는 부분에 write 작성 됨
# 메모장에 문자열 타이핑
# 화면에 메모장이 안보여도 가능. 띄어만 놓기
# 현재 화면에 메모장 활성화
# getWindowsWithTitle(제목)[숫자] : 윈도우들 중에서 제목이라는 창을 [숫자] 몇번째인거 찾아봐
notepad = p.getWindowsWithTitle("제목 없음")[0]
notepad.activate()
p.write("write")
p.write("pyautogui", interval=0.5) # 천천히 쓰기
# 해야 할 작업을 리스트로 작성
p.write(
["h", "e", "l", "l", "o", "left", "left", "right", "l", "o", "enter"],
interval=0.25,
)
p.write("안녕하세요") # 한글 지원 안함

한글 지원 라이브러리 설치 : pip install pyperclip
pyperclip
- 클립보드 이용하는 개념
- 클립보드 복사해서 붙여넣기
import pyperclip
# hotkey(조합키)
pyperclip.copy("안녕하세요") # ctrl + c
p.hotkey("ctrl", "v")
p.hotkey("ctrl", "a") # 전체 선택
p.hotkey("ctrl", "shift", "esc") # 작업관리자 단축키
# keyDown() + keyUp() == press()
notepad = p.getWindowsWithTitle("제목 없음")[0]
notepad.activate()
p.keyDown("shift")
p.press("4")
p.keyUp()

# press([입력값], 몇번, 몇초 뒤)
# 2번 작성
p.press(["a", "b", "c"], 2)
# 2번 작성 1초뒤에
p.press(["#", "$", "%"], 2, 1)
RPAbasic\pyautogui 폴더 - 8_window.py
import pyautogui as p
# getActivWindow() : 현재 활성화된 창 가지고 오기
w = p.getActiveWindow()
print(w)
print(w.title)
print(w.size)
print(w.left, w.right, w.top, w.bottom)
p.click(w.left + 25, w.top + 20)

# getAllWindows() : 현재 윈도우에 떠 있는 모든 창 가져오기
for w in p.getAllWindows():
print(w)

# getWindowsWithTitle() : 특정 타이틀을 가진 창 모두 가져오기
w = p.getWindowsWithTitle("제목 없음")[0]
# 활성화 된 상태가 아니라면 활성화시키기
if not w.isActive:
w.activate()
# 최대화가 아니라면 최대화 시키기
if not w.isMaximized:
w.maximize()
p.sleep(1)
# 최소화 상태가 아니라면
if not w.isMinimized:
w.minimize()
# 창 종료
p.sleep(1)
w.close() # 프로그램 종료. 메모장에 내용이 있다면 저장 여부 확인.