카카오톡으로 메시지 전송하기

다음 카카오 API 활용법 #2

Dr.Kevin 08/25/2019

안녕하세요? 4개월 만에 새로운 포스팅을 올립니다. 이번에는 R을 활용하여 카카오톡으로 메시지를 보내는 방법에 대해 알아보겠습니다. 카카오 계정으로 로그인할 때마다 수작업으로 인증을 매번 해줘야한다는 점에서 생각보다 까다롭습니다만 제가 이해하고 있는 범위에서 처음 하시는 분도 따라올 수 있도록 정리해보겠습니다.

카카오 앱 생성하기

지난 번 다음 지도 API 포스팅에서 소개해드린 바와 같이 다음 카카오 API를 사용하려면 카카오 계정으로 회원 가입을 해야 합니다. 아래 이미지는 카카오 개발자센터 메인 페이지에서 로그인한 상태입니다.

화면 하단에 있는 앱 개발 시작하기 버튼을 클릭하면 아래와 같이 내 애플리케이션 페이지로 이동합니다. 이번 포스팅을 위해서 이것 저것 작업을 했더니 사용량이 좀 있습니다. 일별 한도가 최대 30,000건이므로 아직은 괜찮습니다.

화면 왼쪽에 있는 앱 만들기 버튼을 클릭하여 새로운 앱을 만들어보겠습니다. 기존에 있는 앱을 사용해도 무방하지만 저는 새로운 앱을 만드는 과정을 하나하나씩 보여드리고자 합니다. (생각해보니 제가 좀 친절하네요. 하하하)

아래 이미지와 같이 앱 만들기 화면으로 이동하면 아이콘, 앱 이름, 회사명 등 3가지 항목을 입력하셔야 합니다. 아이콘 없이 앱 이름과 회사명만 입력해도 앱 만들기는 가능하지만 아이콘을 추가해야 좋다고 팝업이 뜹니다. 그리고 기왕 만드는 거 아이콘 이미지를 추가하면 좋겠다 싶어서 알파벳 DSMU 만으로 로고 하나를 급조했습니다.[1]

앱 이름은 ‘로그인’, 회사명은 ’데싸밋업’으로 입력하고 앱 만들기 버튼을 클릭합니다. 이로써 필요한 앱 만들기는 완료되었습니다.

앱 만들기가 성공적으로 끝나면 아래 이미지와 같이 4가지 앱 키(App key) 값들을 출력합니다. 다른 사람에게 노출되면 안되므로 까맣게 지웠는데요. 여러분도 자신의 앱 키를 남에게 노출시키지 않도록 각별한 주의를 당부드립니다. 이 중에서 우리는 REST API 방식을 사용할 것이므로 두 번째에 있는 REST API 키만 복사하여 RStudio 환경설정(environ) 파일에 저장하시기 바랍니다.[2]

카카오톡으로 메시지를 전송하려면 카카오 계정 로그인을 거쳐야 합니다. 따라서 화면 왼쪽 가운데에서 아래쪽에 있는 사용자 관리 메뉴를 클릭하여 몇 가지 설정을 하도록 하겠습니다.

이동한 화면이 아래 이미지와는 다를 것입니다. 왼쪽 상단에 카카오 계정으로 로그인 ~ **으로 시작하는 문구 앞 버튼이 **OFF로 되어 있었을 겁니다. 그걸 클릭해서 ON으로 변경하면 아래와 같은 이미지가 뜹니다. 여기에서 해주어야 할 것은 중앙에 있는 수집목적에 사유를 적어주면 되는데요. 그냥 카카오톡 프로필 요청이라고 입력하고 저장하겠습니다.

이 과정이 필요한 이유는, 앞에서 언급한 바와 같이 카카오 계정으로 로그인을 해야 카카오톡을 사용할 수 있는 권한 키(authorize key)를 발급받을 수 있구요. 그리고 이 권한 키가 있어야 카카오톡 메시지를 보낼 때 사용할 수 있는 접속 키(access key)를 발급받을 수 있습니다. 접속 키는 사용 가능한 기간이 설정되어 있으므로 매번 필요할 때마다 재발급받아야 합니다. (벌써부터 귀찮습니다. ㅎㅎ)

수집목적까지 저장한 다음 해야 할 것은 접근권한 관리항목에 들어가 카카오톡 메시지 전송 항목을 추가하는 것입니다. 설정 버튼을 클릭하면 아래 이미지와 같은 팝업이 뜨는데요. 접근권한 관리항목으로 이동하여 카카오톡 메시지 전송 항목을 ON으로 변경합니다. 수집목적에는 카카오틀 메시지 전송을 입력하고 저장하면 됩니다.

마지막으로 해야 할 것은 로그인 Redirect URI를 입력하는 것입니다. 미리 말씀을 드리자면, 카카오 계정으로 로그인을 실행하면 캡챠 이미지 등으로 사용자 확인을 거친 후, 지금 입력하는 URI로 자동으로 이동하는데요. URI에 query string이 추가됩니다. 그러니까 ?code 파라미터가 생성되고 = 오른쪽으로 authorize key가 제공되는 것이죠. 아직 이해가 안될 겁니다. 이 부분은 나중에 다시 설명하기로 하고, 일단 살아있는 URI를 아래에 입력해야 합니다. 저는 마땅한 URI가 없어서 네이버 메인 페이지 URL을 입력했습니다. ^^

URI를 입력하고 저장 버튼을 클릭하면 아래와 같이 저장되었다는 안내가 뜹니다. 이제 앱 생성 및 설정이 모두 완료되었습니다.

일단 여기까지 잘 수행하셨다면, 이후 과정을 진행하기에 앞서 이번 포스팅의 범위에 대해 말씀드리고자 합니다. 이번 포스팅에 소개된 내용은 다음 카카오 API를 활용하여 R에서 ’나에게 텍스트 메시지’를 보내는 것입니다. 다른 사람들에게 메시지를 보내는 것도 할 수는 있겠지만 그 부분은 나중에 기회가 되면 추가하기로 하고, 이번 포스팅에서는 자신에게만 텍스트를 보내는 것입니다. 이 정도만 실행할 수 있으면 정기 작업을 완료한 다음 그 결과를 자신에게 통보하는 작업은 충분히 할 수 있을 것입니다. 다만 접속 키(access key)가 사용기간이 있으므로 정기적으로 재발급받아야 한다는 점이 조금 불편하겠네요.

RStudio에서 카카오톡 전송하기

가장 먼저 해야 할 것은 카카오 계정으로 로그인하여 권한 키(authroize key)를 받는 것입니다. 권한 키를 받아야 카카오톡 프로필을 받거나 나에게 메시지를 전송할 때 사용할 접속 키(access key)를 발급받을 수 있기 때문입니다.

권한 키를 받을 때 REST API 키를 파라미터 값으로 제공해야 합니다. 아래 코드를 살펴보시기 바랍니다. 먼저 필요한 패키지를 불러오겠습니다.

library(tidyverse)
library(httr)
library(jsonlite)

카카오 계정으로 로그인하기

카카오 개발자센터에서 사용자 관리 개발가이드를 확인하면 아래 코드에 관한 설명이 담겨 있습니다. 저는 이해하는데 많은 시간이 걸렸는데요. 개발자이신 분들은 금세 이해하실 수 있을 것입니다.

아무튼 개발가이드를 참조하여 카카오 계정으로 로그인할 때 필요한 항목들을 가져옵니다. 추가해주어야 할 파라미터로는 REST API KeyRedirect URI동의받을 항목 등입니다. 맨 처음 카카오 계정으로 로그인할 때 사용자가 설정해놓은 항목에 대한 사용자 동의를 받습니다. 우리가 이미 앱을 생성하는 과정에서 카카오 계정으로 로그인카카오톡 메시지 전송ON으로 변경한 바 있습니다. 그 두 가지에 대한 동의를 받으려면 아래 코드와 같이 파라미터로 추가합니다. 아래 코드에서 scope 인자와 할당된 값들을 확인하시기 바랍니다.

# 카카오 계정으로 로그인합니다. 
# 이 때, 카카오톡 프로필과 카카도톡 메시지 전송에 동의합니다. 
GET(url = 'https://kauth.kakao.com/oauth/authorize',
    query = list(client_id = Sys.getenv('KAKAO_LOGIN_API_KEY'), 
                 redirect_uri = 'https://www.naver.com', 
                 response_type = 'code',
                 scope = 'talk_message, profile')) -> res

위와 같이 HTTP Request를 실행하면 res 객체에 요청 URL(request url) 항목이 저장되는데요. 그 부분만 출력하여 복사한 다음 웹 브라우저 주소창에 붙여넣기하면 카카오 계정 로그인 화면으로 이동합니다.

사용자 동의하고, 권한 키 발급받기

# res 객체에 저장되어 있는 request url을 출력합니다. 
print(x = res$url)

res 객체의 요청 URL을 복사하여 웹 브라우저 주소창에 붙여넣고 엔터를 누르면 카카오 계정 로그인 화면으로 이동합니다. 로봇이 아닙니다 체크박스에 체크하고 로그인 버튼을 누릅니다. 간혹 캡챠 이미지가 팝업으로 뜨기도 합니다. 로그인에 성공하면 사용자 동의를 받는 과정이 진행됩니다. 즉, 아래 이미지와 같은 화면이 열립니다.

화면 상단에 있는 전체 동의하기를 선택한 다음 하단에 있는 동의하고 계속하기를 클릭합니다. 그러면 이번에는 Redirect URI로 입력했던 페이지가 열립니다. 우리는 이미 앞에서 Redirect URI 입력란에 https://www.naver.com을 입력한 바 있으므로 네이버 메인 페이지로 이동합니다. 그리고 URI 마지막 부분에 query string이 추가되는데 이 파라미터 값이 바로 권한 키(authorize key)입니다. 아래 이미지에서 확인하시기 바랍니다.

다음 카카오 API를 이용하면서 네이버 메인 페이지를 이용한다니 좀 짖궂은 면이 없지 않지만 포스팅을 재미있게 작성하려고 한 것입니다. Redirect URI에는 살아있는 사이트라면 어디든 가능할 것 같습니다. 주소창에서 물음표 뒷 부분을 주목하시기 바랍니다. code 파라미터에 할당된 값이 바로 권한 키(authorize key)이므로 이 부분을 복사하여 RStudio로 돌아옵니다.

접속 키 발급받기

# 권한 키(authorize key)를 설정합니다. 
auth <- '여기에 복사해온 권한 키를 붙여 넣습니다'

혹시나 해서 드리는 말씀이지만, 제가 auth‘여기에 복사해온 권한 키를 붙여 넣습니다’를 입력하도록 예시 코드를 작성했다고 해서 저 문장을 그대로 입력하면 정말 곤란합니다. 이렇게 입력해놓고 안된다고 하는 사람을 몇 번이나 본 적이 있었습니다. 반드시 웹 브라우저 주소창에 있는 파라미터 값을 복사해야 합니다.

# 접속 키(access key)를 발급받습니다.
GET(url = 'https://kauth.kakao.com/oauth/token',
    query = list(grant_type = 'authorization_code',
                 client_id = Sys.getenv('KAKAO_LOGIN_API_KEY'), 
                 redirect_uri = 'https://www.naver.com', 
                 code = auth)) -> res
# res 객체를 출력하여 HTTP Response 결과를 확인합니다. 
print(x = res)

res 객체를 출력하면 JSON 타입으로 데이터가 전송되었습니다. JSON 데이터만 추출하면 접속 키와 갱신 키 등을 받을 수 있습니다. 갱신 키는 접속 키의 사용기한이 만료되었을 때 접속 키를 재발급받는 과정에서 사용됩니다. 이번 예제에서는 다루지 않습니다만 어려운 코드가 아니므로 카카오 API 개발가이드를 참고하시기 바랍니다.

# res 객체에서 JSON 형태의 데이터만 추출하여 json에 할당합니다. 
res %>% 
  content(as = 'text') %>% 
  fromJSON() -> json

# json 객체에 있는 접속 키만 선택하여 access 객체에 할당합니다
json$access_token -> access

여기까지 잘 따라왔다면 준비 과정을 모두 무사히 마쳤습니다. 마지막으로 사용자의 카카오톡 프로필을 얻는 것과 나에게 메시지 보내는 방법에 대해 소개해드리겠습니다.

자신의 카카오톡 프로필 확인하기

카카오톡 프로필을 요청하는 방법은 간단합니다. GET 방식의 HTTP Request를 사용하는데, GET() 함수의 url 인자에 해당 URL을 할당합니다. 이 부분에 관한 설명은 카카오톡 개발가이드를 참고하시기 바랍니다.

# 카카오톡 프로필을 요청합니다.  
GET(url = 'https://kapi.kakao.com/v1/api/talk/profile', 
    add_headers(Authorization = str_c('Bearer ', access))) -> res

# res 객체를 출력하여 결과를 확인합니다. 
print(x = res)
## Response [https://kapi.kakao.com/v1/api/talk/profile]
##   Date: 2019-08-25 05:55
##   Status: 400
##   Content-Type: application/json;charset=UTF-8
##   Size: 60 B
# JSON 타입의 데이터만 추출합니다. 
res %>% content(as = 'text') %>% fromJSON()
## $msg
## [1] "access token should not be null or empty"
## 
## $code
## [1] -2

위 결과를 보면 카카오톡에 설정되어 있는 본인의 프로필을 확인할 수 있을 것입니다. 이 부분은 별 내용이 아니지만 접속 키를 제대로 발급받았는지 확인하는 용도로는 적당합니다. 접속 키를 정상적으로 발급받았다면 정상적으로 실행됩니다. 만약 원하는 결과를 얻지 못했다면 위로 올라가서 접속 키를 발급받는 과정을 다시 실행해보기 바랍니다.

나에게 메시지 보내기

이번 포스팅의 하이라이트입니다. 여기에서 가장 많은 시간이 소요되었는데요. 메시지를 보낼 때 사용되는 파라미터를 어떻게 작성해야 하는지 이해할 수 없었기 때문입니다. 다행하게도 박찬엽님의 도움을 받아 성공했습니다. 찬엽님 감사해요! ^^

카카오 API에서는 다양한 형태의 메시지 템플릿을 제공하고 있습니다만, 저는 간단한 텍스트 메시지를 보내는 것만 구현해보려고 합니다. 나머지 부분은 역시 개발가이드를 확인하시기 바랍니다.

# 전솔할 텍스트 템플릿을 조립합니다. 
text <- '{
  "object_type" : "text",
  "text" : "이거 정말 더럽게 어렵다!!",
  "link" : {
    "web_url" : "https://mrkevinna.github.io", 
    "mobile_web_url" : "https://mrkevinna.github.io"
  },
  "button_title" : "Check it out!"
}'

위와 같이 전송할 템플릿을 설정해주어야 합니다. 저는 이 부분이 JSON 형태로 되어 있길래 데이터프레임으로 만들어서 JSON 타입으로 변환하면 되겠다 싶었는데요. 그게 안 되어서 무슨 문제가 있는지 찾느라 하루 종일 걸렸습니다. 하하하

아무튼 위와 같이 중괄호를 열고, 파라미터명과 파라미터값을 콜론(:)으로 연결해주면 됩니다. 마치 파이썬의 딕셔너리처럼요. link 파라미터에는 web_urlmobile_web_url을 입력할 수 있는데요. 그냥 ’{}’처럼 빈 값을 넣어도 됩니다. button_title도 마찬가지이구요.

텍스트 템플릿을 작성했다면 이제 나에게 메시지 보내기를 실행할 차례입니다. 이번 포스팅의 마지막 부분이 되겠습니다.

# 텍스트 템플릿 보내기 
POST(url = 'https://kapi.kakao.com/v2/api/talk/memo/default/send', 
     add_headers(Authorization = str_c('Bearer ', access)),
     body = list(template_object = text),
     encode = 'form') 

메시지 전송은 POST 방식이 사용되므로 POST() 함수에 관련 항목들을 할당하면 됩니다. 눈여겨 봐야 할 부분은 body 인자에 텍스트 템플릿을 할당해주는 것이고, encode 인자에는 ’form’을 지정한다는 것입니다. JSON 타입이 아니고 문자열(string)이어서 그런 것인지 아니면 R에서 JSON 타입이 정상적으로 작동하지 않는 것인지 잘 모르겠습니다. 아무튼 위 코드를 실행하면 아래와 같이 저의 카카오톡에 메시지가 전송됩니다.

사실 이번 포스팅은 패스트캠퍼스에 새로운 강의를 준비하는 과정에서 기획된 것을 정리한 것입니다. 그런데 실제로 완성을 하고 보니 텔레그램을 사용하는 것이 훨씬 쉽고 편리합니다. 사람마다 생각의 차이가 있겠지만, 저는 여기에서 마무리할 것 같습니다.

궁금하신 점이 있으시면 댓글로 올려주세요. 끝까지 읽어주셔서 감사합니다!

  1. DSMU는 ’Data Science Meet Up’의 머리글자로 제가 방금 만든 것입니다.

  2. 이 방법은 지난 포스팅에 소개해드렸으므로 참고하시기 바랍니다.

Written on August 25, 2019