pyautogui로 업무 자동화를 해보자
들어가기.
요즘 많은 업무시스템이 웹으로 구성되어 있을거라 생각합니다. 제가 대학에 있을 때에는 연구를 웹으로 하는 건 아니지만, 행정업무를 하려면 웹으로 된 행정시스템에 접속해야 했었고, 지금 직장에서도 모든 업무처리는 웹브라우저를 이용하고 있습니다. 심지어 아래한글마저도 웹에서 구동하고 있습니다.
근데 업무라는게 하다보면 별다른 것 없는데, 반복적으로 해야하는 것들이 있습니다. 업무시스템(웹)에서 어느 부분에서 어떤 데이터를 조회하고, 그 값을 보고 다른 곳에 값을 입력하고 저장하고, 아니면 업무시스템을 보면서 문서를 작성하거나 하는게 전부일때가 있습니다. 업무시스템을 개발할 때 자동으로 되게끔 하지 굳이 비싼 인력을 고용해서 업무시간에 일부를 단순한 작업으로 보내게 만들었을까 하는 불만은 있지만, 그래도 월급쟁이는 불만없이 일해야겠지요.
불필요하게 반복되는 작업이 귀찮아서 파이썬으로 업무를 자동화하는 프로그램을 만들면, 조금이나마 여유가 생기게 되고, 초반에 버그를 몇번 수정하고 나면 직접 일처리하는 것보다 정확하게 일을 처리할 수 있습니다.
파이썬엔 웹에서의 업무자동화 관련한 패키지로 selenium을 생각할 수 있는데, 문제는 selenium으로 접속조차할 수 없는 업무시스템에서는 무용지물이 됩니다. 이런 경우, 마우스와 키보드를 컨트롤 할 수 있는 pyautogui가 괜찮은 해결책이 될 수 있습니다. 물론 단점이 있다면 pyautogui가 마우스와 키보드를 컨트롤하고 있는 동안에는 제가 키보드와 마우스에서 손을 떼고 있어야 한다는 것이랄까요.
pyautogui 설치
pyautogui 설치는 그리 설명할 것도 없네요.
pip install pyautogui
여담으로 제 경우에는 내부 업무망에서는 인터넷이 되지 않아서, pyautogui 설치가 바로 되지 않았습니다. 외부 인터넷망에서 pyautogui 패키지를 파일로 다운로드 받아 내부로 옮긴 후 설치했었습니다. 이 방법이 상당히 고달픈데, 설치하다보면 요구되는 패키지들이 있는데, 이것들도 설치가 안되니까 요구되는 패키지와 엮여있는 모든 패키지들을 에러메시지를 보며 하나하나 외부망에서 내부망으로 파일을 옮겨 설치했었습니다. 업무시간을 단축시키고 귀찮음을 해소시킨 것을 생각하면, 1~2시간 노가다를 하더라고 엮여 있는 패키지들을 하나하나 파일을 옮겨가며 설치하는 것도 괜찮은 투자였다고 생각합니다.
사용할 패키지
import pyautogui
import pyperclip
여기서 pyperclip은 pyautogui를 설치할 때 같이 설치되는 패키지입니다. 복사 & 붙여넣기, 복사한 것을 변수에 저장, 한글 입력 등에 유용하게 쓰입니다.
기본 함수 설명
# 화면 크기 받기
width, height = pyautogui.size()
# 마우스 위치 받기
x, y = pyautogui.position()
# 마우스 이동 (좌표값)
pyautogui.moveTo(100,200)
# 마우스 이동 (현재 마우스 위치로부터 상대값)
pyautogui.moveRel(0,-100)
# (0,100)에서 (100,100)으로 마우스 드래그
pyautogui.mouseDown(x=0,y=100); pyautugui.mouseUp(x=100,y=100)
pyautogui.moveTo(x=0,y=100); pyautogui.dragTo(x=100,y=100)
pyautogui.moveTo(x=0,y=100); pyautogui.dragRel(100,0)
# 마우스 스크롤
pyautogui.scroll(500)
# 마우스 클릭
pyautogui.click()
# 클릭 옵션, 좌표 (100,100)에서 10초간격으로 3번 우클릭
pyautogui.click(x =100, y=100, clicks=3, interval=10, button='right')
# double & triple 클릭
pyautogui.doubleClick()
pyautogui.tripleClick()
# 입력
pyautogui.typewrite('test') # entry 창 등에 문자 입력
pyautogui.press('enter') # enter키 입력
pyautogui.press(['tab','space']) # tab, space 연속 입력
pyautogui.hotkey('ctrl','c') # 궁극의 Ctrl+c, Ctrl+v도 동일 방법
# 이미지로 좌표 받기
x, y = pyautogui.locateCenterOnScreen('image.png')
업무자동화 툴 만들기 팁.
1. 이미지로 기준 좌표 얻기
업무창을 이리저리 움직이며 일하다보면 업무창의 위치가 정확히 어디에 있는지 pyautogui 코드가 찾아야합니다. 아래 다음 포털 사이트 초기 화면을 예를 들면 검색창 좌측의 daum 로고를 이미지로 저장, locateCenterOnScreen()으로 좌표를 받아서, 그 좌표로부터 x,y축으로 얼마만큼 이동하면 로그인 버튼이고, 메일 버튼, 이런 식으로 프로그래밍하면 편합니다.
2. 드래그보다 더블클릭이나 트리플클릭이 편한 경우가 많음
링크가 걸린 글이 아니라면 어느 좌표에서 어디까지 드래그해서 문자를 선택하는 것보다, 대강 해당 위치로 가서 더블클릭이나 트리플클릭을 해서 단어, 줄, 단락을 선택을 하는게 간단할 수 있습니다.
3. 복사(ctrl + c)한 값을 변수에 저장할 때
pyautogui.hotkey('ctrl','c')
time.sleep(0.1)
a = pyperclip.paste()
pyperclip.paste()로 변수에 저장이 가능한데, 중간에 0.1초 정도 쉬는 이유는 pyautogui의 입력과 관련된 것들을 쓰다보면 중간중간 쉬는 시간을 넣지 않으면, 제대로 키가 제대로 입력되지 않는 경우가 있어서 이를 방지하기 위함입니다.
4. 문자열을 붙여넣기(ctrl+v)하고 싶을 때 / 한글을 입력하고 싶을 때
text = "안녕하세요"
pyperclip.copy(text)
time.sleep(0.1)
pyautogui.hotkey('ctrl','v')
입력창에 한글을 입력하고 싶거나, 문자열로 가지고 있던 값을 입력하고 싶을 때에는 pyperclip.copy()로 그 값을 복사해서 붙여넣기를 합니다. 알파벳이나 숫자가 아닌 pyautogui.typewrite('한글입력')은 안타깝게도 안됩니다. 그래서 위처럼 번거롭게 해야합니다.
5. 중간중간 sleep
pyautogui의 press, hotkey 와 pyperclip의 copy, paste 등을 연달아 이용할 때에는 interval 옵션이나, time.sleep을 적절히 중간중간에 넣어주어야 합니다. 그러지 않으면 중간중간 키가 안눌리고 넘어가는 듯한 현상이 나타납니다. 가끔 원하는대로 작동하지 않아서 중간에 멈추는 시간을 좀더 길게 조절해보면 멀쩡히 작동하는 경우가 있습니다.
마무리
위의 설명된 pyautogui의 기능이 전부는 아니지만, 또 그리 많이 설명할 게 없는 패키지입니다. 저의 경우 위의 함수들로만으로 조합해서 업무시스템에서 필요한 값을 가져와 보고서를 만드는 프로그램을 만들어 쓰고 있습니다. 보고서를 작성하는 시간이 확연하게 줄어들었고, 제가 직접 타이핑했을 때 생겼던 실수로 인해 공문을 다시 보내는 일이 없어졌습니다. 프로그램이 알아서 키보드와 마우스를 조작하는 동안에는 카톡을 확인하든 스트레칭을 하든 딴짓을 하다 돌아오면 보고서가 작성되어 있는 쾌감을 얻고 있습니다.
'컴 & 프로그래밍 > PYTHON' 카테고리의 다른 글
오차/불확도 전파(Error Propagation)을 쉽게 계산하자 (1) | 2020.06.03 |
---|---|
파이썬 보간법(python interpolation) (0) | 2020.06.02 |
파이썬 주식 캔들 스틱 차트 그리기 (3) | 2020.05.10 |
파이썬 텔레그램 봇(telegram bot) 만들기 2: 간단 채팅봇 만들기 (0) | 2020.05.05 |
파이썬 텔레그램 봇(telegram bot) 만들기 1: 토큰(token) 받기 (0) | 2020.05.05 |