python/매크로

카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 3편

airfox1 2020. 4. 27. 01:30
반응형

 

3줄 선 요약

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

2020/04/21 - [python] - 카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 1편

2020/04/24 - [python] - 카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 2편

 

1편 에서는 카톡 봇의 기능설명메시지 전송,

2편 에서는 친구 목록 or 채팅방 목록을 선택해서 입장하는 방법을 알아봤다.

 

이번 3편에서는 1~2편의 전송 기능을 활용해서 간단하게 카카오톡 알림봇을 만들어 보려 한다.

 

크롤링 + 전송 + 스케줄러

로 이루어진 주기적인 예약 알림 기능을 만들려고 하며

 

이런 식으로 쓸 수도 있다~ 라고 보여주는 것뿐이라서

자세한 설명보다는 코드 위주로 구현만 보여주려 함.

 

 

알림 내용에 쓸 크롤링 코드 ( 네이버 실검 20개)__2020-04-27 기준 실행 확인

# # 네이버 실시간 검색어 크롤링
import requests
from bs4 import BeautifulSoup

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 '
                        '(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

url = 'https://datalab.naver.com/keyword/realtimeList.naver?where=main'
res = requests.get(url, headers = headers)
soup = BeautifulSoup(res.content, 'html.parser')
data = soup.findAll('span','item_title')

a = []
for item in data:
    a.append(item.get_text())

s = "\n".join(a)
print(s)

 

 

예약실행을 위한 스케줄러 예제 코드 ( apscheduler )

from apscheduler.schedulers.background import BackgroundScheduler
import time

def job_1():
    p_time_ymd_hms = \
        f"{time.localtime().tm_year}-{time.localtime().tm_mon}-{time.localtime().tm_mday} / " \
        f"{time.localtime().tm_hour}:{time.localtime().tm_min}:{time.localtime().tm_sec}"

    print(p_time_ymd_hms)

sched = BackgroundScheduler()
sched.start()

# # 매 분 5초마다 job_1 실행
sched.add_job(job_1, 'cron', second='*/5', id="test_1")

while True:
    print("실행중.................")
    time.sleep(1)

 

 

2편 마지막에 적어둔 카카오톡 방 선택 입장 + 메시지 전송 코드

import time, win32con, win32api, win32gui

# # 카톡창 이름, (활성화 상태의 열려있는 창)
kakao_opentalk_name = '메모장'


# # 채팅방에 메시지 전송
def kakao_sendtext(chatroom_name, text):
    # # 핸들 _ 채팅방
    hwndMain = win32gui.FindWindow( None, chatroom_name)
    hwndEdit = win32gui.FindWindowEx( hwndMain, None, "RichEdit20W", None)
    # hwndListControl = win32gui.FindWindowEx( hwndMain, None, "EVA_VH_ListControl_Dblclk", None)

    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)


# # 채팅방 열기
def open_chatroom(chatroom_name):
    # # 채팅방 목록 검색하는 Edit (채팅방이 열려있지 않아도 전송 가능하기 위하여)
    hwndkakao = win32gui.FindWindow(None, "카카오톡")
    hwndkakao_edit1 = win32gui.FindWindowEx( hwndkakao, None, "EVA_ChildWindow", None)
    hwndkakao_edit2_1 = win32gui.FindWindowEx( hwndkakao_edit1, None, "EVA_Window", None)
    hwndkakao_edit2_2 = win32gui.FindWindowEx( hwndkakao_edit1, hwndkakao_edit2_1, "EVA_Window", None)
    hwndkakao_edit3 = win32gui.FindWindowEx( hwndkakao_edit2_2, None, "Edit", None)

    # # Edit에 검색 _ 입력되어있는 텍스트가 있어도 덮어쓰기됨
    win32api.SendMessage(hwndkakao_edit3, win32con.WM_SETTEXT, 0, chatroom_name)
    time.sleep(1)   # 안정성 위해 필요
    SendReturn(hwndkakao_edit3)
    time.sleep(1)


def main():
    open_chatroom(kakao_opentalk_name)  # 채팅방 열기

    text = "test"
    kakao_sendtext(kakao_opentalk_name, text)    # 메시지 전송


if __name__ == '__main__':
    main()

 

 

pc카톡 예약 알림봇 코드 (위 세 개의 코드 합친 것)

#########################################
## 카카오톡pc 1~2 편 + 크롤링 + 스케줄러 ##
#########################################

import time, win32con, win32api, win32gui
import requests
from bs4 import BeautifulSoup
from apscheduler.schedulers.background import BackgroundScheduler


# # 카톡창 이름, (활성화 상태의 열려있는 창)
kakao_opentalk_name = '메모장'


# # 채팅방에 메시지 전송
def kakao_sendtext(chatroom_name, text):
    # # 핸들 _ 채팅방
    hwndMain = win32gui.FindWindow( None, chatroom_name)
    hwndEdit = win32gui.FindWindowEx( hwndMain, None, "RichEdit20W", None)

    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)


# # 채팅방 열기
def open_chatroom(chatroom_name):
    # # # 채팅방 목록 검색하는 Edit (채팅방이 열려있지 않아도 전송 가능하기 위하여)
    hwndkakao = win32gui.FindWindow(None, "카카오톡")
    hwndkakao_edit1 = win32gui.FindWindowEx( hwndkakao, None, "EVA_ChildWindow", None)
    hwndkakao_edit2_1 = win32gui.FindWindowEx( hwndkakao_edit1, None, "EVA_Window", None)
    hwndkakao_edit2_2 = win32gui.FindWindowEx( hwndkakao_edit1, hwndkakao_edit2_1, "EVA_Window", None)
    hwndkakao_edit3 = win32gui.FindWindowEx( hwndkakao_edit2_2, None, "Edit", None)

    # # Edit에 검색 _ 입력되어있는 텍스트가 있어도 덮어쓰기됨
    win32api.SendMessage(hwndkakao_edit3, win32con.WM_SETTEXT, 0, chatroom_name)
    time.sleep(1)   # 안정성 위해 필요
    SendReturn(hwndkakao_edit3)
    time.sleep(1)


# # 네이버 실검 상위 20개, 리턴
def naver_realtimeList():
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 '
                            '(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

    url = 'https://datalab.naver.com/keyword/realtimeList.naver?where=main'
    res = requests.get(url, headers = headers)
    soup = BeautifulSoup(res.content, 'html.parser')
    data = soup.findAll('span','item_title')

    a = []
    for item in data:
        a.append(item.get_text())

    s = "\n".join(a)
    return s


# # 스케줄러 job_1
def job_1():
    p_time_ymd_hms = \
        f"{time.localtime().tm_year}-{time.localtime().tm_mon}-{time.localtime().tm_mday} / " \
        f"{time.localtime().tm_hour}:{time.localtime().tm_min}:{time.localtime().tm_sec}"

    open_chatroom(kakao_opentalk_name)  # 채팅방 열기
    realtimeList = naver_realtimeList()  # 네이버 실시간 검색어 상위 20개
    kakao_sendtext(kakao_opentalk_name, f"{p_time_ymd_hms}\n{realtimeList}")  # 메시지 전송, time/실검



def main():
    sched = BackgroundScheduler()
    sched.start()

    # # 매 분 5초마다 job_1 실행
    sched.add_job(job_1, 'cron', second='*/5', id="test_1")

    count = 0
    while True:
        print("실행중.................")
        time.sleep(1)


if __name__ == '__main__':
    main()

사용법은 

 

kakao_opentalk_name = '메모장'

여기에서 '메모장' 부분을 원하는 채팅방 이름으로 바꾸고

 

sched.add_job(job_1, 'cron'second='*/5'id="test_1")

이 부분을 원하는 시간으로 설정하면 된다. _ APScheduler 로 검색

 

그 외 여기서 예제로 쓴 네이버 실검 크롤링뿐만 아니라
다른 기능들을 넣어서 만드시면 됩니다.

 

예)

  • 특정 사이트의 새로운 게시글 알림 ( 인기글 or 공지사항 등 )
  • 시간별 날씨 알림
  • 판매 사이트 상품 재입고 알림

 

간단하게 크롤링으로 생각나는 건 이 정도인데

이 외에도 원하시는 기능들 넣으시면 됩니다.

 


3편은 pc카톡 봇 예약 알림 기능을 구현해보았고,

 

다음 편에선 채팅창 내용을 가져오는 방법과

 

가져온 내용을 활용해 키워드에 반응하여 봇의 기능을 실행하는

키워드 명령 봇에 대해 써보겠습니다.

 

반응형