IT_developers

Python RPA(업무자동화) 개념 및 실습 - pyautogui 본문

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)
file_menu.png

 

마우스를 이용해서 체크박스 자동으로 체크

  • 화면의 크기가 바뀔 수 있으므로 좌표를 찾지 않음
  • 빈 체크 박스 캡쳐본 사용

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()  # 프로그램 종료. 메모장에 내용이 있다면 저장 여부 확인.
Comments