공작소굴

이번 포스트에서는 PyAutoGui 라이브러리를 사용하여 화면에서 원하는 이미지를 찾아 마우스가 자동으로 이동하여 클릭하게 하는 방법에 대해 알아보겠습니다. 

 

PyAutoGui 라이브러리의 기본적인 내용인 마우스와 키보드 제어는 이전 포스트를 확인해 주세요.

 

[Python] 파이썬 PyAutoGui 라이브러리 : 마우스 키보드 제어

안녕하세요. 공작소굴입니다. 이번 포스트에서는 pyautogui 라이브러리로 마우스와 키보드를 자동으로 제어하여 웹사이트에 접속하고 필요한 정보를 캡쳐해 저장하는 방법을 알아보도록 하겠습

mechacave.tistory.com

 

카카오톡에 메시지를 자동으로 보내는 프로그램을 만들어 가며 기능들을 익혀보기로 하겠습니다.

(이 내용은 '만들면서 배우는 파이썬과 40개의 작품들'에 기반합니다.)

 

제작 순서는 아래와 같습니다.

1. 카카오톡 내 사진 캡처하여 저장하기
2. 화면에서 내 사진의 좌표 찾기
3. 나에게 메시지 보내기
4. 일정 시간 간격으로 메시지 보내는 스레드 만들기

 

1. 카카오톡 내 사진 캡쳐하여 저장하기

카카오톡을 열고 내 사진을 캡쳐합니다. 이때 여러 가지 상황을 고려하여 아래와 같이 3가지 경우에 대해 모두 캡처합니다.

 

▶  마우스가 내려져 있을 경우 - 흰색 배경 (kakaoMe1.jpg)

▶ 마우스가 올려져 있을 경우 - 옅은 회색 배경 (kakaoMe2.jpg)

▶ 마우스를 클릭했을 경우 - 짙은 회색 배경 (kakaoMe3.jpg)

 

캡처한 이미지들은 프로그램을 작성할 폴더에 넣어 놓습니다. 

 

2. 화면에서 내 사진의 좌표 찾기

locationOnScreen() : 이미지의 좌상단 좌표와 크기 찾기

locationOnScreen('파일명') 함수를 사용하여 화면 상에서 저장한 사진과 동일한 위치를 찾아 시작 좌표(좌상단)와 크기(가로, 세로)를 찾아보겠습니다.

import pyautogui
import os

# 디렉토리를 현재 파일이 있는 폴더로 바꾸는 작업입니다.
os.chdir(os.path.dirname(os.path.abspath(__file__)))

# 1번 이미지 찾기
imgXY = pyautogui.locateOnScreen('kakaoMe1.jpg')
print(imgXY)

# 2번 이미지 찾기
imgXY = pyautogui.locateOnScreen('kakaoMe2.jpg')
print(imgXY)

# 3번 이미지 찾기
imgXY = pyautogui.locateOnScreen('kakaoMe3.jpg')
print(imgXY)

3개의 이미지를 모두 찾아봤는데,  3개 모두 찾지 못하는 의외의 결과가 나왔습니다.

100% 정확히 일치해야 하는데, 어떤 이유에선지 화면에서 찾지 못하는 것 같습니다.

이 때는 100%가 아니라 90% 정도의 신뢰 수준으로 이미지를 판단하여 찾아보는 것이 좋습니다.

속성 의미 값 ( 1 = 100% ) default
confidence 신뢰도 0.0 ~ 1.0 1.0

 

이렇게 confidence(신뢰) 옵션을 0.9로 주면 3개의 이미지를 모두 찾을 수 있습니다.

# 신뢰도 0.9로 찾을 경우
imgXY = pyautogui.locateOnScreen('kakaoMe1.jpg', confidence = 0.9)
imgXY = pyautogui.locateOnScreen('kakaoMe2.jpg', confidence = 0.9)
imgXY = pyautogui.locateOnScreen('kakaoMe3.jpg', confidence = 0.9)

 

첫 번째 이미지의 경우, 화면상 좌표 (1208, 78)에서 시작되어 가로 185px, 세로 70px의 크기로 찾아냈음을 알 수 있습니다.

 

위의 예에서는 비슷한 3개의 이미지 중 100% 정확한 1개를 찾는 것보다, 1개의 이미지를 사용하여 신뢰도 90%의 이미지를 찾는 것이 더 효과적이었습니다. 물론 케이스 바이 케이스입니다.

 

locationCenterOnScreen() : 이미지의 중심 좌표 찾기

이미지를 찾았으면, 그 중심을 알아내어 클릭해야 합니다. 

1. locationOnScreen() + center() 함수 사용하여 중심 좌표를 찾는 방법

# 1번 이미지 찾기
imgXY = pyautogui.locateOnScreen('kakaoMe1.jpg', confidence = 0.9)
print(imgXY)

# 찾아낸 시작 좌표와 크기를 사용하여 중심 찾기
centerXY = pyautogui.center(imgXY)
print(centerXY)

결과.

 

2. locationCenterOnScreen() 함수로 이미지의 중심좌표를 한 번에 찾을 수 도 있습니다.

# 1번 이미지의 중심점 찾기
imgCenterXY = pyautogui.locateCenterOnScreen('kakaoMe1.jpg', confidence = 0.9)
print(imgCenterXY)

결과.

 

결과는 같게 나옵니다. 이미지의 시작 위치나 크기가 따로 필요하지 않다면, locationCenterOnScreen()을 써서 한 번에 찾는 것이 효율적이겠네요.

 

3. 나에게 메시지 보내기

이제 실제로 나에게 메시지를 보내 보도록 하겠습니다.

import py
import pyautogui
import pyperclip
import os
import time

# 디렉토리를 현재 파일이 있는 폴더로 바꾸는 작업입니다.
os.chdir(os.path.dirname(os.path.abspath(__file__)))

# 1. 이미지의 중심점 찾기
imgCenterXY = pyautogui.locateCenterOnScreen('kakaoMe1.jpg', confidence = 0.9)

# 이미지를 찾았다면,
if imgCenterXY is not None:
    
    # 이미지의 중심점을 표시합니다.  
    print(imgCenterXY)
    
    # 2. 이미지의 중심을 더블클릭하여 채팅창을 엽니다.
    pyautogui.doubleClick(imgCenterXY)
    time.sleep(0.5)
    
    # 3. 클립보드에 메시지를 저장합니다.
    pyperclip.copy('이 메시지는 파이썬에서 자동으로 보내집니다.')
    
    # 4. 클립보드의 메시지를 붙여넣습니다.
    pyautogui.hotkey('Ctrl', 'v')
    
    # 5. [ENTER] 키를 입력하여 메시지를 보냅니다.
    time.sleep(0.5)
    pyautogui.press('enter')
    
    # 6. [ESC] 키를 입력하여 채팅창을 닫습니다.
    time.sleep(0.5)
    pyautogui.press('esc')

 

결과를 살펴볼까요?

프로그램만 실행시켰을 뿐인데, 카톡에서 제 사진을 찾아 메시지를 보내고 있습니다. 기특하네요. 

 

4. 일정 시간 간격으로 메시지를 보내는 스레드 만들기

마지막으로 일정한 시간 간격을 두고 메시지를 계속 보내는 스레드를 만들어 보겠습니다. 마치 알람이 울렸을 때 끄지 않으면, 10분 간격으로 계속 울리는 것 처럼 말이죠.

 

schedule 라이브러리를 추가합니다.

import schedule

 

메시지를 보내는 프로그램 전체를 함수 만듭니다.

def sendKakaoMsg():
	''' 이미지 찾아 메시지 보내는 프로그램 '''

 

스케줄원하는 시간값과 함께 동작할 함수를 등록합니다.

# [10초 마다 'sendKakaoMsg'함수 실행하기]를 스케줄에 추가합니다.
schedule.every(10).seconds.do(sendKakaoMsg)

 

▶ 스케줄을 계속 실행하도록 무한 반복합니다.

# 무한 반복
while True:
	# 스케줄에 등록된 함수를 설정된 시간마다 실행합니다.
	schedule.run_pending()
	time.sleep(1)

실행 결과 10초 마다 카톡창을 열어 메시지를 보내게 됩니다.

[전체 코드]

 

더보기
import pyautogui
import pyperclip
import os
import time
import schedule


# 디렉토리를 현재 파일이 있는 폴더로 바꾸는 작업입니다.
os.chdir(os.path.dirname(os.path.abspath(__file__)))

def sendKakaoMsg():
        
    # 이미지의 중심점 찾기
    imgCenterXY = pyautogui.locateCenterOnScreen('kakaoMe1.jpg', confidence = 0.9)

    # 이미지를 찾았다면,
    if imgCenterXY is not None:
        
        # 이미지의 중심점을 표시합니다.  
        print(imgCenterXY)
        
        # 이미지의 중심을 더블클릭하여 채팅창을 엽니다.
        pyautogui.doubleClick(imgCenterXY)
        time.sleep(1.0)
        
        # 클립보드에 메시지를 저장합니다.
        pyperclip.copy('이 메시지는 파이썬에서 자동으로 보내집니다.')
        
        # 클립보드의 메시지를 붙여넣습니다.
        pyautogui.hotkey('Ctrl', 'v')
        
        # 엔터를 입력하여 메시지를 보냅니다.
        time.sleep(1.0)
        pyautogui.press('enter')
        
        # esc 키를 입력하여 채팅창을 닫습니다.
        time.sleep(1.0)
        pyautogui.press('esc')


schedule.every(10).seconds.do(sendKakaoMsg)

while True:
    schedule.run_pending()
    time.sleep(1)

 

마무리

이번 포스트에서는 pyautogui 라이브러리의 기능 중 이미지 좌표 찾기 기능을 활용하여 카톡 메시지를 자동으로 보내주는 프로그램을 만들어 보았습니다.

 

이 프로그램은 카톡이 화면상에 표시되어 있어야만 정확히 동작한다는 아쉬움이 있습니다. 특정 프로세스를 실행시킬 수 있는 기능을 찾아 더한다면, 카톡이 실행되어 있지 않거나 최소화되어 보이지 않는 경우에도 정상적으로 동작할 수 있는 프로그램을 만들 수 있을 것 같네요.

 

지금까지 긴 글 읽어주셔서 감사합니다.

 

끝.

 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band