Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

이열매의 메모장

[토이 프로젝트] 단톡방에 메세지 전송하기 본문

혼자놀기

[토이 프로젝트] 단톡방에 메세지 전송하기

이열매 2020. 1. 13. 23:06

전체 코드: Github

 

개요


2017년부터 진행해오던 코딩야학이 7기를 마지막으로 휴식 기간을 갖는다는 말에 덜컥 프로젝트 트랙을 신청했다. 마침 주말 알바 출근 시마다 단톡방에 출근 카톡을 전송해야 했는데, 이를 자동화하는 프로젝트를 진행하게 되었다.

 

간략히 하자면 하기와 같이 작동한다.

 

  1. 출근 장소에 도착하여 노트북을 세팅한다.
  2. 쉘 스크립트 / 윈도우 배치파일
    1. 아나콘다 가상환경을 실행한다.
    2. 가상환경에서 파이썬 파일을 읽는다.
  3. 파이썬 파일
    1. 카카오톡 실행
    2. 카카오톡 채팅 카테고리 클릭
    3. 상단 첫번째 카톡방 진입
    4. 지정된 메세지 발송

고려한 부분은 다음과 같다.

 

1. 단톡방이다

현재 카카오톡 openAPI는 접속된 계정의 친구 목록을 호출해 프로필 정보 | 나에게 보내기 | 메시지 전송 기능을 지원한다. openAPI를 사용하면 callBack함수나 handler 등을 활용한 상황 처리가 가능하니 목적에 맞을 경우 강력히 추천한다. (카카오톡 openAPI 사용)

 

그러나 openAPI는 일대일 채팅 기능을 지원하여 단톡방의 경우 사용할 수 없었다. 머리가 나쁘면 하드코딩이라도 해야 하는 법. PyAutoGUI를 사용하여 단톡방에 들어가 메세지 전송을 시도하는 단순 방식으로 접근하였다. 이는 마우스나 키보드 인터럽트에 대해 고려해야 한다. 그러나 나의 경우엔 프로그램 실행 후, 바로 자리를 비우므로 인터럽트에 대한 고려는 하지 않았다.

 

2. 출근 후, 컴퓨터를 시작할 때 메세지 전송이 이뤄져야 한다

휴가나 지각일 경우를 대비해 메세지 전송이 "출근했을 경우" 이뤄지길 바랐다. 출근 여부나 출근 시간에 관계없이 8시 정각에 카톡을 하는 챗봇이나 cronjob은 의미가 없었다. 최대한 수동 작업을 간단히 하기 위해서 맥 OS의 경우 스크립트를, 윈도우의 경우 배치파일을 만들었다.

 

3. 윈도우와 맥 OS 모두 지원해야 한다

맥북과 그램을 번갈아가며 사용하기 때문에 윈도우와 맥 OS 모두를 지원해야 했다. 이를 위해서는 파일 경로, 커맨드 키, 화면 GUI 변경을 고려해야 한다.

파일 경로나 커맨드 키는 당연한 것이겠지만 화면 GUI를 언급한 이유는 openCV 라이브러리를 사용했기 때문이다. openCV 활용 시, 카카오톡의 채팅방 검색 버튼과 맥의 기본바에 있는 spotlight 버튼을 동일하게 인식했다. 관심영역 제한 또한 고려했지만, 카카오톡 채팅방의 위치로 진입하는 것이 더 직관적이라 판단했다.

 

 

 

기본 환경 구성


Anaconda

다음 링크에서 OS에 맞게 설치가 가능하다. 아나콘다 가상환경을 설정하고 pyCharm CE에 적용해 환경을 구성하였다. PyCharm에 아나콘다 가상환경 적용은 여기에서 확인하자.

 

openCV

채팅방 카테고리 아이콘을 클릭하기 위해서 좌표를 가져올 때 사용된다.

 

PyAutoGUI

좌표에 따라 자동 마우스와 키보드를 컨트롤한다.

 

  • 가상환경에서 모듈 설치
pip install pyautogui, opencv-python

 

 

실행 파일


  • OS 체크
# Config changed by OS
cmd_key = 'ctrl'
home_key = ('home')
is_retina = False

if platform.system() == "Darwin":
    is_retina = subprocess.call("system_profiler SPDisplaysDataType | grep 'retina'", shell=True)
    cmd_key = 'command'
    home_key = ('option', 'up')

맥 OS의 경우 command, 윈도우의 경우 control키를 사용한다. 또한 retina 디스플레이 사용자의 경우, openCV 이미지 클릭에 대해 좌표에 대한 후처리를 위해 별도로 체크해준다. (관련 이슈는 여기로)

 

 

  • 카카오톡 실행
def run_kakao():
    kakao_path = get_kakao_cmd()
    print(f'Run KakaoTalk : {kakao_path}')
    try:
        subprocess.run(kakao_path)
    except Exception:
        print('[ERROR] Execute Kakaotalk')
        raise

 

 

  • 카카오톡 채팅 카테고리에서 n번째 방 진입
def enter_chatroom(chat_idx):
    chat_imgs = ['chat.png', 'chat_with_msg.png']
    for chat_png in chat_imgs:
        try:
            click_img(chat_png)
        except TypeError:
            print(f'Not match with image: {chat_png}')
            pass
        except Exception:
            print(f'[ERROR] Click image: {chat_png}')
            raise
    # Focus on 1st chatroom
    pyautogui.hotkey(*home_key)
    print(f"Enter the {chat_idx}th chatroom")
    for _ in range(1, chat_idx):
        pyautogui.press('down')
    pyautogui.press('enter')

여기서 chat_imgs는 다음과 같은 채팅방 카테고리 아이콘을 의미한다. 기본 상태일 경우 chat.png로, 확인하지 못한 메세지가 있을 경우 chat_with_msg.png 파일로 지정했다.

 

맥OS가 아니거나, ROI 처리를 생각한다면 다음과 같은 코드도 가능하다.

def enter_chatroom(chat_name):
    enter_chat_category()
    click_img('search_bar.png')
    pyperclip.copy(chat_name)
    pyautogui.hotkey(cmd_key, 'v')
    pyautogui.press('enter')

사실 돌이켜보니 이 부분이 호환성 면에서 좀 더 우세한데, 카카오톡 PC는 채팅방 고정 데이터는 디바이스 별로 다르게 관리되지만 채팅방 이름은 카카오톡 DB에서 제공되어 모든 디바이스에서 동일하게 표시되기 때문이다.

 

 

  • 메세지 전송
# TODO: Return response to sending msg (Need Cursor check)
def send_msg(msg, cmd):
    pyperclip.copy(msg)
    pyautogui.hotkey(cmd, 'v')
    pyautogui.press('enter')

메세지는 단순히 복사 붙여넣기 방식이다. 우선은 메세지 전송 후, 카카오톡 채팅방을 닫지 않음으로써 메세지 처리 확인하도록 진행했지만, 옳지 못하다고 생각한다. 역시 openAPI를 쓰지 못할 때부터 그만둬야 했다.

 

나머지 코드는 github에서 확인하자.

 

 

마치며


사용성을 고려했을 때, 핸드폰 화면 위젯 터치 시 메세지 전송이 베스트였을 것이다. 그러나 빠른 개발이 목적이었기 때문에 파이썬으로 간단히 작성을 시도했다. 다음 기회엔 Kotlin 공부 겸 안드로이드나 React를 고려해야겠다.

 

카카오 API를 사용하지 못하니, handler 처리가 아쉽다. 메세지 채팅 창에 커서 확인 후 전송과 같이 보강이 필요할 것 같다.

 

위에서도 언급했듯이, 맥 OS의 검색 버튼 UI 탓에 채팅방 검색으로 확인 및 진입하지 못했던 것 또한 아쉬운 점이다. 디바이스 변경 시 채팅방 고정 순서를 맞춰줘야 하는 단점이 있다.

 

그래도 며칠 간 모각코에서 재밌었다. 코딩야학 화이팅!

 

 


References

 

 

'혼자놀기' 카테고리의 다른 글

PyCharm에 아나콘다 가상환경 설정  (0) 2020.01.05
Comments