ai-creator

카카오 OpenAPI 활용 - 나에게 카톡 메시지 보내기 본문

오늘 배워 오늘 쓰는 OpenAPI/프로젝트

카카오 OpenAPI 활용 - 나에게 카톡 메시지 보내기

ai-creator 2020. 2. 22. 14:01
반응형

[목차]

1. 학습목표

2. 들어가기

3. 사전 준비

4. 사전 지식 쌓기

5. 구현

ㅁ Trouble Shooting

ㅁ 요약정리

ㅁ 보충 자료

 


1. 학습목표

카카오에서 제공하는 OpenAPI를 이용해서 "나에게 카카오톡 메시지"를 보내 보겠습니다. 카카오톡 메시지를 보내기 위해 사전 지식을 학습하고, 구현하는 순서로 설명되어 있습니다.

 

이번 장을 배우시면 아래와 같이 카카오 메시지를 받을 수 있습니다.

텍스트 메시지로 보낸 경우
리스트 메시지로 보낸 경우

 카카오톡 메시지는 다양한 종류를 제공합니다. 이 책에서는 "나에게 메시지" 보내기와 "텍스트형/리스트형" 2가지 유형의 메시지만 다룹니다. 

2. 들어가기

여러분은 하루에 몇 시간 스마트폰을 사용하시나요? 모바일 잠금 화면 서비스 NBT의 설문조사에 따르면 하루 평균 스마트폰 이용시간은 5시간 정도라고 합니다(출처: Link). 한손에 쏙 잡히는 작은 세상에 할 것들이 무궁무진하죠. 스마트폰은 친구들과는 대화를 나누고, 재미난 동영상을 보고, 웹툰을 보며 시간을 보내고 때로는 공부도 하는 유용한 도구입니다.

 

그럼 5시간 중 어떤 앱을 가장 많이 사용할까요? 2018년도에 한국인이 가장 많이 사용하는 앱을 조사했더니 1위가 카카오톡이었습니다.

출처 : https://platum.kr/archives/133653

친구/가족들과의 소통하기, 선물하기, 결제하기 요즘은 쇼핑까지 할 수 있는 플랫폼으로 거듭나고 있습니다. '생활밀착형 앱'이라고 해도 과언이 아닙니다. 글을 읽고 계신 여러분들도 고개를 끄덕이고 계실 거예요.

이렇게 많은 시간을 보내면서 재미와 정보를 넘나드는 메시지들을 주고받는 카카오 앱을 통해서 내가 원하는 메시지들이 전달되면 어떨까요? 한번 상상해보시죠.

- 아침에 날씨, 약속 장소를 고려해서 입고 갈 옷을 카카오 메시지로 받는다면?

- 출근길에 요약된 뉴스를 카카오 메시지로 받는다면?

- 저녁 8시가 되면, 오늘 먹은 음식과 운동 내역을 고려해서 홈트 영상을 카카오 메시지로 받는다면?

상상만으로도 편리함에 미소 지어집니다.

 

이번 장에서는 카카오로 나만의 메시지 보내는 방법을 배워보도록 하겠습니다.

이 기능만으로도 근사한 프로젝트가 될 수 있고요,

다른 기능과 융합하여 색다른 프로젝트를 만들 수도 있습니다.

3. 사전 준비 

4. 사전 지식 쌓기  

구현에 꼭 필요한 사전 지식을 쌓음으로써 더 쉽고 빠르게 프로그램을 작성할 수 있습니다.

결과부터 보고 싶으신 분들은 [5. 구현]을 먼저 보시고, 다시 돌아와 학습하셔도 되겠습니다.

 

지식을 쌓을 내용은 다음과 같습니다.

1) 메시지 서비스 및 활용할 서비스 확인

2) 메시지 종류

3) 텍스트와 리스트 메시지 템플릿 알아보기

4) '나에게 보내기' REST API 살펴보기

4-1. 메시지 서비스 및 활용할 서비스 확인

(순서) 카카오 개발자 사이트(Link) > 메시지 > [문서 보기] > [카카오톡 메시지]

 

카카오 개발자 사이트(Link)에서 제공하는 여러 기능 중에 "메시지"를 사용합니다.

[문서 보기] 버튼을 누르면 문서가 나오는데, 시간적 여유가 있으신 분들은 찬찬히 읽어보시길 바랍니다. 

사용할 기능은 카카오톡 메시지 이므로, [카카오톡 메시지] 버튼을 클릭합니다.

해당 기능은 어떤 것이고, 사전 준비는 무엇을 해야 하고 등등이 나옵니다.

"사용권한" 관련 내용을 살펴보시죠.

카카오톡 서비스는 

- 나에게 메시지 보내기

- 친구에게 메시지 보내기

- 나에게 스크랩 메시지 보내기 

등의 다양한 기능을 API 형태로 지원한다고 합니다.

친구들에게 메시지를 보내고자 할 경우 "친구 목록"을 가져와 "메시지 전송"을 하게 되는데,  제약사항이 있습니다. 이 책에서는 권한 문제 및 구현 편의성을 고려하여 "나에게 메시지 보내기" 기능만 다루도록 하겠습니다.

(참고) 친구들에게 메시지 제약사항

  Option 1. "사업자 정보 등록"을 하고 검수 단계를 거친 사용자

  Option 2. 카카오 개발자 사이트에서 [내 애플리케이션] > [설정] > [팀 관리]에 추가한 카카오 계정의 친구들


4-2. 메시지 종류

(순서) 카카오 개발자 사이트 > [문서] > 메시지 > [REST API] > [메시지 템플릿] > [종류] 

메시지 종류는 피드/리스트/위치/커머스/텍스트/스크랩 등 다양하게 사용이 되며, 이 책에서는 "리스트"와 "텍스트" 유형 메시지를 배우도록 하겠습니다.

 

4-3. 텍스트와 리스트 메시지 템플릿 알아보기

각 메시지 종류별 제공되는 템플릿이 있습니다. 템플릿이란, 일정한 틀/형식을 의미합니다.  

텍스트 메시지는 텍스트 템플릿에 맞춰서 내용을 구성해줘야 하고,

리스트 메시지는 리스트 템플릿에 맞춰서 내용을 구성해 주어야 합니다.

 

1) 텍스트 메시지 템플릿 (기본 Default)

텍스트 메시지 템플릿

텍스트 템플릿은 문자 위주로 간단한 메시지를 보낼 때 사용합니다.  

텍스트 영역과 버튼으로 구성되어 있으며, 다른 템플릿 지정이 없다면 텍스트 템플릿으로 보내집니다.

 

1. 텍스트 영역: 최대 200자 표시
2. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

2) 리스트 메시지 템플릿

리스트 메시지세로로 된 목록 형태로 보여주는 메시지입니다. 최소 2개, 최대 5개의 아이템을 목록에 담을 수 있습니다. 기본 메시지로 리스트 메시지를 구성할 때는 최대 3개의 아이템만 사용할 수 있습니다.

뉴스나 게시물 목록을 메시지로 전달할 때 효과적인 형태입니다.

 

리스트 템플릿헤더 타이틀과 콘텐츠 목록버튼 등으로 구성됩니다. 헤더와 콘텐츠 각각의 링크를 가질 수 있습니다. 피드 템플릿과 마찬가지로 하나의 기본 버튼을 가지며 임의의 버튼을 설정할 수 있습니다.

 

1. 헤더 영역 
2. 아이템 리스트 영역: 최대 3개 표시 
3. 제목/설명 영역: 최대 3줄 표시 (제목 2줄, 설명 1줄 표시) 
4. 이미지 영역: 400px * 400px (권장 사항) 
5. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

 

 

메시지에 이미지를 넣는 방법

메시지 API로 이미지를 포함한 메시지를 보내려면 요청 시 각 이미지 파일의 경로(URL)를 전달해야 합니다. 클라이언트의 이미지 파일이나 기기에서의 이미지 저장 경로를 메시지 발송 요청에 사용할 수는 없습니다

 

4-4. '나에게 보내기' REST API 살펴보기

카카오 개발자 사이트(https://developers.kakao.com/docs/latest/ko/message/rest-api#send-me)에서 카카오톡 메시지 "나에게 보내기" REST API를 살펴봅시다.

제공하는 문서를 꼼꼼히 읽어보고 가이드에 따라 코드를 작성합니다.

Request - Response - Sample 순서로 설명되어 있습니다.

 

Request시에 필요한 URL, Parameter 등을 확인해봅니다.

먼저, URL이라고 되어 있는 부분을 보시죠. URL 부분은 POST, HOST, Authorization에 대해 설명하고 있습니다.

 

1) Request 요청 방식이 POST와 GET방식이 있는데, POST 방식을 사용한다는 의미입니다.

     POST와 HOST의 값을 조합하여 요청할 url을 구성할 수 있습니다.

2 ) 인증(Authorization) 방식은 Bearer를 사용합니다. 그리고, 사용자의 access token({USER_ACCESS_TOKEN})을 적어주면 되는데요, 이때 주의점이 있습니다. Bearer와 access token 사이에 "빈칸(space)" 있습니다. 만약 여러분의 access token이 access_token_of_example이라고 한다면, Bearer  access_token_of_example 이 됩니다.

 

Parameter에 template_object의 Description 에는 각 메시지 유형별 링크가 있으니 상세 설명을 확인해보세요. 

예) 유형 : 텍스트

위의 그림은 "텍스트" 유형인 경우, template_object 값을 어떻게 구성해야 하는지 상세하게 설명되어 있습니다.  '필수(Required)'는 빠짐없이 구성하여 요청하도록 합니다.

 

Response는 응답을 의미합니다.

요청에 대한 상태를 나타내는 HTTP의 상태 코드(Status code)에러에 대한 정보를 담은 에러 코드(Error code)로 나뉩니다.  요청이 성공하면 상태 코드 200과 함께 요청에 대한 응답 바디(response body)가 반환되고, 요청이 실패하면 code와 msg로 이루어진 에러 코드가 반환됩니다. 에러가 관리되는 방법은 플랫폼마다 다르며, 해당 내용은  카카오 OpenAPI에 대한 설명 및 예시입니다.

(참고) HTTP 상태 코드 (Link

에러가 발생하면 그 원인을 파악해야 합니다. 정말 중요한 일입니다. 

프로그래머는 의사와 비슷한 면이 있습니다. 건강상태가 안 좋은 환자(프로그램)에게 상황설명을 듣고(에러 값) 적절한 치료법(코드 수정)으로 진료하는 의사 말이죠. 에러가 발생하면, 에러 값을 살피지 않은 채 전전긍긍하다가 포기하는 분들을 많이 봤습니다. 에러를 확인하고, 그 원인을 찾아 수정하는 일에 익숙해지세요. 그리고 에러를 해결하는 희열도 느껴보시고요.

초보에서 고수로 가는 필수 과정입니다^^ 

5. 구현 

자, 그럼 이제 두 가지 유형의 메시지를 보내보시죠.

 

[구현 순서]

Step 1 텍스트 템프릿 사용하여 카카오톡 메시지 보내기 
Step 2 리스트 템플릿 사용하여 카카오톡 메시지 보내기

 

Step 1) 텍스트 템플릿 사용하여 카카오톡 보내기

텍스트 템플릿을 사용해서 메시지를 보내보도록 하겠습니다.

 

 

전체 코드

import json
import requests

url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"

# 사용자 토큰
headers = {
    "Authorization": "Bearer " + <access token>
}


data = {
    "template_object" : json.dumps({ "object_type" : "text",
                                     "text" : "Hello, world!",
                                     "link" : {
                                                 "web_url" : "www.naver.com"
                                              }
    })
}

response = requests.post(url, headers=headers, data=data)
print(response.status_code)
if response.json().get('result_code') == 0:
    print('메시지를 성공적으로 보냈습니다.')
else:
    print('메시지를 성공적으로 보내지 못했습니다. 오류메시지 : ' + str(response.json()))
  
  

실행 결과

200이 프로그램 결과 화면에 출력되었다면 정상 동작을 의미합니다.

카카오톡을 보면, 아래와 같은 메시지가 전송됨을 확인할 수 있습니다.  

 

코드 설명

라인번호 설명
1~2 필요한 라이브러리 선언
4 문서에 기재된 POST와 Host 정보를 조합하여 요청할 url 정의
6~9 문서에 기재된 Authorization 정보 기재
12~19  template_object에 필수(Requried)로 필수 요소 기재
20~22 요청 및 에러코드 확인

 

Step 2) 리스트 템플릿 사용하여 카카오톡 보내기

리스트 템플릿을 사용해서 메시지를 보내보도록 하겠습니다.

리스트 메시지는 2개 이상으로 구성되므로  contents 파라미터에 Content [ ] (파이썬에서 리스트 자료형)에 쓰여 있습니다. 

contents의 구성요소는 다음과 같습니다. 리스트 안에 구성요소를 나열해주시면 됩니다.

필수적으로 필요한 항목이 많으니 필수(Required) Parameter를 주의를 기울여서 작성해봅니다.

 

전체 코드

import json
import requests

url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"

# 사용자 토큰
headers = {
    "Authorization": "Bearer " +  <access token>
}

template = {
    "object_type" : "list",
    "header_title" : "초밥 사진",
    "header_link" : {
        "web_url" : "www.naver.com",
        "mobile_web_url" : "www.naver.com"
    },
    "contents" : [
        {
            "title" : "1. 광어초밥",
            "description" : "광어는 맛있다",
            "image_url" : "https://search1.kakaocdn.net/argon/0x200_85_hr/8x5qcdbcQwi",
            "image_width" : 50, "image_height" : 50,
            "link" : {
                "web_url" : "www.naver.com",
                "mobile_web_url" : "www.naver.com"
            }
        },
        {
            "title" : "2. 참치초밥",
            "description" : "참치는 맛있다",
            "image_url" : "https://search2.kakaocdn.net/argon/0x200_85_hr/IjIToH1S7J1",
            "image_width" : 50, "image_height" : 50,
            "link" : {
                "web_url" : "www.naver.com",
                "mobile_web_url" : "www.naver.com"
            }
        }
        
    ],
    "buttons" : [
        {
            "title" : "웹으로 이동",
            "link" : {
                "web_url" : "www.naver.com",
                "mobile_web_url" : "www.naver.com"
            }
        }
    ]
    
}

data = {
    "template_object" : json.dumps(template)
}

res = requests.post(url, data=data, headers=headers)
print(response.status_code)
if response.json().get('result_code') == 0:
    print('메시지를 성공적으로 보냈습니다.')
else:
    print('메시지를 성공적으로 보내지 못했습니다. 오류메시지 : ' + str(response.json()))

실행 결과

200이 프로그램 화면에 출력되었다면 정상 동작을 의미합니다.

카카오톡을 보면, 아래와 같은 메시지가 전송됨을 확인할 수 있습니다.  

 

코드 설명

라인번호 설명
1~2 필요한 라이브러리 선언
4 문서에 기재된 POST와 Host 정보를 조합하여 요청할 url 정의
6~9 문서에 기재된 Authorization 정보 기재
11~50 template_object에 필수(Requried)로 필수 요소 기재
53~55 template변수를 json string 형식으로 변경
57 요청
58~62 에러코드 확인

 

Trouble Shooting

카카오톡 메시지가 오지 않고, 프로그램 결과 화면에 출력된 결과가 다음과 같다면?

<access token> 값이 잘못된 경우입니다. 

제일 먼저 확인해봐야 할 사항은 정상적으로 발급받은 access token인지입니다.

혹시 어제까지 정상적으로 동작했는데 갑자기 안 되는 경우라면 , access token을 재발급받으셔야 합니다. access token은 유효한 시간이 있고, 그 시간이 지나 expired(기간 만료)돼었기 때문에 발생한 에러입니다.

재발급받는 방법은 카카오 사용자 토큰 재발급받기 를 확인해주세요.

ㅁ 요약정리 

1. 원하는 정보를 나에게 카카오 메시지로 보내면 유용합니다.

2. 다양한 메시지 유형 중 텍스트와 리스트 유형을 다루어 보았습니다.

 

 

이 외에도 다른 유형의 메시지를 사용하고 싶으시다면,  공식 문서를 참고하세요

 

 

ㅁ 보충자료  

A. 다양한 종류의 메시지 '더' 알아보기 

 

다양한 메시지 알아보기

메시지는 다양한 종류의 템플릿 중 하나를 선택하여 보내게 됩니다. 간단하게는 텍스트 템플릿부터 이미지, 텍스트, 버튼 등 다양한 형식으로 사용자가 직접 구성할 수 있는 커스텀 템플릿까지 제공하고 있습니다.

 

기본 템플릿(피드, 리스트, 위치, 커머스, 텍스트), 스크랩 템플릿, 커스텀 템플릿

3개의 그룹으로 분류, 총 7개의 유형이 있습니다.

 

 

 

1) 피드 템플릿

피드 템플릿은 하나의 콘텐츠와 하나의 기본 버튼을 가집니다. 소셜 정보를 추가할 수 있으며 임의의 버튼을 설정할 수도 있습니다.

 

1. 이미지 영역: 최대 1장 표시 / 800px * 800px 이상 (권장사항) 
2. 제목/설명 영역: 최대 4줄 표시 (제목, 설명 각각 2줄 표시) 
3. 소셜 영역: 최대 3개 표시 (순서: 좋아요 > 댓글 > 공유 > 조회 > 구독) 
4. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

피드 템플릿은 하나의 콘텐츠와 소셜 정보, 최대 두 개의 버튼을 가질 수 있습니다.

 

 

 

 

2) 리스트 템플릿

리스트 템플릿은 메시지 상단에 노출되는 헤더 타이틀과 콘텐츠 목록버튼 등으로 구성됩니다. 헤더와 콘텐츠 각각의 링크를 가질 수 있습니다. 피드 템플릿과 마찬가지로 하나의 기본 버튼을 가지며 임의의 버튼을 설정할 수 있습니다.

 

1. 헤더 영역 
2. 아이템 리스트 영역: 최대 3개 표시 
3. 제목/설명 영역: 최대 3줄 표시 (제목 2줄, 설명 1줄 표시) 
4. 이미지 영역: 400px * 400px (권장 사항) 
5. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

 

3) 위치 템플릿

위치 템플릿은 지도 표시에 사용되는 주소 정보와 해당 위치를 설명할 수 있는 콘텐츠 오브젝트로 구성됩니다.

 

1. 이미지 영역: 최대 1장 표시 / 800px * 800px이상 (권장사항) 
2. 제목/설명 영역: 최대 4줄 표시 (제목, 설명 각각 2줄 표시) 
3. 소셜 영역: 최대 3개 표시 (순서: 좋아요 > 댓글 > 공유 > 조회 > 구독) 
4. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

 

 

4) 커머스 템플릿

커머스 템플릿은 하나의 콘텐츠커머스 콘텐츠와 하나의 기본 버튼을 가집니다.

 

1. 이미지 영역: 최대 1장 표시 / 800px * 800px이상 (권장사항) 
2. 할인된 가격 영역 
3. 정상 가격 영역 
4. 할인율 영역 
5. 제품명 영역: 최대 2줄 표시 
6. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

 

 

 

 

5) 텍스트 템플릿(기본 Default)

 

텍스트 템플릿은 텍스트 영역과 버튼으로 구성됩니다. 다른 템플릿 지정이 없으면 텍스트 템플릿으로 보내게 됩니다.

 

1. 텍스트 영역: 최대 200자 표시
2. 버튼 영역: 최대 2개 표시, 버튼명 8자 이하 권장

 

6) 스크랩 템플릿

스크랩 템플릿은 웹 사이트 콘텐츠를 해당 웹 페이지의 Open Graph 정보를 이용하여 별도의 템플릿 생성 작업 없이 URL만으로 메시지를 간편하게 전달하게 합니다.


1. 이미지 영역: 최대 1장 표시 / 800px * 800px이상 (권장사항) 
2. 제목/설명 영역: 최대 4줄 표시 (제목, 설명 각각 2줄 표시) 
3. 버튼 영역: 최대 1개 표시, 버튼명 8자 이하 권장 
A. og:image / B. video:duration, music:duration / C. og:title, og:description / D. og:site_name

 

 

 

* 스크랩하려는 웹 사이트의 도메인은 반드시 내 애플리케이션 설정에 등록되어야 합니다. 
* 도메인은 개발자 웹사이트의 [내 애플리케이션] - 앱 선택 - [설정] - [일반] 메뉴에서 등록할 수 있습니다

 

7) 커스텀 템플릿

사용자가 원하는 메시지를 사용하고 싶다면 '메시지 템플릿 빌더'를 사용하여 자신만의 메시지 템플릿을 자유롭게 만들 수 있습니다. 메시지 템플릿 빌더는 [내 애플리케이션] - 앱 선택 - [설정] - [메시지 템플릿 v2]에서 이용할 수 있습니다.

 

B. 커스텀 템플릿 사용하기

커스텀 템플릿을 사용하기 위해서는 [메시지 템플릿 v2]에서 사전에 사용할 메시지 템플릿을 정해주어야 합니다.

[템플릿 추가] 버튼 클릭

"피드 형식"으로 생성해봅니다. [확인] 클릭

 

사용자가 동적으로 다루기 위해서 "${변수}"의 형식으로 지정하여, 메시지를 보낼 때 동적으로 변경된 값을 보낼 수 있습니다.

 

[라이언] 클릭 > 우측으로 이동되며 [제목]을 ${name}으로 입력하고 [임시저장] 클릭

좌측에 라이언 -> ${name}으로 바뀐 것을 확인하고

 

[최종 저장]을 눌러서 [템플릿 이름]을 정하시고 [저장] 클릭!

좌측에 템플릿이 생성되었습니다. (20267 번호는 "template id"에 해당되며, 각기 다르게 부여됩니다.)

 

 

전체 코드

import requests

# 커스텀 템플릿 주소 : https://kapi.kakao.com/v2/api/talk/memo/send
talk_url = "https://kapi.kakao.com/v2/api/talk/memo/send"

# 사용자 토큰
token = '<본인의 API키 넣기>'
header = {
    "Authorization": "Bearer {본인의 사용자 토큰 넣기}".format(
        token=token
    )
}

# 메시지 template id와 정의했던 ${name}을 JSON 형식으로 값으로 입력
payload = {
    'template_id' : {본인의 template id 넣기},
    'template_args' : '{"name": "테스트 제목"}'
}

# 카카오톡 메시지 전송
res = requests.post(talk_url, data=payload, headers=header)

if res.json().get('result_code') == 0:
    print('메시지를 성공적으로 보냈습니다.')
else:
    print('메시지를 성공적으로 보내지 못했습니다. 오류메시지 : ' + str(res.json()))

 


저작물의 저작권은 작성자에게 있습니다.

공유는 자유롭게 하시되 댓글 남겨주세요~

상업적 용도로는 무단 사용을 금지합니다.

끝까지 읽어주셔서 감사합니다^^

반응형
Comments