티스토리 뷰

교육과정 중, 교육생 분께서 카카오  api 사용법을 물어보셔서 답변을 드리다가 만들게 된 코드!

아래와 같은 결과물을 보내준다.

 

(당연하지만, kakao developers에서 api 사용할 수 있도록 설정하는 것 필요!)

 

 

 

hotdeal_eomise.py

import requests
import json
import time
import copy
import re
from bs4 import BeautifulSoup
from datetime import datetime

import kakao_test


site_url = 'https://eomisae.co.kr/fs'
board_list = []  # 크롤링 결과 저장 리스트
p_board_list = []  # 이전 크롤링 결과 저장 리스트


def f_get_list():
    result_search = requests.get(site_url)
    html = result_search.text
    soup = BeautifulSoup(html, 'html.parser')
    all_lists = soup.select('.card_el.n_ntc.clear') #전체 게시글 덩어리 크롤링

    times = soup.select('div > div.card_content > p > span:nth-child(2)')
    titles = soup.select('div > div.card_content > h3 > a')
    

    for idx in range(len(titles)):
        title = titles[idx].text #제목 앞에 탭 제거
        board_list.append('제목: ' +title +'\n작성시간: '+times[idx].text  +'\n링크: ' +site_url +titles[idx]['href'])



# kakao_test.f_get_refresh_token() #최초 refresh token 추출시에만 수행

while True:
    print("작동합니다")
    f_get_list()  #게시글 크롤링
    access_token = kakao_test.f_reissue_token()  # 새로운 액세스 토큰을 발급 받음
    sms_list = list(set(board_list) - set(p_board_list))  # 이전 리스트와 비교하여 다른 값만 문자 보낼 리스트로 저장
    p_board_list = copy.deepcopy(board_list)  # 현재 게시글을 이전 게시글로 저장

    kakao_test.f_send_msg(access_token, '어미새 핫딜 결과\n'  +'현재 시간 {} 최신글은 총 {}개입니다.'.format(datetime.now().strftime('%H:%M:%S'),len(sms_list)))

    for i in range(len(sms_list)):
        kakao_test.f_send_msg(access_token, sms_list[i])

    board_list.clear()
    sms_list.clear()
    time.sleep(1800)  # 반복 주기

 

kakao_test.py

import time
import requests
import json

# code url  https://kauth.kakao.com/oauth/authorize?client_id=자신의 rest api key 값&redirect_uri=https://example.com/oauth&response_type=code
url = 'https://kauth.kakao.com/oauth/token'  # 카톡 인증 url
rest_api_key = 'REST API키를 입력해 주세요'  # 카톡 rest 키
redirect_uri = '인증용 redirect url을 입력해 주세요'  # 카톡 인증용 redirect url
authorize_code = '인증용 url을 통해 받으셨던 코드를 입력해 주세요'  # 카톡 인증용 코드 수행시마다 재발급 필요


# 최초 token들 발급하여 refresh token 저장
def f_get_refresh_token():
    data = {
        'grant_type': 'authorization_code',
        'client_id': rest_api_key,
        'redirect_uri': redirect_uri,
        'code': authorize_code,
    }

    response = requests.post(url, data=data)
    tokens = response.json()

    with open('refresh_token.json', 'w') as fd:
        json.dump(tokens, fd)


# refresh token을 이용하여 새로운 access token 발급
def f_reissue_token():
    with open('refresh_token.json', 'r') as fd:
        token = json.load(fd)
    refresh_token = token['refresh_token']
    data = {
        'grant_type': 'refresh_token',
        'client_id': rest_api_key,
        'refresh_token': refresh_token
    }
    response = requests.post(url, data=data)
    tokens = response.json()

    with open('access_token.json', 'w') as fd:
        json.dump(tokens, fd)
    with open('access_token.json', 'r') as fd:
        ts = json.load(fd)
    access_token = ts['access_token']
    return access_token


# 메시지 전송
def f_send_msg(access_token, msg):
    header = {'Authorization': 'Bearer ' + access_token}
    url = 'https://kapi.kakao.com/v2/api/talk/memo/default/send'  # 나에게 보내기 주소
    post = {
        'object_type': 'text',
        'text': msg,
        '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)
댓글