본문 바로가기

programming/python

[ python 활용하기 #1 ] 파이썬 이미지 인식 매크로 (pyautogui)

[ python 활용하기 #1 ] 파이썬 이미지 인식 매크로 (pyautogui)

 

안녕하세요 심심한 코딩쟁이입니다.

 

이번 포스팅에서는 파이썬 이미지 인식 매크로를 만들어보는 시간을 가지겠습니다.

 

pyautogui
파이썬의 pyautogui


개발환경

 

Windows10, python 3.x.x, VSCode, pyautogui 를 사용하여 오늘 포스팅을 진행합니다.


python 3.x.x 설치

 

파이썬 3 아무 버전이나 상관없습니다. 아래 글을 참고하시고 최신 버전으로 설치해주세요.

 

[ Python ] Windows10 파이썬 설치 및 실행

 

 

[ Python ] Windows10 파이썬 설치 및 실행

[ Python ] Windows10 파이썬 설치 및 실행 안녕하세요. 심심한 코딩쟁이입니다. 오늘은 Windows10 파이썬의 설치 과정을 살펴보도록 하겠습니다. 데이터 분석, 통계, 머신러닝 등 다양한 분야에 사용하

symxsym.tistory.com


VSCode 설치 및 파이썬 연동

 

설치가 필요하다면 아래 글을 참고해주시기 바랍니다.

 

[ VSCode ] 비주얼 스튜디오 코드 (Visual Studio Code) 설치

 

 

[ VSCode ] 비주얼 스튜디오 코드 (Visual Studio Code) 설치

[ VSCode ] 비주얼 스튜디오 코드 (Visual Studio Code) 설치 안녕하세요 심심한 코딩쟁이입니다. 이번 포스팅에서는 비주얼 스튜디오 코드 설치에 대해서 알아보겠습니다. 비주얼 스튜디오 코드 마이크

symxsym.tistory.com

 

 

VSCode를 실행 후 왼쪽 메뉴 중 Extensions 을 클릭 또는  Ctrl + Shift + X  를 입력

 

python 검색 후 Microsoft 가 적혀있는 확장 프로그램을 설치합니다.

 

install 또는 설치라고 적혀있는 버튼을 클릭하시면 됩니다.

 

python-install
파이썬 확장 프로그램 설치

 

VSCode에 현재 설치되어있는 python을 연동하기 위해서 Ctrl + Shift + P 를 누른 후

 

python: select interpreter 를 입력하면 설치되어있는 파이썬 리스트가 나오고 사용할 버전을 지정해줍니다.

 

select-interpreter
파이썬 인터프리터 설정

 

저는 이전에 설치해둔 3.9.6 버전을 사용하겠습니다.

 

python-interpreter
vscode에서 사용할 파이썬 버전 선택


pyautogui 패키지 설치

 

CMD 또는 PowerShell 에서 아래 명령어를 통해 패키지 설치.

 

VSCode에서 터미널을 이용하셔도 무관합니다.

 

pip install pyautogui

 

여기까지 진행하셨다면 이미지 인식 매크로 개발 환경 구축에 성공하셨습니다.


pyautogui 사용법

 

매크로가 필요한 작업이 창의 위치가 변하지 않을 때는 단순히 클릭해야 할 좌표만 구하면 쉽게 작업을 끝낼 수 있다.

 

창의 위치가 변하는 작업은 클릭할 버튼의 이미지를 찾아 좌표를 얻어내 매크로를 작성할 수 있다.

 

매크로 작성에 필요한 코드 설명입니다.

 

import pyautogui as pg # pyautogui를 사용할 때 pg로 사용 가능
                       # pyautogui.click() 과 pg.click() 이 같은 기능을 함
                       
print(pg.size()) # 현재 사용중인 모니터의 크기를 출력 예) width=1920, height=1080
                 # 좌상단 좌표 (0,0), 우하단 좌표 (1919,1079)  

print(pg.position()) # 현재 마우스 포인터의 좌표를 출력

pg.moveTo(200,200) # x 200, y 200 위치로 마우스 포인터 이동

pg.click() # 현재 마우스 포인터 위치에서 좌클릭
pg.click(x,y) # (x,y) 위치에서 좌클릭
pg.click(button='right') # 우클릭
pg.click(clicks=5, interval=1) # 1초를 간격으로 5번 클릭
pg.doubleClick() # 더블클릭

left_top = pg.locateOnScreen('img.png') # 현재 모니터에서 img.png 파일과 같은 영역의 좌상단 좌표, 너비, 높이 반환
print(left_top) # img.png 파일과 같은 영역의 좌상단 좌표, 너비, 높이 출력
                # 못 찾으면 None 출력

center = pg.locateOnScreen('img.png') # 현재 모니터에서 img.png 파일과 같은 영역의 정중앙 좌표 반환
print(left_top) # img.png 파일과 같은 영역의 정중앙 좌표 출력
                # 못 찾으면 None 출력

 

이 정도 코드만 활용해도 충분히 멋진 매크로를 작성할 수 있습니다.

 

만약 PyscreezeException 예외가 발생한다면 pip install Pillow --upgrade 로 해결

 

pillow-upgrade
Pillow 업그레이드


여러 모니터 사용 시 pyautogui 사용법

 

만약 듀얼 모니터 또는 그 이상의 모니터를 쓰시는 분들은 다음과 같이 코드를 수정해주시기 바랍니다.

 

# pyautogui는 1번 모니터에만 작동하게끔 작성되어있음
# 이미지를 찾을때 모든 모니터에서 찾도록 설정을 변경하는 과정

from PIL import ImageGrab
from functools import partial
import pyautogui as pg

ImageGrab.grab = partial(ImageGrab.grab, all_screens=True)

# 이후 필요 코드 작성

 

2번 모니터에 있는 이미지 영역은 잘 찾지만 클릭이 안 되는 경우 아래와 같은 방법을 사용합니다.

 

1920x1080 해상도를 사용하고 있을 때 2번 모니터가 1번 모니터의 왼쪽에 있으면

 

마우스 클릭에 필요한 x좌표에 -1920 를 해주면 클릭이 제대로 이루어진다.

 

2번 모니터가 1번 모니터 오른쪽에 있다면 x좌표에 +1920를 해주어야 한다.

 

트리플 모니터의 경우에도 1번 모니터의 좌상단 좌표를 기준으로 클릭 좌표를 신경 써주면 됩니다.


이미지 인식 매크로

 

반복적인 작업을 자동화해주는 프로그램을 흔히 매크로라고 부르는데

 

광고를 보고 리워드를 받는 특정 앱에 매크로를 적용시켜 보도록 하겠습니다.

 

앱을 실행하기 위해서 NoxPlayer를 사용하고 2번 모니터에 띄워두고 진행하였습니다.

 

매크로 시나리오


광고 시청 버튼을 클릭하면 광고가 재생되고 시청 후에 닫기 버튼을 눌러 광고창을 닫으면 리워드를 받게 됨.


리워드를 받은 후 돌아가기 버튼을 클릭해 첫 화면으로 돌아가게 됩니다.

1. 광고 시청 버튼 클릭
2. 광고 시청 후 닫기 버튼 클릭
3. 첫 화면으로 돌아가기 버튼 클릭

1~3번 반복

주의사항

광고마다 닫기 버튼의 위치와 생김새가 다르지만 종류가 한정적이기 때문에 여러 닫기 버튼 이미지를 수집하면 해결 가능

광고 건너뛰기 버튼도 추가적으로 클릭해주면 더 빠르게 진행 가능

 

코드 작성

 

from PIL import ImageGrab # 듀얼 모니터 pyautogui 설정
from functools import partial # 듀얼 모니터 pyautogui 설정
import pyautogui as pg
import time

ImageGrab.grab = partial(ImageGrab.grab, all_screens=True) # 듀얼 모니터 pyautogui 설정

count = 0 # 광고 시청 횟수

while count< 20 : # 원하는 광고 시청 횟수 지정

    puzzle1 = pg.locateCenterOnScreen('puzzle1.png') # 광고 시청 버튼
    if type(puzzle1) != type(None) : # 이미지를 찾았으면 아래코드 진행
        print("puzzle1 있다 클릭")
        pg.click(puzzle1.x-1920, puzzle1.y)
        count += 1
        continue   
    puzzle2 = pg.locateCenterOnScreen('puzzle2.png') # 리워드 획득 후 돌아가기 버튼
    if type(puzzle2) != type(None) : 
        print("puzzle2 있다 클릭")
        pg.click(puzzle2.x-1920, puzzle2.y)
        time.sleep(1)
        pg.click(puzzle2.x-1920, puzzle2.y) # 광고 시청 버튼이 같은 위치여서 찾지 않고 클릭
        count += 1
        continue

    close1 = pg.locateCenterOnScreen('close1.png') # 여러개의 닫기 버튼
    if type(close1) != type(None) : 
        print("close1 있다 클릭")
        pg.click(close1.x-1920, close1.y)
        continue
    close2 = pg.locateCenterOnScreen('close2.png')
    if type(close2) != type(None) : 
        print("close2 있다 클릭")
        pg.click(close2.x-1920, close2.y)
        continue
    close3 = pg.locateCenterOnScreen('close3.png')
    if type(close3) != type(None) : 
        print("close3 있다 클릭")
        pg.click(close3.x-1920, close3.y)
        continue
    close4 = pg.locateCenterOnScreen('close4.png')
    if type(close4) != type(None) : 
        print("close4 있다 클릭")
        pg.click(close4.x-1920, close4.y)
        continue
    close5 = pg.locateCenterOnScreen('close5.png')
    if type(close5) != type(None) : 
        print("close5 있다 클릭")
        pg.click(close5.x-1920, close5.y)
        continue
    close6 = pg.locateCenterOnScreen('close6.png')
    if type(close6) != type(None) : 
        print("close6 있다 클릭")
        pg.click(close6.x-1920, close6.y)
        continue
    close7 = pg.locateCenterOnScreen('close7.png')
    if type(close7) != type(None) : 
        print("close7 있다 클릭")
        pg.click(close7.x-1920, close7.y)
        continue
    close8 = pg.locateCenterOnScreen('close8.png')
    if type(close8) != type(None) : 
        print("close8 있다 클릭")
        pg.click(close8.x-1920, close8.y)
        continue
    close9 = pg.locateCenterOnScreen('close9.png')
    if type(close9) != type(None) : 
        print("close9 있다 클릭")
        pg.click(close9.x-1920, close9.y)
        continue
    close10 = pg.locateCenterOnScreen('close10.png')
    if type(close10) != type(None) : 
        print("close10 있다 클릭")
        pg.click(close10.x-1920, close10.y)
        continue

    skip1 = pg.locateCenterOnScreen('skip1.png') # 여러개의 건너뛰기 버튼
    if type(skip1) != type(None) : 
        print("skip1 있다 클릭")
        pg.click(skip1.x-1920, skip1.y)
        continue
    skip2 = pg.locateCenterOnScreen('skip2.png')
    if type(skip2) != type(None) : 
        print("skip2 있다 클릭")
        pg.click(skip2.x-1920, skip2.y)
    skip3 = pg.locateCenterOnScreen('skip3.png')
    if type(skip3) != type(None) : 
        print("skip3 있다 클릭")
        pg.click(skip3.x-1920, skip3.y)

 

pyautogui와 반복문, 제어문을 이용해 간단하게 이미지 인식 매크로를 만들어 보았습니다.

 

실제로 1번 모니터에서 영상을 시청하면서 2번 모니터에서 매크로를 돌려보았는데

 

손가락 까닥하지 않고 리워드를 잘 받아낼 수 있었습니다.

 

더 완벽하게 작동시키려면 디테일한 코드 수정이 필요하겠지만 광고를 무한히 시청할 수 있는 것도

 

아니기에 적당한 선에서 마무리 지었습니다.


여기까지 파이썬 활용하기 #1 pyautogui을 이용한 이미지 인식 매크로 만들기였습니다.

 

다음 파이썬 활용하기 시간에도 작업을 편리하게 해주는 주제를 선정해 진행하도록 하겠습니다.

 

많은 관심 부탁드리고 조금이나마 도움이 되셨으면 좋겠습니다.

 

감사합니다.

반응형