카카오톡 REST API 사용해서 나에게 메세지 보내기

댓글수5 다음블로그 이동

프로그래밍

카카오톡 REST API 사용해서 나에게 메세지 보내기

주넥
댓글수5


카카오톡으로 메세지를 전송하는 프로그램을 작성해 볼려고 이것저것 구글링을 해서 시도해봤다.

카카오톡의 경우 "나에게 메세지 보내기" API가 있다. 

이를 이용해 보기로 했다.


1. 메세지를 전송할 앱 생성


https://developers.kakao.com/ 들어가서 앱을 생성한다. 앱 종류는 모바일앱이 아닌 웹으로 한다.


앱이 생성이 되면 내 어플리케이션아래 앱이름을 선택해 보면 앱정보애 앱키표시를 누르면 앱키가 나온다.

앱키들 중에 REST API 키를 사용한다.





2. REST API 키를 이용해서 REFRESH TOKEN얻기 


카카오톡에 메세지를 보낼려면 API사용에 대한 ACCESS TOKEN이 필요하다. ACCESS TOKEN은 한번 발급 받으면 일정 시간 지나면 쓸 수 없기에 메세지 보낼때 마다 REFRESH TOKEN을 이용해서 다시 ACCESS TOKEN을 받아서 이용하는 것이 안전하다.


REFRESH TOKEN을 받을려면 간단하게 Web Server 를 하나 돌려사 카카오톡쪽 서버의 메세지를 받을 사용자 카카오 계정 로그인 페이지로 리다이렉트 하도록 하면,로그인이 완료되면 응답으로 세션 code값을 돌려준다. 이 code값을 이용해서 다시 REST API를 통해 ACCESS TOKEN과 REFRESH TOKEN을 발급 받을 수 있다.


응답을 받을 PAGE URL을 아래와 같이 설정해두어야 한다.

사이트 도메인을  http://localhost:5000 로 하고,

Redirect Path를  /oauth 로 하면

http://localhost:5000/oauth 로 REFRESH TOKEN이 온다.



아래는 REFRESH TOKEN을 얻을 낼 웹페이지 이다.

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>index</title>

</head>

<body>

<a href="https://kauth.kakao.com/oauth/authorize?client_id=YOUR_REST_API_KEY&redirect_uri=http://localhost:5000/oauth&response_type=code&scope=talk_message">

    Kakao login

</a>

</body>

</head>

</html>


위에 것을 templates/index.html 파일로 저장하고, python 으로 아래와 같이 작성된 Web. Server 프로그램을 실행시킨다.
Python용 웹서버 모듈은 Flask는 5000 port를 기본으로 웹포트로 기동한다.
#!/usr/bin/python
from flask import Flask, render_template, redirect, url_for, request
import requests
import json
app = Flask(__name__)

@app.route('/')
def index() :
    return render_template('index.html')

@app.route('/oauth')
def oauth():
    code = str(request.args.get('code'))
    resToken = getAccessToken("XXXXXXXXXXXXXXXXXXXXXXX",str(code))  #XXXXXXXXX 자리에 RESET API KEY값을 사용
    return 'code=' + str(code) + '<br/>response for token=' + str(resToken)

def getAccessToken(clientId, code) :  # 세션 코드값 code 를 이용해서 ACESS TOKEN과 REFRESH TOKEN을 발급 받음
    url = "https://kauth.kakao.com/oauth/token"
    payload = "grant_type=authorization_code"
    payload += "&client_id=" + clientId
    payload += "&redirect_url=http%3A%2F%2Flocalhost%3A5000%2Foauth&code=" + code
    headers = {
        'Content-Type' : "application/x-www-form-urlencoded",
        'Cache-Control' : "no-cache",
    }
    reponse = requests.request("POST",url,data=payload, headers=headers)
    access_token = json.loads(((reponse.text).encode('utf-8')))
    return access_token

if __name__ == '__main__' :
    app.run(debug = True)



위의 서버 실행후 동일 컴에서 브라우저로 http://localhost:5000 을 브라우징 하면

Kakao login 가 보인다. 이중 Kakao login 을 해본다.

그럼 아래와 같이 브라우징 된다.

아래에서 ZZZZZZZZZZZZZZZZZZZ 에 해당하는 문자열이 REFRESH TOKEN이 된다.

code=XXXXXXXXXXXXXXXXXXXXXX

response for token={u'access_token': u'YYYYYYYYYYYYYYYY', u'refresh_token_expires_in': 2591999, u'expires_in': 21599, u'token_type': u'bearer', u'scope': u'talk_message profile', u'refresh_token': u'ZZZZZZZZZZZZZZZZZZZZZ'}


그리고, 위에 index.html 코드를 보면 Kakao login 요청시 ACCESS TOKEN과 REFRESH TOKEN을 요청할 뿐 아니라,

scope=talk_message 로 "나에게 메세지 보내기" 에 대한 허가 요청도 하였다. 이 허가 요청이 없으면 "나에게 메세지 보내기"시 에러가 난다.


3. 카카오톡으로 메세지 보내기


아래 Python 프로그램은 카카오톡으로 메세지를 보내는 예제이다.

메세지 받을 사람의 REFRESH TOKEN을 위의 설명을 이용해서 얻어내면 해당 사람에게 메세지를 보낼 수 있다.

카카오톡 개발자 사이트에서 REST API 설명 페이지들을 보면 나에게 보내기 API로 보낼 수 있는 메세지 유형이 있는데, 

아래는 이중 제일 단순한 유형이다.

#!/usr/bin/python

# -*- coding: utf-8 -*-

import requests

import urllib

import json


def getAccessToken(refreshToken) :

    url = "https://kauth.kakao.com/oauth/token"

    payload = "grant_type=refresh_token&client_id=YOUR_REST_API_KEY&refresh_token=" + refreshToken

    headers = {

        'Content-Type' : "application/x-www-form-urlencoded",

        'Cache-Control' : "no-cache",

    }

    reponse = requests.request("POST",url,data=payload, headers=headers)

    access_token = json.loads(((reponse.text).encode('utf-8')))

    return access_token


def sendText(accessToken) :

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

    payloadDict = dict({

            "object_type" : "text",

            "text" :u"이것은 테스트".encode("utf-8"),

            "link" : {

                "web_url" : "http://yourwebsite.for.pc",

                "mobile_web_url" : "http://yourwebsite.for.mobile"

             },

            "button_title" : u"방문".encode("utf-8"),

            })

    payload = 'template_object=' + str(json.dumps(payloadDict))

    print payload

    headers = {

        'Content-Type' : "application/x-www-form-urlencoded",

        'Cache-Control' : "no-cache",

        'Authorization' : "Bearer " + accessToken,

    }

    reponse = requests.request("POST",url,data=payload, headers=headers)

    access_token = json.loads(((reponse.text).encode('utf-8')))

    return access_token


result =  getAccessToken("RECEIVER_REFRESH_KEY" # 메세지 받을 사람의 REFRESH TOKEN 이용

print result['access_token']

print sendText(result['access_token'])



이렇게해서 메세지를 보낼수는 있는데,아쉽게도 폰에서 알림이 뜨지 않는다.

카카오 정책상 나에게 보내는 메세지는 알림이 뜨지 않는다고 한다. ㅠㅠ

https://devtalk.kakao.com/t/api/28495

정작 필요했던 것은 알림이었는데, 이럴수가...  OTL


맨위로

https://blog.daum.net/junek69/79

신고하기