여기선 텀블벅을 기준으로 만들었지만, 이미 존재하는 카톡 API와 크롤링을 활용하는 거라 다른 사이트에도 얼마든지 접목해서 응용 가능하다.
아래와 같이 크게 3단계로 나누어서 설명 중이고, 이 글은 2번째 글이다.
1. 크롤링
2. 카톡으로 데이터 전송
3. 최종 정리 및 통합 코드
Contents
2. 카톡으로 데이터 전송 - 내가 긁은 정보 카톡으로 받기
API와 requests에 대한 간단한 지식이 필요하다
API
- 소프트웨어끼리 통신할 수 있게 해주는 일종의 통로, 문답 창구, 챗봇
- 서버 : 보내는 자, 클라이언트 : 받는 자
- 이미 존재하는 서비스를 내 프로젝트에 활용하고 싶다면, 그 서비스가 제공하는 api를 찾아보자
requests
- 파이썬에서 제공하는 HTTP 요청할 때 쓰는 라이브러리
- HTTP : 웹에서 데이터를 주고받을 때 사용하는 공식 규칙(프로토콜)
- 설치 :
pip install requests
1) 카카오톡 메시지 api 사용 설정하기
(1) 카카오 디벨로퍼스 가입 및 내 애플리케이션 생성 및 설정
우선 카카오 디벨로퍼스 계정이 있어야 한다.(https://developers.kakao.com/)
'내 애플리케이션'을 하나 만들고, 메시지를 주고받을 계정들을 한 팀으로 초대한다.
개인용으로 간단히 테스트만 해볼 거라 최대한 무료로 진행할 것이다. 기업용(비즈앱)이 아니라면 팀원끼리만 톡을 주고 받을 수 있기 때문에, 카카오 디벨로퍼스 계정 2개를 한 팀으로 만들어서 톡을 주고받는다. 그래서 카카오톡, 카카오 디벨롭퍼스 모두 발신자-수신자 각각 총 4개(보통 카카오톡과 카카오 디벨로퍼스 둘 다 같은 계정을 쓰므로 사실상 2개)의 계정을 준비했다.
카톡의 '나에게 보내기' 기능을 써도 되지만, 알다시피 이 경우 자동 읽음 처리가 돼서 카톡 알림을 받을 수 없다. 그래서 다른 사람으로부터 톡을 받는 방법을 선택했다. 전화번호가 1개라면 다른 친구한테 부탁을 하던지 해서 계정 2개를 준비해야 한다.
무엇보다 카톡을 주고 받을 사람들은 서로 카톡 친구로 추가가 되어 있어야 한다.
(2) 메시지 템플릿 설정
내가 받을 메시지의 템플릿도 미리 설정해 둬야 한다.
간단한 텍스트만 전달받을 것이기 때문에, 템플릿으로 <텍스트>를 골랐다.
- 카카오톡 메시지 API 설명 : https://developers.kakao.com/docs/latest/ko/message/rest-api
- 메시지 템플릿 :
텍스트 (https://developers.kakao.com/docs/latest/ko/message/message-template#text)
(3) 내 애플리케이션의 REST API KEY 확인

2) 사용자 카카오톡 로그인
먼저 필요한 라이브러리를 import 한다.
import requests
import json
(1) 인가 코드 받기
먼저 변수를 설정한다
REST_API_KEY = '발급받은api키'
REDIRECT_URI = 'https://example.com/oauth'
인가 코드를 얻을 주소를 생성한다
auth_code_requests = f"https://kauth.kakao.com/oauth/authorize?response_type=code&client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&scope=profile_nickname,friends,talk_message"
print(auth_code_requests)
주소에 접속해서 이용 동의를 하고 인가 코드를 얻어서 변수로 설정한다. 주소에서 ?code= 바로 뒷부분을 복사하면 된다.
받는 사람 계정, 보내는 사람 계정 모두 실시해서 얻어 두자.
AUTH_CODE = '보내는사람(발신자)_인가코드'
AUTH_CODE2 = '받는사람(수신자)_인가코드'
(2) 토큰 받기
카톡을 주고받기 위해서는 토큰이 필요하다. 이 토큰은 유효기간이 있기 때문에 만료된 토큰은 갱신을 해야 쓸 수 있다.
① 새 엑세스 토큰 발급
새 토큰을 발급받는 함수를 설정해 보겠다. 또한 생성된 토큰은 언제든 확인할 수 있게 json 파일로 저장한다.
def first_access_token(name, rest_api_key, redirect_uri, auth_code):
url = 'https://kauth.kakao.com/oauth/token'
data = {
'grant_type': 'authorization_code',
'client_id': rest_api_key,
'redirect_uri': redirect_uri,
'code': auth_code,
}
response = requests.post(url, data=data)
if response.status_code != 200:
return print("fail: ", response.json())
tokens = response.json()
with open(f"./token_{name}.json", "w") as f:
json.dump(tokens, f, indent=4)
with open(f"./token_{name}.json", 'r') as f:
tokens = json.load(f)
return tokens
발급받은 토큰을 변수로 지정한다.
token_발신자 = first_access_token('발신자', REST_API_KEY, REDIRECT_URI, AUTH_CODE)
한번이라도 발급을 진행했다면 이렇게 token_발신자.json 파일에 여러 정보가 담겼을 것이다.
{
"access_token": "접근용토큰",
"token_type": "bearer",
"refresh_token": "갱신용토큰",
"expires_in": 21599,
"scope": "talk_message profile_nickname friends",
"refresh_token_expires_in": 5183999
}
access_token과 refresh_token 모두 유효기간이 있는 것을 볼 수 있다.
② 토큰 생성 또는 갱신(refresh)
이제 refresh_token을 이용해 토큰을 매번 새로 발급받지 않고, 갱신이 가능하면 갱신을 하고, 없으면 새로 발급을 받을 것이다. 토큰이 저장되는 json 파일도 갱신할 때마다 업데이트되도록 한다.
(한번이라도 ①을 실행해야 refresh_token을 얻을 수 있다)
def refresh_access_token(name, rest_api_key, redirect_uri, old_tokens):
url = 'https://kauth.kakao.com/oauth/token'
data = {
'grant_type': 'refresh_token',
'client_id': rest_api_key,
'redirect_uri': redirect_uri,
'refresh_token': old_tokens['refresh_token'],
}
response = requests.post(url, data=data)
if response.status_code != 200:
return print("fail: ", response.json())
new_tokens = response.json()
# 기존 토큰 json 파일 업데이트
with open(f"./token_{name}.json", 'r') as f:
tokens = json.load(f)
if 'access_token' in new_tokens:
print("새 엑세스 토큰:", new_tokens['access_token'])
tokens['access_token'] = new_tokens['access_token']
if 'refresh_token' in new_tokens:
print("새 리프레시 토큰:", new_tokens['refresh_token'])
tokens['refresh_token'] = new_tokens['refresh_token']
with open(f"./token_{name}.json", 'w') as f:
json.dump(tokens, f, indent=4)
return new_tokens
발신이든 수신이든 필요한 사람은 이 함수를 실행해 토큰을 갱신한다.
(이 함수를 쓸 거면 token_발신자에는 json 전체를 담아야 한다)
new_token_발신자 = refresh_access_token('발신자', REST_API_KEY, REDIRECT_URI, token_발신자)
new_access_token = new_token_발신자['access_token']
이제 필요한 로그인 데이터를 모두 얻었으니, 카톡을 보내보자.
3) 카카오톡 보내기
우선 시험 삼아 '나에게 보내기' 기능을 써보겠다
나에게 보내기
def msg_me(text, access_token):
url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
headers = {
"Authorization": f"Bearer {access_token}"
}
data = {
"template_object": json.dumps({
"object_type": "text",
"text": text,
"link": {
"web_url": f"{SITE_ADDRESS}"
},
"button_title": "텀블벅 바로가기"
})
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
print("나에게 메세지 전송 성공!")
else:
print(f"전송 실패. Status code: {response.status_code}")
print(response.json())
간단하게 메시지를 적어서 보내본다
msg_me(f'가격:\t{price}\n후원자 수:\t{patron}',
new_access_token)
나에게 메세지 전송 성공!
메시지가 잘 왔다면 성공이다
이제 친구한테 보내보자
친구에게 보내기
① 친구 uuid 얻기
메시지를 보내려면, 수신자의 uuid가 필요하다. 그리고 당연하지만 이 uuid는 발신자 카톡에 친구 추가가 되어있는 사람 것만 얻을 수 있다.
만약 수신자가 발신자 친구 목록의 가장 첫 번째에 있다면 0이다.(두 번째는 1, 10번째는 9, ...)
url = "https://kapi.kakao.com/v1/api/talk/friends"
header = {"Authorization": f"Bearer {new_access_token}"}
response = requests.get(url, headers=header).text
friends_list = json.loads(response).get("elements")
friend_uuid = friends_list[0]['uuid'] # 0 자리에 발신자의 친구 목록에서 '수신자의 순서-1' 값을 넣는다
print('친구 이름:', friends_list[0]['profile_nickname']) # 이 0도 마찬가지
print('친구 uuid:', friend_uuid)
친구 이름: 홍길동
친구 uuid: 홍길동의uuid
내가 메시지를 보낼 친구(수신자) 이름이 제대로 나오는지 확인했다. 이제 이 uuid를 변수로 지정한다.
FRIEND_UUID = friend_uuid
② 친구에게 메시지 보내기
이번에는 '내 애플리케이션'에서 미리 설정한 메시지 템플릿을 이용해 진짜 알림 카톡처럼 메시지를 보내보겠다.
메시지 템플릿을 설정할 때 썼던 '사용자 인자'를 변수로 써야 한다.

template_args에서 사용자 인자를 활용해 보낼 메시지를 설정한다.
def msg_friend_template(pj_name, price_value, patron_value, access_token):
url = "https://kapi.kakao.com/v1/api/talk/friends/message/send"
headers = {
"Authorization": f"Bearer {access_token}",
}
data = {
"receiver_uuids": f'["{FRIEND_UUID}"]',
"template_id": '템플릿ID',
"template_args": f'{{"PROJECT_NAME":"{pj_name}", "PRICE_NUM":"{price_value}", "PATRON_NUM":"{patron_value}"}}'
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
print("친구에게 메세지 전송 성공!")
else:
print(f"전송 실패. Status code: {response.status_code}")
print(response.json())
return response.status_code
메세지를 전송해 보자
msg_friend_template(project_name, price, patron, new_access_token)
친구에게 메세지 전송 성공!
토큰을 읽어서 메시지를 전송하기까지를 하나로 정리해 보자
토큰을 읽어서 메시지를 보내되, 토큰이 만료되었다면 갱신해서 메시지를 어떻게든 보내도록 한다.
함수는 위에 있으니 또 안 쓰겠다.
# 토큰 정보 읽기
with open(f"./token_발신자.json", 'r') as f:
token_발신자 = json.load(f)
access_token = token_발신자['access_token']
# 메시지 보내기
msg_result = msg_friend_template(project_name, price, patron, access_token)
# 메시지 보내기 실패시 토큰 갱신
if msg_result!=200:
new_token_발신자 = refresh_access_token('발신자', REST_API_KEY, REDIRECT_URI, token_발신자)
access_token = new_token_발신자['access_token']
msg_friend_template(project_name, price, patron, access_token)
친구에게 메세지 전송 성공!
카톡 보내기 끝 -
다음 글에서 1, 2번 글을 모두 합치고 간단한 추가 기능을 넣어서 종합해 보겠다.
'mini project' 카테고리의 다른 글
| 텀블벅 트래커(tumblbug tracker) - 카카오톡 메시지 알림을 활용한 실시간 후원 상태 트래커 만들기 (3) (0) | 2025.03.06 |
|---|---|
| 텀블벅 트래커(tumblbug tracker) - 카카오톡 메시지 알림을 활용한 실시간 후원 상태 트래커 만들기 (1) (0) | 2025.03.06 |
| spreadsheet | 근태 기록(출근 퇴근 시간) 구글 시트 만들기 (자동화) (0) | 2024.11.12 |
| FFmpeg 활용 - 외부 사이트 없이 직접 mp3를 wma로, wma를 mp3로 변환하기 (0) | 2024.07.17 |