파이썬으로 작성한 프로그램에서 "카카오톡 나에게 보내기"를 통해 실시간으로 정보를 받아보기 위해 나름 코딩을 해 보았습니다. 그런데 작성 완료 후 테스트를 하면서 알게 된 사실인데, 나에게 보내기를 하면 채팅방 알림을 주지 않는다는 거에요. 실시간 확인을 위해 만든건데 알림이 없다니... ㅠ.ㅠ
KAKAO DEVELOPERS 사이트를 방문합니다.
1. 내 애플리케이션 등록 및 앱키 확인
로그인 한 후 상단의 내 애플리케이션 으로 이동하여 애플리케이션 추가하기를 누르고 애플리케이션을 추가합니다. 회사이름란에는 개발할 서비스명을 써주면 됩니다.
애플리케이션이 추가되고 나면 앱키를 발급해 주는데 이 중에서 토큰을 발급 받으려면 REST API 키가 필요합니다. 메모장을 열고 키를 복사해 놓습니다.
2. 카카오 로그인 활성화 및 동의항목 설정
내 애플리케이션 좌측 메뉴에 카카오 로그인으로 들어가면 활성화 설정이 나오는데 상태를 on 으로 바꾸고, 아래쪽에 Redirect URI 는 어플리케이션에서 돌리는 것이므로 Redirect URI 등록 버튼을 누르고 http://localhost 를 추가하면 됩니다.
좌측 메뉴 카카오 로그인 바로 아래에 동의항목으로 들어가서 필수 동의인 것들 설정하고 맨 아래 카카오톡 메시지 전송을 설정버튼을 눌러 선택 동의로 바꿉니다. 동의목적이 필수로 되어 있는데 개발 또는 나에게 메시지 보내기 이런식으로 적어 주면 됩니다.
3. 인증 코드 받기
REST API 카카오 로그인 프로세스
kakao developers 문서에는 아래와 같이 나와 있습니다.
https://kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code
메모장에 아래를 복사하여 붙여 넣습니다.
https://kauth.kakao.com/oauth/authorize?client_id={REST API 키}&redirect_uri=http://localhost&response_type=code
{REST API 키}는 대괄호를 포함하여 REST API 키를 입력합니다. 대괄호 안에 넣는 것이 아니고 대괄호 포함해서 REST API 키로 바꾸어 입력합니다. 복사하여 브라우저 주소표시줄에 붙여 넣습니다.
로그인 창이 뜨면 동의가 필요한 부분을 확인하고 로그인을 합니다.
REDIRECT_URI를 localhost로 넣었기 때문에 에러페이지 또는 사이트에 연결할 수 없음 이라는 페이지 오류가 나옵니다.
당황하지 말고 위 주소표시줄을 보면
localhost/?code=*************************************************
이렇게 출력되고 있는데 이 중에서 code= 뒷 부분이 모두 인증 코드입니다. 메모장에 인증 코드를 복사해 놓습니다.
4. 토큰 받기
import requests
import json
url = "https://kauth.kakao.com/oauth/token"
data = {
"grant_type" : "authorization_code",
"client_id" : "{REST API 키}",
"redirect_uri" : "http://localhost",
"code" : "3번에서 받은 인가 코드"
}
response = requests.post(url, data=data)
tokens = response.json()
# 토큰을 파일로 저장하기
if "access_token" in tokens:
with open("kakao_token.json", "w") as fp:
json.dump(tokens, fp)
print("Tokens saved successfully")
else:
print(tokens)
토큰을 파일로 저장하는 이유는 토큰에 유효기간이 있기 때문입니다. 파일을 열어서 내용을 확인해 보겠습니다.
{"access_token": "v5fdTZ7****************************************************", "token_type": "bearer", "refresh_token": "Kwk9U******************************************", "expires_in": 21599, "scope": "talk_message profile_nickname", "refresh_token_expires_in": 5183999}
딕셔너리 형태로 반환 된 것을 확인할 수 있는데, "expires_in": 21599, 이런 식으로 초단위로 남은 유효시간을 넘겨 줍니다.
5. 토큰 갱신 및 메시지 보내기
kakao.py 만들기
프로그램 베이스 디렉토리에 kakao.py를 만들어 줍니다. 위에서 저장한 kakao_token.json 파일도 이 디렉토리에 같이 있어야 합니다.
import requests
import json
class Kakao():
def __init__(self):
self.app_key = "{REST API 키}" ## REST API 키 입력
# 저장 된 json 파일 읽어오기
with open("kakao_token.json", "r") as fp:
self.tokens = json.load(fp)
self.refresh_token()
# 카카오 토큰 갱신하기
def refresh_token(self):
url = "https://kauth.kakao.com/oauth/token"
data = {
"grant_type": "refresh_token",
"client_id": self.app_key,
"refresh_token": self.tokens['refresh_token']
}
response = requests.post(url, data=data)
# 갱신 된 토큰 내용 확인
result = response.json()
# 갱신 된 내용으로 파일 업데이트
if 'access_token' in result:
self.tokens['access_token'] = result['access_token']
if 'refresh_token' in result:
self.tokens['refresh_token'] = result['refresh_token']
else:
pass
with open("kakao_token.json", "w") as fp:
json.dump(self.tokens, fp)
def send_to_kakao(self, text):
url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
headers = {"Authorization": "Bearer " + self.tokens['access_token']}
content = {
"object_type": "text",
"text": text,
"link": {"mobile_web_url": "http://m.naver.com"}
}
data = {"template_object": json.dumps(content)}
res = requests.post(url, headers=headers, data=data)
## 에러메시지 확인
res.json()
아래표를 참조해 보면 Access Token 의 경우 REST API 를 사용하였을 때 유효기간이 고작 6시간에 불과합니다.
Refresh Token 의 유효기간은 2개월이고 유효기간 1달 남은 시점부터 갱신이 가능하다고 되어 있습니다.
TokenType Role Valid
Access Token | 사용자를 인증합니다. | Android, iOS : 12시간 JavaScript: 2 시간 REST API : 6시간 |
Refresh Token | 일정 기간 동안 다시 인증 절차를 거치지 않고도 액세스 토큰 발급을 받을 수 있게 해 줍니다. | 2달 유효기간 1달 남은 시점부터 갱신 가능 |
그래서 프로그램을 시작할 때 토큰을 갱신하고 파일에 저장한 다음 변경된 토큰을 이용하여 메시지를 보내도록 코딩하였습니다.
Request 의 Parameter 항목을 보면 필수항목 3개 중에 refresh_token 에 대한 내용이 나옵니다.
refresh_token String 토큰 발급 시 응답으로 받은 refresh_token, Access Token을 갱신하기 위해 사용
Access Token을 갱신하면 아래와 같은 결과값을 받을 수 있습니다.
{'access_token': 'v5fdT**************************************', 'token_type': 'bearer', 'expires_in': 21599}
refresh_token의 유효기간이 많이 남아서 그런지 refresh_token 은 없습니다.
일일이 2개월을 체크해서 refresh_token을 갱신하는 것은 너무 비효율적인 일이라
if 'refresh_token' in result:
self.tokens['refresh_token'] = result['refresh_token']
else:
pass
이런식으로 결과값에 refresh_token 이 있으면, refresh_token을 갱신하도록 했습니다.
6. 메인프로그램에서 메시지 보내기
kakao.py 파일을 base 폴더에 두었다면
from kakao import *
이런식으로 메인 프로그램에 임폴트 해줍니다.
저는 kakao.py 파일을 base폴더/config 폴더에 두었기 때문에 아래와 같이 불러 왔습니다.
from config.kakao import *
def __init__(self):
self.kakao = Kakao()
메인 프로그램의 init 부분에 kakao.py의 Kakao()클래스를 불러와 self.kakao로 객체화 합니다.
메시지 보내고 싶은 내용을 아래와 같은 형식으로 적어 메시지를 보냅니다.
self.kakao.send_to_kakao(
text="보낼 내용"
)
SAMPLE
self.kakao.send_to_kakao(
text="제목\n"
+ "부제목\n"
+ "총매입금액 : " + str(format(int(self.total_buy_money), ',d')) + "원\n"
+ "총평가금액 : " + str(format(int(self.total_estimation_money), ',d')) + "원\n"
+ "총투자수익 : " + str(format(int(self.total_profit_loss_money), ',d')) + "원"
+ "(" + str(round(self.total_profit_loss_rate, 1)) + "%)\n"
+ "예수금 : " + str(format(int(self.output_deposit), ',d')) + "원\n"
+ "추정예탁자산 : " + str(format(int(self.estimated_deposit), ',d')) + "원"
)
텍스트는 최대 200자까지 표시할 수 있습니다.
'기타' 카테고리의 다른 글
카페24 쇼핑몰 엑셀로 상품 대량 등록하기 (0) | 2018.11.14 |
---|