카카오톡 봇 만들기 ( python, pc 카톡, 비활성 ) - 3편
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카톡 봇 예약 알림 기능을 구현해보았고,
다음 편에선 채팅창 내용을 가져오는 방법과
가져온 내용을 활용해 키워드에 반응하여 봇의 기능을 실행하는
키워드 명령 봇에 대해 써보겠습니다.