ABOUT ME

흥미 위주의 개발블로그 입니다.

Today
Yesterday
Total
  • 카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 3편
    python/매크로 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카톡 봇 예약 알림 기능을 구현해보았고,

     

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

     

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

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

     

    반응형

    댓글

Designed by Tistory.