오토핫키 카카오톡 API - otohaski kakaotog API

Chapter.20 오토핫키로 알람 받기 입니다. 지난 챕터에서 팀뷰어를 활용해서 컴퓨터를 원격 조정하는 방법에 대해 포스팅을 했었는데요, 오늘은 알람받기 입니다. 던전을 100번 돌게끔 시켜놓고 다른 작업을 하고있는데 핸드폰에서 매크로가 종료되었다고 알람이 옵니다. 그럼 팀뷰어를 활용해 다시 100번 돌라고 작업을 시켜놉니다. 너무편하겠죠? 

방법은 여러가지가 있습니다. 핸드폰으로 문자를 전송 시킨다거나 메일을 보낸다거나. 요즘 메일 어플들은 메일이 도착하면 실시간으로 알려주죠. 문자의 경우 전송당 비용이 발생합니다. 메일 전송은 메일을 보내고 어플을 깔고 귀찮죠 거기다가 메일 사이트에 접속해서 로그인도 해야하고 전송도 해야하고 스크립트가 너무 길어집니다.

그래서 쉬운 방법을 알려드립니다. 카카오톡을 활용하는 방법인데요. pc용 카카오톡은 모두 사용해 보셨을 겁니다. pc에서 카카오 톡이 로그인되면 핸드폰으로 알람이 오는걸 아시나요? 우리는 그걸 활용 할겁니다.  

시작하기에 앞어 오늘 할 스크립트의 활용 이미지입니다.

카카오톡을 로그아웃 해주시면 위사진처럼 로그인 화면이 나오죠? 거기에 패스워드 입력 + 엔터키로 접속을 합니다. 

그럼 이런식으로 접속이 되고 내 핸드폰으로는 알람이 오죠.

매크로를 켜놓고 다른일을 하다가 pc 버전 로그인 알람이 옵니다. 그럼 내 매크로가 작업을 마췄구나 하는거죠. 

그럼 스크립트를 보여드리겠습니다.

gui,show,w300 h350 center,chapter18

gui,Add,Button,x0 y300 w150 h50 gStart, Start

gui,Add,Button,x150 y300 w150 h50 gStop, Stop

return

#이게 gui창인건 이제 모두 아실겁니다.

Start:

PostMessage,0x100,65,1966081,Edit2,카카오톡

#0x100 은 키보드를 눌러라, 65는 'a'키의 param, 1966081은 'a'키의 laram 입니다.

#postmessage에 대해 설명을 조금 더 해드릴게요. 

postmessage의 사용법은, postmessage,wparam,lparam,입력창의 이름,프로그램의 타이틀

입니다. 우리는 쓸때, PostMessage,0x201,1,마우스좌표,,녹스플레이어 이런식으로 사용했었죠

좌표값과 녹스플레이어 사이에 ,, 이있는데 이값은 생략해도되고 안해도되고 이런식입니다.

그런데 카카오톡의 경우 ,,값을 넣어주어야 됩니다. postmassage에가 키보드를 입력하라고 하는데, 그게 아이디 창에 넣으라는건지, 비밀번호창에 넣으라는건지 명시 해주어야 하기 때문이죠. 그래서 Edit2라고 넣어 주었습니다. 이 이름은 Active Window Info (Window Spy) 통해서 얻을 수 있습니다.

오토핫키 카카오톡 API - otohaski kakaotog API

보시면 ClassNN: Edit2 가 보이시죠 이게 이 창의 이름입니다.

PostMessage,0x100,66,3145729,Edit2,카카오톡

#66은 'b'의 wparame, 3145729는 lparam 입니다. 

PostMessage,0x100,67,3014657,Edit2,카카오톡

#67은 'c'의 wparame, 3014657는 lparam 입니다. 

Sleep,1000

#1초정도 쉬어주어야 접속이 잘되더군요 입력속도가 너무빨라서 안되는 경향이있습니다.

PostMessage,0x100,13,1835009,Edit2,카카오톡

#이건 엔터키 입니다.

sleep,1000

return

Stop:

ExitApp

return

그런데, wparam 과 lparam의 값을 다 외우고 있을 수가 없습니다. 컴퓨터의 모든 명령을 나눠둔 거기 때문이죠, 그래서 프로그램으로 하나로 쉽게 구하실 수 있어요.

이프로그램을 사용하시면 모든 키의 값을 쉽게 얻을 수 있습니다.

짧은 스크립트지만 올려드릴게요. 

비밀번호는 모두 다릅니다. 직접 구해서 넣어주셔야해요. 

이제 이 스크립트를 지난 시간 만들었던 챕터에 대입시키면 행동이 종료될때 카카오톡에 로그인해서 알려주게 되는 겁니다. 

대부분 다 알고 계시겠지만..

요즘 매크로 이용해서 pc에서 매크로 돌리시죠..

근데 매크로가 정상으로 잘 동작하는지.. 확인하는게 좀 번거럽습니다.

원격제어 프로그램로 매크로 꼬였는지 안 꼬였는지 확인하기도 힘들구요..

간단한 명령어 한 줄만 추가하면... 알림을 받을수 있어서 공유합니다..

ControlSend,,물약 오링나서 귀환{enter},카톡방이름;카톡으로  전송

준비 조건..

1. pc카톡을 설치한다.

2. 카톡방이름 <- 동일한 방이름으로 대화방을 개설한다.

3. 방을 열어둔 상태를 유지한다.

위 명령어를 원하는 이벤트에 맞게 넣어준다.

ex) 만약 자신에게 보내기를 한다고 가정  카톡 이름이 "홍길동" 이면

내이름 홍길동 카톡방을 열어두면 됩니다.

  -> ControlSend,,물약 오링나서 귀환{enter},홍길동 ;카톡으로  전송

이라고 하면, 나 "홍길동"한테 전송이 됩니다.

저는 카톡을 새로 파서, 저랑 친추를 한 후,

"리니지알림"  방을 개설해서, 카톡을 받고있어요. 그래야 다른사람이 보낸거리 인식해서,

진동이 울리더라구요.

제가 설정한 이벤트는

무개 82프로 넘었을때

마을 갔을때

상점 이용할때

사냥터 복귀할때

맞았을때

게임 팅겼을때

하고 있어요..

이밖에..뭐든지 가능하죠...

카톡 api 이용해서 사진 파일 등등 보내는 그런 베스트팁도 있는데 너무 어렵네요 ㅠ

이상입니다 ㅎㅎ

마카롱님의 알람설정중에 api 방식이 아닌 카톡 창에 설정한 명령어가 존재하면 통계를 보내고 싶습니다

카카오톡 대화창에 메세지 보내는건 할수있겠는데

대화창의 내용을 불러오는 방법을 모르겠습니다;; 

 ControlGetText, WinGetText 두가지 전부 실험해봤지만

대화창내용이 아닌 입력하는 창의 내용만 가져오더군요 ㅠㅠ

해결방법좀 알려주시면 감사하겠습니다

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

오토핫키 카카오톡 API - otohaski kakaotog API
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)

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


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

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

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