Attention please

pyautogui로 카카오톡 예약 메세지 보내기 본문

프로젝트

pyautogui로 카카오톡 예약 메세지 보내기

Seongmin.C 2023. 8. 14. 23:42

이번에 진행한 프로젝트는 python 패키지 중 매크로를 제작할 때 유용한 pyautogui를 사용하여 간단한 카카오톡 예약 메세지 기능을 구현해보았습니다. 사실 카카오톡 자체에는 예약 메세지 기능이 존재합니다.

 

 

해당 기능은 1:1 톡방이나 단톡방에서는 사용이 가능하나 오픈채팅방에서는 예약 메세지 기능이 존재하지 않습니다. 물론 오픈채팅방에 예약 메세지를 보낼 일이 별로 없어서 불편함을 느끼진 않았지만 이번에 학교에서 진행하는 데이터 청년 캠퍼스 에서 조교를 맡다보니 출석 메세지를 10시, 10시30분, 1시30분, 2시에 보내야하는 문제가 생겼습니다. 물론 수동으로 메세지를 보내도 되긴 하지만......요즘 방학 시즌이다보니 밤낮이 바뀌는 바람에 오전에 일어나기가 너무 힘들더라구요..ㅠ

 

그래서 이번 기회에 pyautogui 를 사용하여 해당 시간에 메세지를 보내는 매크로를 만들어보려고 합니다. 카카오톡에서 api를 제공해준다면 해당 작업이 훨씬 정교하고 편하게 제작할 수 있겠지만 저는 찾지 못했습니다. 그래서 좌표를 미리 정해둔 후에 반복작업을 하도록 제작을 해보았습니다. 

 

우선 카카오톡 어플의 위치 좌표를 구해야겠죠. pyautogui의 position 메소드를 사용하면 마우스 포인트의 좌표를 쉽게 구할 수 있습니다.

 

import pyautogui

x, y = pyautogui.position()
print(f"X: {x}, Y: {y}")

 

이를 사용하여 카카오톡 어플의 좌표가 (465, 1046) 임을 구할 수 있었습니다.

 

 

저는 총 2개의 채팅방에서 메세지를 보내야합니다. 그렇다면 저 카카오톡을 킨 후에 해당 카톡방을 여는 작업도 해야겠죠. 카카오톡 api가 존재했다면 훨씬 수월하게 할 수 있었지만 구하지 못했기 때문에 원시적인 방법으로 진행하였습니다.

 

 

우선 미리 메세지를 보내야하는 톡방 2개를 열어놓은 후에 각 대화방을 클릭할 수 있도록 좌표 2개를 추가로 구해줍니다. 대화방을 클릭하면 채팅방이 화면에 나타날 겁니다. 그 두개의 채팅방을 왼쪽 상단에 올려놓은 후에 채팅을 칠 수 있도록 채팅 창의 좌표를 구해주었습니다.

 

 

위 사진의 빨간색 체크 위치의 좌표를 구하는 것이죠. 저 부분을 클릭한 후 메세지를 입력하는 식으로 진행할 겁니다. 이제 좌표를 모두 구했으니 pyautogui 모듈을 사용하여 메세지 내용은 input으로 받았을 때 메세지를 보내는 함수를 짜보도록 하죠.

 

def send_message(msg):

    room_list = [[471, 919], [607, 919]]

    for room in room_list:
        # 카카오톡 클릭
        x, y = 465, 1046
        pyautogui.click(x, y) 
        time.sleep(2)

        # 대화창 클릭
        pyautogui.click(*room)
        print("Room Opened")

        # 메세지 입력
        time.sleep(2)

        if room == [471, 919]:
            x2, y2 = 58, 445
        else:
            x2, y2 = 557, 445

        pyautogui.moveTo(x2, y2, 1)
        pyautogui.click()
        pyperclip.copy(msg)
        pyautogui.hotkey('ctrl', 'v')
        pyautogui.press('enter') 
        print(f"Message '{msg}' sent to room at {room}")
        time.sleep(2)

 

중간 중간에 time.sleep 으로 움직임을 제어한 이유는 바로 클릭을 하게 될 경우 카카오톡 대화방이 켜지지도 않았는데 클릭을 먼저 해버리는 문제가 발생했기 때문입니다. 일단은 시간 예약 없이 위 코드가 잘 작동하는지 확인을 해보도록 합시다. 테스트를 위해 2개의 오픈채팅방을 개설한 후 실험을 진행해보았습니다. 

 

 

정상적으로 작동하는 것을 확인하였으니 정해진 시간에 작동될 수 있도록 schedule 모듈을 추가하여 작동시켰습니다.

 

schedule.every().day.at("10:00").do(lambda: send_message("10:00 ~ 10:30 사이에 오전 출석 해주시기 바랍니다."))

schedule.every().day.at("10:30").do(lambda: send_message("오전 출석 마감하겠습니다."))

schedule.every().day.at("13:30").do(lambda: send_message("13:30 ~ 14:00 사이에 오후 출석 해주시기 바랍니다."))

schedule.every().day.at("14:00").do(lambda: send_message("오후 출석 마감하겠습니다."))

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

 

Comments