開發

Kakao: 카카오톡 알림 모듈 (w/Kakao Developers)

calicorone 2026. 1. 11. 15:42
반응형
 

Kakao Developers

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

developers.kakao.com

Cursor AI가 1분도 안 걸려서 만들어주는데 작동이 되는지는 새로 토큰 발급 받아서 나중에 돌려봐야 알 듯 그리고 계속 뜯어 고치고 사이즈가 늘어나면 남이 짠 코드를 이해하고 수정해 나가는 미친 짓이 될 수도 있겠다는 생각은 들지만 기록만 개발할 때마다 잘 남기면 설명도 잘해주니까 사람을 붙잡고 인수인계 받아야하는 상황보다는 비교도 못하게 편의성과 시간과 공간의 제약을 풀어주며 솔직히 저 코드를 주니어 때 설계하려면 며칠동안 구글링만 했을 것이다. 또 다시 장단점이 공존 상황이다.

그래도 여전히

"""
카카오톡 알림 모듈
카카오톡 REST API를 사용하여 메시지 전송
"""
import requests
import json
from typing import Dict, Any, Optional
from pathlib import Path


class KakaoNotifier:
"""카카오톡 알림 클래스"""
 
# 카카오톡 API 엔드포인트
 
def __init__(self, access_token: str = None):
"""
카카오톡 알림 초기화
 
Args:
access_token: 카카오톡 액세스 토큰
 
Note:
access_token은 config_secrets.json에서 로드하거나 직접 전달할 수 있습니다.
"""
self.access_token = access_token
self.session = requests.Session()
 
if self.access_token:
self._set_headers()
 
def _set_headers(self):
"""HTTP 헤더 설정"""
self.session.headers.update({
'Authorization': f'Bearer {self.access_token}',
'Content-Type': 'application/x-www-form-urlencoded'
})
 
def send_message(self, message: str) -> bool:
"""
카카오톡으로 메시지 전송
 
Args:
message: 전송할 메시지
 
Returns:
전송 성공 여부
"""
if not self.access_token:
print("⚠️ 카카오톡 액세스 토큰이 설정되지 않았습니다.")
return False
 
try:
# 카카오톡 메시지 템플릿 생성
template_object = {
"object_type": "text",
"text": message,
"link": {
"mobile_web_url": "https://developers.kakao.com"
}
}
 
data = {
'template_object': json.dumps(template_object)
}
 
response = self.session.post(self.API_URL, data=data, timeout=10)
response.raise_for_status()
 
result = response.json()
if result.get('result_code') == 0:
print("✅ 카카오톡 메시지 전송 성공")
return True
else:
print(f"❌ 카카오톡 메시지 전송 실패: {result.get('msg', 'Unknown error')}")
return False
 
except requests.exceptions.RequestException as e:
print(f"❌ 카카오톡 API 요청 실패: {e}")
return False
except Exception as e:
print(f"❌ 카카오톡 메시지 전송 오류: {e}")
return False
 
def send_formatted_message(self, title: str, content: str, footer: str = None) -> bool:
"""
포맷된 메시지 전송
 
Args:
title: 메시지 제목
content: 메시지 내용
footer: 메시지 하단 (선택사항)
 
Returns:
전송 성공 여부
"""
message = f"{title}\n\n{content}"
if footer:
message += f"\n\n{footer}"
 
return self.send_message(message)
 
def test_connection(self) -> bool:
"""
카카오톡 API 연결 테스트
 
Returns:
연결 성공 여부
"""
if not self.access_token:
print("⚠️ 카카오톡 액세스 토큰이 설정되지 않았습니다.")
return False
 
try:
# 친구 목록 조회로 연결 테스트
response = self.session.get(self.FRIENDS_URL, timeout=10)
response.raise_for_status()
print("✅ 카카오톡 API 연결 성공")
return True
except requests.exceptions.RequestException as e:
print(f"❌ 카카오톡 API 연결 실패: {e}")
if hasattr(e.response, 'status_code'):
if e.response.status_code == 401:
print(" 액세스 토큰이 만료되었거나 유효하지 않습니다.")
elif e.response.status_code == 403:
print(" API 권한이 없습니다. 카카오톡 개발자 센터에서 권한을 확인하세요.")
return False
except Exception as e:
print(f"❌ 카카오톡 API 연결 테스트 오류: {e}")
return False


def create_kakao_notifier(config: Dict[str, Any]) -> Optional[KakaoNotifier]:
"""
설정에서 카카오톡 알림 생성
 
Args:
config: 설정 딕셔너리
 
Returns:
KakaoNotifier 인스턴스 또는 None
"""
notifications_config = config.get('notifications', {})
kakao_config = notifications_config.get('kakao', {})
 
if not kakao_config.get('enabled', False):
return None
 
access_token = kakao_config.get('access_token')
if not access_token:
print("⚠️ 카카오톡 알림이 활성화되어 있지만 access_token이 설정되지 않았습니다.")
return None
 
return KakaoNotifier(access_token=access_token)
반응형