2장, 나에게 카카오톡 메시지 보내기 프로젝트

이 프로젝트는 카카오 OpenAPI를 사용하여 나에게 카카오톡 메시지를 전송하는 프로젝트이다.

 

REST API를 사용한 카카오 로그인 과정

카카오 인증 서버와 통신하기 위해선 '인가 코드'와 '토큰'이 필요하다.

카카오 메시지 API 사용 권한을 받기 위해서도 필요하다.

requests 라이브러리로 해당 url과 통신할 때 data에 인가 코드를 담아 요청하면 토큰을 발급받을 수 있다.

import requests

url = "https://kauth.kakao.com/oauth/token"

data = {
    "grant_type" : "authorization_code",
    "client_id" : "<REST API KEY>",
    "redirect_uri" : "https://localhost.com",
    "code" : "<Authorization Code>"
}

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

# 요청에 실패했다면,
if response.status_code != 200:
    print("error! because ", response.json())
else: # 성공했다면,
    tokens = response.json()
    print(tokens)

토큰은 유효 시간이 있으며 경과 시 갱신을 해야 한다. 따라서 토큰을 관리하는 함수를 작성해야 한다.

import requests
import json
import datetime
import os


# 카카오 토큰을 저장할 파일명
KAKAO_TOKEN_FILENAME = "res/kakao_token.json"

# 저장하는 함수
def save_tokens(filename, tokens):
    with open(filename, "w") as fp:
        json.dump(tokens, fp)
        
# 읽어오는 함수
def load_tokens(filename):
    with open(filename) as fp:
        tokens = json.load(fp)
        
    return tokens

# refresh_token으로 access_token 갱신하는 함수
def update_tokens(app_key, filename):
    tokens = load_tokens(filename)
    
    url = "https://kauth.kakao.com/oauth/token"
    data = {
        "grant_type" : "refresh_token",
        "client_id" : "<REST API KEY>",               #todo delete
        "refresh_token" : tokens['refresh_token']
    }
    response = requests.post(url, data=data)
    
    # 요청에 실패했다면,
    if response.status_code != 200:
        print("error! because ", response.json())
        tokens = None
    else: # 요청에 성공했다면,
        print(response.json())
        # 기존 파일 백업
        now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        backup_filename = filename+"."+now
        os.rename(filename, backup_filename)
        # 갱신된 토큰 저장
        tokens['access_token'] = response.json()['access_token']
        save_tokens(filename, tokens)
        
    return tokens

# 토큰 저장
save_tokens(KAKAO_TOKEN_FILENAME, tokens)

# 토큰 업데이트 -> 토큰 저장 필수!
# KAKAO_APP_KEY = ""
# tokens = update_tokens(KAKAO_APP_KEY, KAKAO_TOKEN_FILENAME)
# save_tokens(KAKAO_TOKEN_FILENAME, tokens)

인증코드와 토큰을 관리하는 코드가 작성 되었다면 카카오 메시지 API 문서에 따라 템플릿을 지정하고

기능을 구현할 수 있다.

import json
import requests

# 저장된 토큰 정보를 읽어 옴
tokens = load_tokens(KAKAO_TOKEN_FILENAME)

# 텍스트 메시지 url
url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"

# request parameter 설정
headers = {
    "Authorization" : "Bearer " + tokens['access_token']
}

data = {
    "template_object" : json.dumps({ "object_type" : "text",
                                     "text" : "프로젝트 성공!!",
                                     "link" : {
                                               "web_url" : "www.naver.com"
                                     }
                                   })
}

# 나에게 카카오톡 메시지 보내기 요청 (text)
response = requests.post(url, headers = headers, data = data)
print(response.status_code)

# 요청에 실패했다면,
if response.status_code != 200:
    print("error! because ", response.json())
else: # 성공했다면,
    print('메시지를 성공적으로 보냈습니다.')

실행 결과)

생활밀착형 프로젝트 느낀점)

  • 프로젝트를 진행(따라)하면서 우리가 실생활에서 접할 수 있는 여러 기능들이 어떻게 코드로 구현되는 지를 알 수 있었다. 1장 부터 3장까지 내용은 API 통신을 주로 사용하는데 이 때 공식 문서를 접하면서 필요한 변수들을 확인하고 조건에 맞게 작성하는 방법을 배울 수 있었다.
  • 또한 계속 코드를 실행할 때마다 오류가 났는데 처음엔 짜증나고 답답했지만 어쩌면 개발자에게는 익숙해져야 하는 것이라 생각했다. 점점 시간이 지날수록 오류가 날 때마다 오히려 이를 어떻게 접근하고 해결해야 할지에 대해 고민하게 되었다.
  • 에러를 해결할 때마다 자신감이 생기고 일종의 쾌감을 느낄 수 있었다. 이 또한 문제해결이자 나의 경험이라고 생각하기 때문이다. 따라서 앞으로 문제를 맞닥뜨릴 때마다 계속 검색하고 고민하는데 시간을 많이 투자해야 한다. 그래야 조금이라도 해결이 되고 이에 자신감이 생겨 더 잘하게 될 것이다.

 

 

 

 

 

출처 : 

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

 

Kakao Developers

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

developers.kakao.com