이전 포스팅과 마찬가지로, pyautogui, pyperclip 라이브러리를 사용할 것이고, 거기에 schedule 라이브러리만 추가하면 된다. schedule 라이브러리는 일정시간마다 함수를 동작시키기 위해 사용하는 라이브러리이다. 아래는 차례대로, 일반 > 커서 > 클릭 사진이다.
python -m pip install schedule
먼저, 카카오톡에 들어가 일반 상태의 프로필, 커서를 올렸을 때의 프로필, 클릭했을 때의 프로필 사진을 각각 캡쳐하여 저장한다. 오토마우스는 배경색이 미세하게 다른 것도 다른 이미지로 인식하기 때문에 3가지 사진이 모두 필요하다.
이제 이 사진들을 모두 작업 디렉토리 안에 넣어주면 된다.
준비를 마쳤으니 이제 코드를 작성해보자.
일반.png와 동일한 그림의 좌표를 출력하되, 동일한 그림이 없다면, 커서.png와 동일한 그림의 좌표를 출력하고, 마찬가지로 동일한 그림이 여전히 없다면 클릭.png와 동일한 그림의 좌표를 출력한다. 일반.png와 동일한 그림의 좌표를 출력할 경우, 한번에 결과를 찾지만, 클릭.png와 동일한 그림의 좌표를 출력할 경우 세번만에 결과를 찾는다.
이제 자기 자신에게 자동으로 카카오톡 메시지를 보내는 코드를 작성해보자.
이전 포스팅에서는 절대좌표를 기준으로 오토마우스가 동작했기 때문에 항상 같은 곳에 검색창이나 주소창이 위치했어야 했다. 하지만, 이제는 사진으로 좌표를 찾기 때문에 카카오톡 창이 어디에 띄워져 있건 항상 동작한다.
대신 좌표를 찾는 과정이 추가되었다보니, 작업 속도가 이전보다는 느리다.
이전 포스팅에서 다룬 쓰레드를 활용하면, 일정 시간마다 자동으로 메시지를 보낼 수 있다.
threading.Timer()는 아래의 기능을 수행할 수 있다.
여기서는 당연히 주기적인 실행을 위해 사용되었다. 물론, 쓰레드를 활용하는 대신, 단순히 while문을 무한 루프로 만들고 sleep(10)을 걸어도 된다. 그러면 코드는 아래와 같이 작성될 것이다.
import pyautogui
import pyperclip
import time
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
def send_message():
while True:
picture_pos = pyautogui.locateOnScreen("일반.png")
print(picture_pos)
if picture_pos is None:
picture_pos = pyautogui.locateOnScreen("커서.png")
print(picture_pos)
if picture_pos is None:
picture_pos = pyautogui.locateOnScreen("클릭.png")
print(picture_pos)
click_pos = pyautogui.center(picture_pos)
pyautogui.doubleClick(click_pos)
pyperclip.copy("자동으로 메시지 보내기")
pyautogui.hotkey("ctrl", "v")
time.sleep(1)
pyautogui.write(["enter"])
time.sleep(1)
pyautogui.write(["escape"])
time.sleep(1)
time.sleep(10) # 10초 대기
send_message()
굳이 차이를 따지자면, 쓰레드를 활용한 방식은 재귀 호출이고, while문을 활용한 방식은 반복문이다. while문을 사용한 방식이 조금 더 간단한 코드인 것은 사실이지만, 대신 while문은 block방식으로 동작하기 때문에, 코드가 실행 중일 경우 어떤 다른 명령도 수행할 수 없게 된다. 그러므로 상황에 맞게 코드를 작성할 수 있어야한다.
아래의 코드는 매주 수요일 12시 17분에 자동으로 메시지를 전송하는 코드이다.
위 코드도 거의 비슷하기는 하지만, 몇가지 다른 부분이 있다.
① threading.Timer() 대신 schedule.every() 사용
② while True
즉, 쓰레드를 사용하는 방법이 복잡하긴 해도, 여러모로 효율적이다.