본문 바로가기
Python

[Python] 파이썬 새 메일이 오면 카카오톡으로 나에게 메세지 보내기

by JM0121 2021. 7. 26.

https://vnfmadl234.tistory.com/20

 

[Python] 파이썬 웹 크롤링2 - 셀레니움으로 다음 메일 제목 크롤링 하기

지난 번에 셀레니움과 크롬드라이버로 웹을 띄우기까지 했는데, 오늘은 다음 메일에 접속하여 자동으로 로그인 후 메일 제목을 크롤링 해올 것 이다. from selenium import webdriver driver = webdriver.Chrome(

vnfmadl234.tistory.com

지난 글을 통해 다음 메일 제목을 크롤링하는 법을 익혔다.

이 개발의 목적은 다수의 메일들을 한번에 확인하기 위해 다음 외에도 네이버나 구글, 아웃룩 등을 

추가하려 했지만 자동화 프로그램을 막는 장치들이 존재해 우회하면서 진행하기 어려움이 있었다.

그래도 네이버는 보다 쉽게 캡차를 위회할 수 있기에 구글링과 다른 블로그들을 열심히 찾아보면서

네이버 크롤링까지 성공했다. 네이버 크롤링은 다른 곳에 좋은 자료가 많으니 여기서는 생략할 것이다.

 


 

카카오톡 나에게 메세지 보내기

https://developers.kakao.com/

 

카카오 개발자 홈페이지에서 카카오톡 API를 이용하면 쉽게 카카오톡에서 제공하는 여러 가지 기능들을 구현할 수있다.

 

먼저 사이트에 접속한 후 자신의 카카오 계정으로 로그인한다.

 

이후 내 애플리케이션에 들어가 애플리케이션을 추가를 해준다.

(사진은 딱히 필요없음)

 

자신이 만든 앱을 눌러보면 관련 설정들이 나오는데, 여기서 카카오로그인-동의항목에 들어가

프로필 정보와 카카오톡 메세지 전송을 동의로 설정해야 한다.

 

설정이 끝났으면 도구탭에서  REST API테스트 부분을 클릭한다.

 

메세지-나에게 기본 템플릿으로 메세지 보내기로 들어와 빨간 동그라미가 쳐진 부분을 클릭해 반드시 자신이 만든 앱으로 변경해주어야 한다.

 

토큰 발급 버튼을 눌러 선택 동의를 전부 체크하면 해당 토큰이 정상적으로 발급 된다.

 

# 카카오톡 메세지 보내기
Kakao_Token = ""     # 발급한 토큰 입력


def Kakao(text):
    header = {"Authorization": 'Bearer ' + Kakao_Token}
    url = "https://kapi.kakao.com//v2/api/talk/memo/default/send"
    post = {
        "object_type": "text",
        "text": text,
        "link": {
            "web_url": "https://developers.kakao.com",
            "mobile_web_url": "https://developers.kakao.com"
        },
        "button_title": "바로 확인"
    }
    data = {"template_object": json.dumps(post)}
    return requests.post(url, headers=header, data=data)

Sample 코드에 약간 수정을 하여 함수의 인자(메일 제목)를 text로 받았고, 이 파라미터를 카카오톡 메세지 내용으로 출력해준다.

 

 

더 자세한 사용법은 아래 사이트 참고

https://developers.kakao.com/docs/latest/ko/message/rest-api 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

새 메일이오면 카카오톡으로 메세지 보내기

 

이제 종합적으로 코드를 완성시켜보면

from typing import Text
from selenium import webdriver
import pymysql
import json
import requests
from selenium.webdriver.common.keys import Keys
import pyperclip
import time

db = pymysql.connect(
    user='root',
    passwd='',
    host='localhost',
    db='mailb',
    charset='utf8'
)

# 카카오톡 메세지 보내기
Kakao_Token = ""


def Kakao(text):
    header = {"Authorization": 'Bearer ' + Kakao_Token}
    url = "https://kapi.kakao.com//v2/api/talk/memo/default/send"
    post = {
        "object_type": "text",
        "text": text,
        "link": {
            "web_url": "https://developers.kakao.com",
            "mobile_web_url": "https://developers.kakao.com"
        },
    }
    data = {"template_object": json.dumps(post)}
    return requests.post(url, headers=header, data=data)

# 다음 메일


def Daum():
    options = webdriver.ChromeOptions()
    options.add_argument("headless")
    driver = webdriver.Chrome(
        '/chromedriver.exe',  options=options)
    driver.implicitly_wait(2)
    driver.get(
        'https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fmail.daum.net%2F')
    driver.implicitly_wait(3)

    my_id = ""
    my_pwd = ""

    driver.find_element_by_name('id').send_keys(my_id)
    driver.find_element_by_name('pw').send_keys(my_pwd)

    driver.find_element_by_xpath('//*[@id="loginBtn"]').click()

    # 메일 제목 추출
    title = driver.find_element_by_css_selector('strong.tit_subject')
    # 메일 날짜 추출
    date = driver.find_element_by_class_name('txt_date')

    curs = db.cursor(pymysql.cursors.DictCursor)

    curs.execute('SELECT * FROM dates;')  # Select 데이터 조회
    date_db = curs.fetchone()

    if(date_db['date'] != date.text):
        Kakao("새 메일: "+title.text)
        sql = "update dates set date = %s"  # 데이터 수정
        val = (date.text)
        curs.execute(sql, val)
        db.commit()

    driver.quit()


# 네이버 메일
def Naver():
    driver = webdriver.Chrome('/chromedriver.exe')
    driver.get(
        'https://nid.naver.com/nidlogin.login?url=http%3A%2F%2Fmail.naver.com%2F')

    # 아이디 입력폼
    tag_id = driver.find_element_by_name('id')
    # 패스워드 입력폼
    tag_pw = driver.find_element_by_name('pw')

    my_id = ''
    my_pwd = ''

    tag_id.click()
    pyperclip.copy(my_id)
    tag_id.send_keys(Keys.CONTROL, 'v')  # 복사 후 붙혀넣기

    tag_pw.click()
    pyperclip.copy(my_pwd)
    tag_pw.send_keys(Keys.CONTROL, 'v')

    # 로그인 버튼 클릭
    driver.find_element_by_id('log.login').click()
    time.sleep(3)

    # 메일 제목
    title = driver.find_element_by_css_selector("strong.mail_title")
    date = driver.find_element_by_class_name("iDate")
    curs = db.cursor(pymysql.cursors.DictCursor)

    curs.execute('SELECT * FROM num;')  # Select 데이터 조회
    num_db = curs.fetchone()

    if(num_db['mailsn'] != date.text):
        Kakao("새 메일: "+title.text)
        sql = "update num set mailsn = %s"  # 데이터 수정
        val = (date.text)
        curs.execute(sql, val)
        db.commit()

    driver.quit()


if __name__ == "__main__":
    while(1):
        print("다음 메일 시작")
        Daum()
        print("네이버 메일 시작")
        Naver()
        time.sleep(60)

 

일단 저 코드를 사용하기 앞서, 네이버 같은 경우 새로운 기기 로그인 알림이 메일로 오기 떄문에 새로운 기기 로그인 알림을 해제를 해야 정상적으로 작동해야한다.

새 메일인지 구별을 해주기 위해 Mysql DB를 사용해 메일이 도착한 시간을 DB에 저장해주었고

 

새 메일이 도착하면 카카오톡으로 메세지를 보내면서 DB의 값을 수정해준다.

 

main문에서 60초 간격 무한루프로 동작하면서 새 메일들을 크롤링 하게된다.


아직 수정할 문제들도 있고 좀 더 추가하고 싶은 기능이 많지만 첫 번째 최종본으로 해당 코드를 올렸다.

다음 메일 크롤링 시에는 크롬이 백그라운드로 실행이 되지만 네이버 메일 크롤링은 백그라운드로 실행이 되지 않는다. 또 while문으로 해당 함수들을 60초 간격으로 반복하지만 너무 자주 같은 동작을 호출하면 서버에서 비정상 감지로 차단될 우려도 있다.

 

해당 기능을 서버화 해서 웹 사이트나 앱으로 구현하고 싶지만 아직 백엔드에 대해 공부를 더 해야할 것 같다.

 

 

 

Git 주소:

https://github.com/m3k0813/MailBox