카카오톡 API 사용 절차

카카오톡 API를 이용해 메세지를 보내기 위해서는 다음과 같은 절차가 필요하다.

1) 인가 코드 받기

2) 토큰 받기

3) 사용자 로그인 처리

 

개발자 페이지 Docs 문서를 참고하여 REST API 작성방식을 이해하고 Go 언어를 이용해 코드를 작성해보자.

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

 

Kakao Developers

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

developers.kakao.com

 

카카오톡 API 인가 코드 발급

인가 코드 발급을 위해선 아래 세 가지 값이 필요하다. 

1) 개발자 계정 로그인 쿠키(_kawlt)

2) REST API Key

3) REDIRECT URI

 

먼저 카카오 개발자 계정에서 API Key와 Redirect URI를 확인하고, 로그인된 상태에서 개발자 도구를 이용하여 로그인 쿠키 값을 확인해야 한다.

 

필요한 값을 확인 후 인가 코드 획득 코드를 작성해보자.

package main

import (
	"net/http"
)

// 카카오톡 로그인 및 토근 발급에 필요한 변수
var REST_API_KEY = "{에플리케이션 REST_API_KEY 값}"
var REDIRECT_URI = "{에플리케이션 REDIRECT_URI 값}"

// 카카오톡 로그인 세션 값 : 개발자 계정 로그인 쿠키 값 수동입력
var _kawlt = "_kawlt={개발자 계정 로그인 쿠키 값}"
var AUTHORIZE_CODE string

// 카카오톡 API 인가 코드 생성함수
func kakao_login_auth() {

	// 카카오톡 API 이용하여 로그인 인가코드 획득 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kauth.kakao.com/oauth/authorize?client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&response_type=code", nil)

	// 리퀘스트에 카카오톡 로그인 세션 헤더 추가
	req.Header.Add("Cookie", _kawlt)

	// 리퀘스트 실행
	client := &http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse // 자동 리다이렉트 하지 않음
		},
	}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 302, Location 헤더에서 AUTHORIZE_CODE 값 추출 및 변수에 저장
	println(resp.Header.Get("Location"))

	AUTHORIZE_CODE = resp.Header.Get("Location")[31:]
	println(AUTHORIZE_CODE)
}

// 메인 함수
func main() {
	kakao_login_auth()
}

 

코드를 실행하면 다음과 같이 Location 헤더 값으로 응답받는 엑세스 토큰 값을 획득하여 AUTHORIZE_CODE 변수에 저장하고 값이 출력된다.

 

카카오톡 API 액세스 토큰 발급

위 kakao_login_auth() 함수를 통해 확인한 인가 코드를 이용하여 액세스 토큰을 생성하는 코드를 작성한다.

package main

import (
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

// 카카오톡 로그인 및 토근 발급에 필요한 변수
var REST_API_KEY = "{에플리케이션 REST_API_KEY 값}"
var REDIRECT_URI = "{에플리케이션 REDIRECT_URI 값}"

// 카카오톡 로그인 세션 값 : 개발자 계정 로그인 쿠키 값 수동입력
var _kawlt = "_kawlt={개발자 계정 로그인 쿠키 값}"
var AUTHORIZE_CODE string
var ACCESS_TOKEN string

// 카카오톡 API 인가 코드 생성함수
func kakao_login_auth() {

	// 카카오톡 API 이용하여 로그인 인가코드 획득 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kauth.kakao.com/oauth/authorize?client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&response_type=code", nil)

	// 리퀘스트에 카카오톡 로그인 세션 헤더 추가
	req.Header.Add("Cookie", _kawlt)

	// 리퀘스트 실행
	client := &http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse // 자동 리다이렉트 하지 않음
		},
	}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 302, Location 헤더에서 AUTHORIZE_CODE 값 추출 및 변수에 저장
	AUTHORIZE_CODE = resp.Header.Get("Location")[31:]
}

// 카카오톡 API 엑세스 토큰 생성함수
func kakao_login_token() {

	// POST Param 변수 작성
	params := url.Values{}
	params.Add("grant_type", "authorization_code")
	params.Add("client_id", REST_API_KEY)
	params.Add("redirect_uri", REDIRECT_URI)
	params.Add("code", AUTHORIZE_CODE)

	// 엑세스 토큰 요청(POST) 수행
	resp, _ := http.PostForm("https://kauth.kakao.com/oauth/token", params)
	defer resp.Body.Close()

	// HTTP 요청 응답 값 문자열로 저장
	body, _ := ioutil.ReadAll(resp.Body)
	bodyString := string(body)

	// ACCESS_TOKEN 값 추출 및 변수에 값 저장
	println(bodyString)

	slice := strings.Split(bodyString, `"`)
	ACCESS_TOKEN = slice[3]
	println(ACCESS_TOKEN)
}

// 메인 함수
func main() {
	kakao_login_auth()
	kakao_login_token()
}

 

위 kakao_login_token() 함수를 실행하면 POST 요청에 대한 응답에서 액세스 토큰 값을 확인할 수 있다.

 

카카오톡 API 사용자 로그인 처리

 kakao_login_token() 함수로 확인한 액세스 토큰을 활용하여 사용자의 친구 목록을 불러오는 코드를 작성해보자.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

// 카카오톡 로그인 및 토근 발급에 필요한 변수
var REST_API_KEY = "{에플리케이션 REST_API_KEY 값}"
var REDIRECT_URI = "{에플리케이션 REDIRECT_URI 값}"

// 카카오톡 로그인 세션 값 : 개발자 계정 로그인 쿠키 값 수동입력
var _kawlt = "_kawlt={개발자 계정 로그인 쿠키 값}"
var AUTHORIZE_CODE string
var ACCESS_TOKEN string

// 카카오톡 API 인가 코드 생성함수
func kakao_login_auth() {

	// 카카오톡 API 이용하여 로그인 인가코드 획득 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kauth.kakao.com/oauth/authorize?client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&response_type=code", nil)

	// 리퀘스트에 카카오톡 로그인 세션 헤더 추가
	req.Header.Add("Cookie", _kawlt)

	// 리퀘스트 실행
	client := &http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse // 자동 리다이렉트 하지 않음
		},
	}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 302, Location 헤더에서 AUTHORIZE_CODE 값 추출 및 변수에 저장
	AUTHORIZE_CODE = resp.Header.Get("Location")[31:]
}

// 카카오톡 API 엑세스 토큰 생성함수
func kakao_login_token() {

	// POST Param 변수 작성
	params := url.Values{}
	params.Add("grant_type", "authorization_code")
	params.Add("client_id", REST_API_KEY)
	params.Add("redirect_uri", REDIRECT_URI)
	params.Add("code", AUTHORIZE_CODE)

	// 엑세스 토큰 요청(POST) 수행
	resp, _ := http.PostForm("https://kauth.kakao.com/oauth/token", params)
	defer resp.Body.Close()

	// HTTP 요청 응답 값 문자열로 저장
	body, _ := ioutil.ReadAll(resp.Body)
	bodyString := string(body)

	// ACCESS_TOKEN 값 추출 및 변수에 값 저장
	slice := strings.Split(bodyString, `"`)
	ACCESS_TOKEN = slice[3]
}

// 카카오톡 API 친구 목록 가져오기
func kakao_friend_list() {

	// 카카오톡 API 이용하여 친구목록 가져오기 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kapi.kakao.com/v1/api/talk/friends", nil)

	// 리퀘스트에 엑세스 토큰 헤더 추가
	req.Header.Add("Authorization", "Bearer "+ACCESS_TOKEN)

	// 리퀘스트 실행
	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 친구 정보 출력
	data, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("%s\n", string(data))
}

// 메인 함수
func main() {
	kakao_login_auth()
	kakao_login_token()
	kakao_friend_list()
}

 

kakao_friend_list() 함수를 실행하면 현재 카카오 개발자 계정의 친구 목록 및 정보를 출력한다. 여기서 uuid 값은 메세지를 전송할 때 친구를 식별하는 값으로 기억해두자.

 

카카오톡 API 친구에게 메세지 보내기

모든 준비가 끝났다. 이제 액세스 토큰과 친구 식별 번호(uuid)를 이용하여 친구에게 메세지를 보내보자.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

// 카카오톡 로그인 및 토근 발급에 필요한 변수
var REST_API_KEY = "{에플리케이션 REST_API_KEY 값}"
var REDIRECT_URI = "{에플리케이션 REDIRECT_URI 값}"

// 카카오톡 로그인 세션 값 : 개발자 계정 로그인 쿠키 값 수동입력
var _kawlt = "_kawlt={개발자 계정 로그인 쿠키 값}"
var AUTHORIZE_CODE string
var ACCESS_TOKEN string

// 카카오톡 API 인가 코드 생성함수
func kakao_login_auth() {

	// 카카오톡 API 이용하여 로그인 인가코드 획득 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kauth.kakao.com/oauth/authorize?client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&response_type=code", nil)

	// 리퀘스트에 카카오톡 로그인 세션 헤더 추가
	req.Header.Add("Cookie", _kawlt)

	// 리퀘스트 실행
	client := &http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse // 자동 리다이렉트 하지 않음
		},
	}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 302, Location 헤더에서 AUTHORIZE_CODE 값 추출 및 변수에 저장
	AUTHORIZE_CODE = resp.Header.Get("Location")[31:]
}

// 카카오톡 API 엑세스 토큰 생성함수
func kakao_login_token() {

	// POST Param 변수 작성
	params := url.Values{}
	params.Add("grant_type", "authorization_code")
	params.Add("client_id", REST_API_KEY)
	params.Add("redirect_uri", REDIRECT_URI)
	params.Add("code", AUTHORIZE_CODE)

	// 엑세스 토큰 요청(POST) 수행
	resp, _ := http.PostForm("https://kauth.kakao.com/oauth/token", params)
	defer resp.Body.Close()

	// HTTP 요청 응답 값 문자열로 저장
	body, _ := ioutil.ReadAll(resp.Body)
	bodyString := string(body)

	// ACCESS_TOKEN 값 추출 및 변수에 값 저장
	slice := strings.Split(bodyString, `"`)
	ACCESS_TOKEN = slice[3]
}

// 카카오톡 API 친구 목록 가져오기
func kakao_friend_list() {

	// 카카오톡 API 이용하여 친구목록 가져오기 리퀘스트 생성
	req, _ := http.NewRequest("GET", "https://kapi.kakao.com/v1/api/talk/friends", nil)

	// 리퀘스트에 엑세스 토큰 헤더 추가
	req.Header.Add("Authorization", "Bearer "+ACCESS_TOKEN)

	// 리퀘스트 실행
	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 친구 정보 출력
	// data, _ := ioutil.ReadAll(resp.Body)
	// fmt.Printf("%s\n", string(data))
}

// 카카오톡 API 친구에게 메세지 보내기
func kakao_send_friend_message() {

	// POST Param 변수 작성
	params := url.Values{}
	params.Add("receiver_uuids", `["친구 식별번호(uuid) 값"]`)
    // 예시 참고 params.Add("receiver_uuids", `["KRso------------------------------"]`) 예시 참고 
	params.Add("template_object", `{"object_type": "text", "text": "Message send success!!", "link": {"web_url": "www.naver.com"}}`)

	// 카카오톡 API 이용하여 메세지 전송 리퀘스트 생성
	req, _ := http.NewRequest("POST", "https://kapi.kakao.com/v1/api/talk/friends/message/default/send", strings.NewReader(params.Encode()))

	// 컨텐츠 타입 헤더 추가
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

	// 엑세스 토큰 헤더 추가
	req.Header.Add("Authorization", "Bearer "+ACCESS_TOKEN)

	// 리퀘스트 실행
	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	// 리퀘스트 결과 출력
	data, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("%s\n", string(data))
}

// 메인 함수
func main() {
	kakao_login_auth()
	kakao_login_token()
	kakao_friend_list()
	kakao_send_friend_message()
}

 

kakao_send_friend_message() 함수를 실행하고 나면 메세지 전송 결과를 보여준다.

 

친구의 카카오톡 메신저에서 메세지가 정상 전달된 것을 확인할 수 있다.

 

Go 언어로 카카오톡 API를 이용하여 메세지 전송하기 끝

'개발 > Go' 카테고리의 다른 글

Golang으로 카카오톡 메신저 보내기 1장  (0) 2022.10.31
복사했습니다!