자동으로 카카오톡 메시지 보내기

변현섭·2023년 8월 2일
0

파이썬 프로그래밍

목록 보기
8/10
post-thumbnail

1. 사진에서 좌표 추출하기

이전 포스팅과 마찬가지로, pyautogui, pyperclip 라이브러리를 사용할 것이고, 거기에 schedule 라이브러리만 추가하면 된다. schedule 라이브러리는 일정시간마다 함수를 동작시키기 위해 사용하는 라이브러리이다. 아래는 차례대로, 일반 > 커서 > 클릭 사진이다.

python -m pip install schedule

먼저, 카카오톡에 들어가 일반 상태의 프로필, 커서를 올렸을 때의 프로필, 클릭했을 때의 프로필 사진을 각각 캡쳐하여 저장한다. 오토마우스는 배경색이 미세하게 다른 것도 다른 이미지로 인식하기 때문에 3가지 사진이 모두 필요하다.



이제 이 사진들을 모두 작업 디렉토리 안에 넣어주면 된다.

준비를 마쳤으니 이제 코드를 작성해보자.

일반.png와 동일한 그림의 좌표를 출력하되, 동일한 그림이 없다면, 커서.png와 동일한 그림의 좌표를 출력하고, 마찬가지로 동일한 그림이 여전히 없다면 클릭.png와 동일한 그림의 좌표를 출력한다. 일반.png와 동일한 그림의 좌표를 출력할 경우, 한번에 결과를 찾지만, 클릭.png와 동일한 그림의 좌표를 출력할 경우 세번만에 결과를 찾는다.

2. 자동으로 메시지 보내기

이제 자기 자신에게 자동으로 카카오톡 메시지를 보내는 코드를 작성해보자.

이전 포스팅에서는 절대좌표를 기준으로 오토마우스가 동작했기 때문에 항상 같은 곳에 검색창이나 주소창이 위치했어야 했다. 하지만, 이제는 사진으로 좌표를 찾기 때문에 카카오톡 창이 어디에 띄워져 있건 항상 동작한다.

대신 좌표를 찾는 과정이 추가되었다보니, 작업 속도가 이전보다는 느리다.

3. 일정 시간마다 자동으로 메시지 보내기

이전 포스팅에서 다룬 쓰레드를 활용하면, 일정 시간마다 자동으로 메시지를 보낼 수 있다.

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방식으로 동작하기 때문에, 코드가 실행 중일 경우 어떤 다른 명령도 수행할 수 없게 된다. 그러므로 상황에 맞게 코드를 작성할 수 있어야한다.

4. 특정 시간에 맞추어 자동으로 메시지 보내기

아래의 코드는 매주 수요일 12시 17분에 자동으로 메시지를 전송하는 코드이다.

위 코드도 거의 비슷하기는 하지만, 몇가지 다른 부분이 있다.

① threading.Timer() 대신 schedule.every() 사용

  • threading.Timer()와 schedule.every()의 비교는 마치 위에서 threading.Timer와 while문을 비교한 것과 비슷하다.
  • schedule 라이브러리는 쓰레드를 관리할 필요가 없어 간단하지만, 대신 blocking 방식으로 동작하기 때문에 병렬적으로 작업을 처리할 수 없다.
  • 참고로, schedule 라이브러리는 내부적으로 (싱글)쓰레드를 사용하기 때문에 별도의 쓰레드를 할당하지 않는다.

② while True

  • 무한루프를 돌면서 1초마다 스케줄된 작업을 확인한다.
  • 쓰레드를 관리하지 않으면서 주기적인 작업을 스케줄링할 수 있지만, CPU 리소스를 지속적으로 사용하는 비효율적인 코드이다.

즉, 쓰레드를 사용하는 방법이 복잡하긴 해도, 여러모로 효율적이다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글