Naver Cloud Platform

NCP API 활용 - Sens로 메세지 보내기(Python) - 파이썬 초보 #2

앙뚱이 2022. 9. 1. 18:16

저는 어떤 소스를 짜려는 건지 상세히 말씀드리면

 

## 수신번호와 메세지 내용을 input값으로 받기 -> 해당 번호로 SENS로 메세지를 보내기 -> 결과 확인 

 

 

일단 코드 작성하기에 앞서 NCP 콘솔에서 몇 가지 정보를 가져와야 합니다.

필요 정보

- 인증키 (Secret Key, Access key ) : NCP 포탈 -> 마이페이지 -> 계정관리 -> 인증키 관리

- 서비스 ID : NCP 콘솔 -> SENS -> 프로젝트 -> 서비스 ID

우측 하단에 서비스 ID 클릭
인증키

위와 같이 정보들은 가져오면 되구요

 

NCP에서는 HTTP 방식의 GET/POST 메서드 호출을 통해서 이용할 수 있습니다. 

 

NCP API 가이드에 따르면 

일단 인증을 위한 시그니처(signature)를 생성해야 하는데요

NCP에서는 친절하게 언어별로 시그니처 함수를 제공을 하고 있습니다. 

아래는 파이썬이지만 JAVA, JavaScript, bash 등등 제공하고 있습니다. 

 

저는 NCP 시그니처 생성 코드를 참조하여 아래와 같이 메세지 전송 코드를 작성하였습니다.

 

TimeStamp 생성

timestamp=int(time.time() * 1000)
timestamp=str(timestamp)

 

time 모듈의 time 함수로 현재 시간을 받아와

str타입으로 변환하였습니다.

 

인증키 및 API URL 변수 저장

access_key = "61333AF6D155D344EC0C"	
secret_key = "167F40743C5D1DD887E1BFE642312D224AE3E5EA"			

url="https://sens.apigw.ntruss.com"
uri="/sms/v2/services/ncp:sms:kr:263338482537:jyp-hello-project/messages"

아까 가져온 인증키, Secret키를 변수에 저장하고

NCP API 가이드에 따른 요청 URL과 서비스 ID를 변수에 저장합니다.

 

 

Input 값 저장

number=input("번호를 입력하세요 : ")
contents=input("메세지를 쓰시오 : \n")

수신번호와 메세지 내용을 인풋값으로 받아와 변수에 저장합니다.

 

시그니처 생성 함수

def	make_signature():
	global secret_key
	global access_key
	global timestamp
	global url
	global uri
	secret_key = bytes(secret_key, 'UTF-8')
	method = "POST"
	message = method + " " + uri + "\n" + timestamp + "\n" + access_key
	message = bytes(message, 'UTF-8')
	signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
	return signingKey

NCP API 가이드에 있는 시그니처 생성 함수를 고대로 넣어줍니다.

 

JSON 요청 헤더 작성

header = {

"Content-Type": "application/json; charset=utf-8",
"x-ncp-apigw-timestamp": timestamp, 
"x-ncp-iam-access-key": access_key,
"x-ncp-apigw-signature-v2": make_signature()
}

다음과 같이 NCP 가이드에 따라 json 형식으로 요청 헤더를 작성합니다.

 

JSON 요청 바디 작성

data = {
    "type":"SMS",
    "from":"핸드폰 발신 번호",
    "content":contents,
	"subject":"SENS",
    "messages":[
        {
            "to":number,
        }
    ]
}

위와 같이 Json 요청 바디에 입력받은 핸드폰 번호와 메세지 내용을 담은 변수를 넣어줍니다.

NCP의 API 가이드에 따른 요청 바디의 파라미터는 아래와 같습니다. 

 

Request.Post로 요청

res = requests.post(url+uri,headers=header,data=json.dumps(data))

request모듈로 method를 post 방식으로 하여 url과 header을 넣어줍니다.

그리고 요청 바디 부분을 Data란 변수에 파이썬 객체를 json.dumps() 메소드를 이용하여 json 문자열로 변환하여 넣어줍니다.  - json.dumps() = 파이선 객체 -> json 문자열로 변환

그리고 res라는 변수에는 응답 body를 저장합니다.

 

응답온 JSON 문자열을 Python 객체로 변환

datas=json.loads(res.text)

json.loads() 함수는 json 문자열을 파이선 객체로 변환해줍니다.

이 과정을 하는 이유는 응답 Parameter를 읽어서 파이썬 변수에 저장하기 위함입니다.

 

Request ID 값 저장 및 상태 Print

reid=datas['requestId']

print("메시지 전송 상태")
print(res.text+"\n")

Datas에 requestID 값을 저장하고 Response를 출력하는 부분입니다.

requestID 값을 저장하는 이유는~ 아래 그림과 같이 메시지 발송 요청 조회를 할때 requestID 값이 필수적이기 떄문이죠.

mandatory는 무조건 넣어햐 하는 파라미터값입니다.

 

SMS 보내기 전체 소스

import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json


timestamp=int(time.time() * 1000)
timestamp=str(timestamp)

access_key = "accesskey"				# access key id (from portal or Sub Account)
secret_key = "secretkey"				# secret key (from portal or Sub Account)

url="https://sens.apigw.ntruss.com"
uri="/sms/v2/services/서비스ID/messages"
number=input("번호를 입력하세요 : ")
contents=input("메세지를 쓰시오 : \n")

def	make_signature():
	global secret_key
	global access_key
	global timestamp
	global url
	global uri
	secret_key = bytes(secret_key, 'UTF-8')
	method = "POST"
	message = method + " " + uri + "\n" + timestamp + "\n" + access_key
	message = bytes(message, 'UTF-8')
	signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
	return signingKey


header = {

"Content-Type": "application/json; charset=utf-8",
"x-ncp-apigw-timestamp": timestamp, 
"x-ncp-iam-access-key": access_key,
"x-ncp-apigw-signature-v2": make_signature()
}


data = {
    "type":"SMS",
    "from":"수신 번호",
    "content":contents,
	"subject":"SENS",
    "messages":[
        {
            "to":number,
        }
    ]
}


res = requests.post(url+uri,headers=header,data=json.dumps(data))
datas=json.loads(res.text)
reid=datas['requestId']

print("메시지 전송 상태")
print(res.text+"\n")

 

이어서 2가지를 더 코딩할 건데요.

정리하자면 지금은 SMS 보내기를 작성한 것이고 그 다음으론 

발송 요청 조회와 발송 결과 조회를 작성할 것입니다.

SMS 보내기 -> 발송 요청 조회 -> 발송 결과 조회

 

소스 짜보는 게 처음이라 많이 미숙해서 피드백 주시면 너무너무 감사할 것 같습니다

학교다닐 때 코딩할 때 교수님이 무슨 반드시 지키면 좋은 규칙?

막 그런 것들도 알려주셨던 것 같은데 지금은 다 까먹었네요.

 

일단 긴글 읽어주셔서 감사하구요.

다음 장에선 발송 요청 조회, 그리고 발송 결과 조회에 대해 글을 써보도록 하겠습니다.

감사합니다.