ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 1편
    python/매크로 2020. 4. 21. 08:03
    반응형

     

    3줄 선 요약

    • 플러스친구 아님
    • 모바일 어플을 활용한 방법 아님
    • pc카톡, python 으로 pc 환경에서 봇을 제작함

     

     

    서론

    카카오톡 오픈 톡방에 봇이 있으면 좋을 것 같아서 만들려고 보니

    카톡 api로는 자신에게 보내기 밖에 안됨

    이경우 알람도 안 뜨고, 단톡과 오픈톡에 초대는 당연히 안됩니다.

     

    검색을 하면 플러스친구 (플친) 만드는 법이 뜬다던가

    스마트폰 어플로 만드는 자동응답 설정법이 주로 뜸

    텔레그램 같은건 api로 간단하게 몇 줄이면 가능하지만

    대부분 메신저는 카톡을 사용하기 때문에

    기존에 몇 없는 자료들을 정리할 겸, 공유하는 글을 작성합니다.

     

     

    환경

    • 윈도우10
    • 카카오톡 pc버전 ( MS store 카톡 X )
    • python ( pycharm )

     

     

    카카오톡 봇

    • 기본 기능 + 추가 기능으로 구성
    • 기본 기능
      1. 채팅방에 메시지 전송
      2. 특정 방 선택 입장
    • 추가 기능
      1. 주기적인 알람 (시간별 날씨, 특정 사이트의 새로운 게시글 등)
      2. 채팅 인식 (유저 입장 시 인사말 + 공지사항 알림, 명령어로 봇 컨트롤 등)
    • 추가 기능에 들어갈 수 있는 것들
      1. python으로 가능한 것 ( 이 글에선 출력을 문자로 한정한다 )
      2. 대표적으로 웹 크롤링

     

     

    ※주의사항

    카카오톡 정지 (밴) 에는 크게 두 가지가 있다

    1.  신고에 의한 정지
    2.  비정상적 패턴 감지에 의한 정지

    카톡 봇 사용 시 두 가지 모두 조심해야 하나
    특히 2번 패턴 정지를 조심해야 한다.

    패턴 정지는 자동으로 탐지해서 잡는 거라, 문의를 해도 상담사가 할 수 있는 게 없다. 그냥 기다리라고만 함

     

    연속적으로 다량의 채팅을 전송하거나

    같은 채팅 내용을 다수에게 한 번에 보내는 행위 등이 해당됨

     

     

    채팅방에 메시지 전송

    import time, win32con, win32api, win32gui
    
    # # 카톡창 이름 (열려있는 상태, 최소화 X, 창뒤에 숨어있는 비활성화 상태 가능)
    kakao_opentalk_name = '메모장'
    
    def kakao_sendtext(text):
        win32api.SendMessage(hwndEdit, win32con.WM_SETTEXT, 0, text)
        SendReturn(hwndEdit)
    
    # # 엔터
    def SendReturn(hwnd):
        win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
        time.sleep(0.01)
        win32api.PostMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
    
    # # 핸들
    hwndMain = win32gui.FindWindow( None, kakao_opentalk_name)
    hwndEdit = win32gui.FindWindowEx( hwndMain, None, "RichEdit20W", None)
    hwndListControl = win32gui.FindWindowEx( hwndMain, None, "EVA_VH_ListControl_Dblclk", None)
    
    # # 채팅 전송
    text = "SETTEXT_test"
    kakao_sendtext(text)

    위 소스의 동작부터 설명하면

    열려있는 '메모장' 이라는 이름의 채팅방에 채팅을 쓰고전송한다.

    '메모장' 부분에 각자 본인이 원하는 채팅방 이름을 덮어쓰시면 됩니다.

     

    우리가 하려고 하는 건 채팅방의 'RichEdit20W' 라는 텍스트 박스에

    원하는 메시지를 입력하고, 엔터 (전송)을 하려고 함

     

    그래서 'RichEdit20W' 의 핸들을 가져오기 위해 사용한 게

    FindWindow / FindWindowEx

     

    spy++ 로 어떻게 생겼나 확인해봄

     

    핸들 부분 설명

    hwndMain = win32gui.FindWindow( None, '메모장')

    --> FindWindow를 이용해 캡션(이름)이 '메모장' 이라는 창을 찾아서 핸들을 hwndMain 에 저장

     

    hwndEdit = win32gui.FindWindowEx( hwndMain, None, "RichEdit20W", None)

    --> FindWindowEx를 이용해 hwndMain(메모장) 의 자식인 RichEdit20W(텍스트박스) 의 핸들을 hwndEdit 에 저장

     

    hwndListControl = win32gui.FindWindowEx( hwndMain, None, "EVA_VH_ListControl_Dblclk", None)

    --> 이건 글이 올라오는 대화창의 핸들을 가져온 건데, 나중에 채팅내용 인식 (명령어) 할 때 쓸 거예요

     

     


    간단하게 채팅방 구조를 확인했고, 채팅 전송 기능을 만들어봤습니다.

     

    다음 글에선 열려있는 채팅방이 아닌, 유저 목록 또는 채팅방 목록에서

    원하는 채팅방을 선택해서 열고, 메시지를 보내는 방법을 알아보겠습니다.

     

     

    반응형

    댓글

Designed by Tistory.