멋쟁이 사자처럼 at 한국교통대학교 7기

2019 KNUT X LIKE LION #7

oauth() 수정

토픽 멋쟁이 사자처럼 at 한국교통대학교 7기 > 웹 애플리케이션 개발 > Django
oauth() 수정

  • curl에서 성공하였으니 이제 oauth()에서 코드를 수정하여 메시지가 보내질 수 있도록 해봅시다.

 

 

  • 우리는 이 데이터를 요청하기 위해 'requests' 패키지의 request() 함수를 이용할 것입니다.
  • request() 함수는 다음과 같은 사항들을 요구합니다.
  • 1) method
  • 2) uri
  • 3) 기타 인자

 

  • 문서에 적혀있는대로 함수를 구성하면 됩니다.
  • method : 'POST'
  • uri : 'https://kapi.kakao.com/v2/api/talk/memo/default/send'
  • 기타 인자 : curl에서 유추해보았을 때, -H는 'header'입니다. -d는 'data'입니다.
     
  • 이를 토대로 구성하기 위해서는 'data' 부분(template_object)을 수정하여 줍시다.
template_dict_data = str({
    "object_type": "feed",
    "content": {
        "title": "디저트 사진",
        "description": "아메리카노, 빵, 케익",
        "image_url": "http://mud-kage.kakao.co.kr/dn/NTmhS/btqfEUdFAUf/FjKzkZsnoeE4o19klTOVI1/openlink_640x640s.jpg",
        "image_width": 640,
        "image_height": 640,
        "link": {
            "web_url": "http://www.daum.net",
            "mobile_web_url": "http://m.daum.net",
            "android_execution_params": "contentId=100",
            "ios_execution_params": "contentId=100"
        }
    },
    "social": {
        "like_count": 100,
        "comment_count": 200,
        "shared_count": 300,
        "view_count": 400,
        "subscriber_count": 500
    },
    "buttons": [
        {
            "title": "웹으로 이동",
            "link": {
                "web_url": "http://www.daum.net",
                "mobile_web_url": "http://m.daum.net"
            }
        },
        {
            "title": "앱으로 이동",
            "link": {
                "android_execution_params": "contentId=100",
                "ios_execution_params": "contentId=100"
            }
        }
    ]
})

 

 

 

 

data -> JSON

  • 앞에서 생성한 'data'는 JSON 형태와 유사한 것이지 똑같은 것은 아닙니다.
  • 또한 이 형태를 URI상으로 요청할 수 없으므로 JSON 데이터 형태로 변환하는 작업이 필요합니다.
  • 이를 위해 'json'을 import합니다.
import json

 

  • 그리고 다음과 같이 json.dumps() 함수를 사용하면 딕셔너리를 JSON 데이터 형태로 바꾸어 줍니다.
json.dumps(template_dict_data)

 

 

  • 이제 최종적으로 'template_object' 변수와 함께 보내야 되므로 문자열을 구성합니다.

 

 

 

 

마무리 작업

  • 데이터에 대한 작업은 끝냈으니, 요청할 uri 변수와 'header'만 구성하면 됩니다.

 

  • 먼저 요청할 uri 변수를 생성합니다.
kakao_to_me_uri = 'https://kapi.kakao.com/v2/api/talk/memo/default/send'

 

  • header를 구성합니다.
  • 위에서 얻어온 'access_token'과 함께 구성합니다.
  • 'Content-Type'은 여러 종류가 있지만 지금은 'template_object='와 같이 '키=값'의 형태로 전달해야 되고, POST로 전송하므로 'application/x-www-form-urlencoded' 타입을 사용합니다.
  • POST로 데이터를 전송할 때 이전에 'multipart/form-data'를 사용한 적이 있었는데, 이는 파일의 형태가 포함될 경우에 사용합니다.
headers = {
    'Content-Type': "application/x-www-form-urlencoded",
    'Authorization': "Bearer " + access_token,
}

 

 

  • 이제 최종적으로 request() 함수를 사용합니다.
    마지막에는 응답을 JSON 형태로 받아서 제대로 응답이 왔는지 확인합니다.
  • 153번 라인에서는 'template_json_data'는 print()로 출력해보면 ""로 감싸고 있으므로 이를 없애줍니다.
  • 154번 라인에서는 'template_json_data'를 JSON 데이터 형태로 인식시키기 위한 작업입니다.
    JSON 데이터는 키 값이 ''로 감싸고 있는 것이 아니라 ""로 감싸고 있기 때문입니다.
template_json_data = template_json_data.replace("\"", "")
template_json_data = template_json_data.replace("'", "\"")

response = requests.request(method="POST", url=kakao_to_me_uri, data=template_json_data, headers=headers)
print(response.json())

 

 

 

 

 

적용 확인

  • 서버를 구동하고 적용되었는지 확인합니다.
  • 'result_code' 값이 0이 나오면 정상적으로 실행된 것입니다.

 

  • 카카오톡에서 확인해보면 나 자신에게 메시지가 온 것을 확인할 수 있습니다.

 

 

 

 

 

댓글

댓글 본문
  1. 한호현
    문제는 해결되었습니다.
    다시 이전 토픽으로 돌아가 한번 더 해보니 정상 전송이 되었습니다.
    하지만 우연찮게 된거라 다음에 동일하게 생길 문제를 위해 해결방안을 알고싶습니다.
    혹시 알고계신다면 알려주시면 감사하겠습니다.
  2. 한호현
    혹시 한가지 여쭤봐도 될까요?
    여기서 알려주신대로 했는데 메세지 두개가 한꺼번에 오는데
    일단 두 메세지 모두 사진은 제대로 출력이 됩니다.
    그리고 차이점으로 첫번째 메세지는 글씨가 똑같이 출력이 되었고
    두번째 메세지는 외계어로 출력이 됩니다.

    이것에 대한 해결방안이 무엇인지 알 수 있을까요?
    답변 달아주시면 감사하겠습니다.