본문 바로가기

Web/Flask

[Flask] 자동 문자 발송 API 사용하기(네이버 클라우드 플랫폼)

예약 페이지 프로젝트에 예약이 승인되면 자동으로 문자로 알림이 가게 하는 기능을 넣고 싶었다. 문자 발송 API를 제공하는 많은 업체들이 있는데 나는 그 중 네이버 클라우드 플랫폼을 이용해보았다.

 

https://blog.naver.com/kimnr123/221681654984

 

[파이썬] 문자 발송 시스템 API 이용해보다 with 네이버 클라우드 플랫폼 상품 :SENS

지난번에 파이썬으로 Json을 다루는 방법을 정리했었는데요이번에는 그럼 API를 다루는 방법을 정리해...

blog.naver.com

이분 블로그를 많이 참고했다.


1. 네이버 클라우드 플랫폼 가입 및 API 인증키 생성

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

일단 네이버 클라우드 플랫폼에 가입한다. 가입 후 결제수단도 등록한다.

 

마이페이지-계정관리-인증키 관리에 들어가서 신규 API 인증키를 생성한다.

여기서 Access Key ID와 Secret Key가 나중에 쓰일 것이다.


2. SENS(Simple & Easy Notification Service) 신청 및 프로젝트 생성

문자 발송 서비스는 Simple & Easy Notification Sevice에 해당한다.(SMS 뿐만 아니라 카카오톡 알림톡 등의 알림 기능도 제공) SMS는 월 50건까지 무료로 발송할 수 있다. 어차피 연습용으로 하는 프로젝트라 50건이 넘을 일은 없을 듯 하다. Simple & Easy Notification Service에 들어간 뒤 이용 신청하기를 클릭한다.

 

https://console.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

이용 신청한 서비스들은 콘솔 페이지에서 관리할 수 있다.

 

SMS 서비스를 이용하려면 프로젝트를 생성해야 한다. 프로젝트 생성하기를 눌러 프로젝트를 생성해준다. 서비스 Type은 SMS에 체크한다.

Project 메뉴에 들어가면 이렇게 프로젝트가 생성이 된다. 프로젝트별로 서비스 ID가 발급이 되는데 API 요청을 보낼 때 사용된다.


3. 발신번호 등록하기

SMS-Calling Number 메뉴로 들어가서 발신번호를 등록한다. 여기 등록된 번호로만 발신할 수 있다.

 

여기까지 하면 API를 사용할 준비가 완료되었다.


4. Header 작성

API 가이드: https://apidocs.ncloud.com/ko/common/ncpapi/

 

NAVER CLOUD PLATFORM API - API 참조서

개요 네이버 클라우드 플랫폼에서 제공하는 인프라/솔루션 상품을 이용할 수 있도록 지원하는 응용 프로그램 인터페이스(Application Programming Interface, API) 제공하고 있습니다. 본 페이지에서는 NAVER CLOUD PLATFORM API 대한 간략한 설명 및 API 호출하는 방법을 제공합니다. API는 RESTful API 방식으로 제공되며, XML와 JSON 형식으로 응답합니다. 액션에 따라 파라미터 값을 입력하고 등록, 수

apidocs.ncloud.com

SMS API v2 가이드: https://apidocs.ncloud.com/ko/ai-application-service/sens/sms_v2/

 

SMS API v2 가이드 - API 참조서

기본 정보 API URL https://sens.apigw.ntruss.com/sms/v2 항목 Mandatory 설명 Content-Type Mandatory 요청 Body Content Type을 application/json으로 지정 (POST) x-ncp-apigw-timestamp Mandatory 1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)로 나타낸 것이다.API Gateway 서버

apidocs.ncloud.com

네이버에서 제공하는 API 가이드들이다. 읽어보면 많은 도움이 된다.

 

일단 API 요청을 위해 필요한 정보는 URL, Header, Body이다.

일단 헤더에 들어갈 내용은 위와 같다. 여기서 Content-Type은 "application/json; charset=utf-8"으로 지정해주었고, timestamp는 그냥 현재 UTC 시간을 넣어주면 되고 access-key는 아까 발급받았던 access key를 넣어주면 된다. 마지막 signature만 생성해주면 된다.

signature를 생성하는 방법. 요청내용에 맞게 StringToSign 문자열을 생성한 뒤, SecretKey로 HmacSha256 알고리즘으로 암호화한 후 Base64로 인코딩하라고 한다.

import base64
import hashlib
import hmac

def make_signature(string):
    secret_key = bytes("발급받은 secret key를 넣어줍니다", 'UTF-8')
    string = bytes(string, 'UTF-8')
    string_hmac = hmac.new(secret_key, string, digestmod=hashlib.sha256).digest()
    string_base64 = base64.b64encode(string_hmac).decode('UTF-8')
    return string_base64

그래서 파이썬으로 signature를 만드는 함수를 하나 만들어주었다. 여기서 매개변수로 받는 string이 StringToSign 문자열에 해당한다.

import time

url = "https://sens.apigw.ntruss.com"
uri = "/sms/v2/services/" + "발급받은 서비스ID" + "/messages"
api_url = url + uri
timestamp = str(int(time.time() * 1000))
access_key = "발급받은 access key"
string_to_sign = "POST " + uri + "\n" + timestamp + "\n" + access_key
signature = make_signature(string_to_sign)

headers = {
    'Content-Type': "application/json; charset=UTF-8",
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': access_key,
    'x-ncp-apigw-signature-v2': signature
}

그리고 header를 이렇게 만들어준다.


5. Body 작성

body를 작성하는 것은 매우 간단하다. SMS API 가이드에 나오는 항목들 중 필요한 것들만 가져다가 딕셔너리 형식으로 만들어준 뒤, json 타입으로 바꾸어주면 된다. (이상하게도 header는 딕셔너리 형식 그대로 사용하는 반면 body는 json타입으로 바꾸어주어야지 요청이 된다.)

import json

message = "테스트 내용입니다."		# 메세지 내용을 저장
phone = "01000000000"			# 핸드폰 번호를 저장

body = {
    "type": "SMS",
    "contentType": "COMM",
    "from": "발신자번호",
    "content": message,
    "messages": [{"to": phone}]
}

body = json.dumps(body)

6. 요청하기

import requests

response = requests.post(api_url, headers=headers, data=body)

끝으로 위에서 생성한 내용들로 API 요청을 하면 문자발송이 된다. 여기서 response로 응답된 내용을 어떻게 활용할지는 각자 알아서 처리하면 된다.


import base64
import hashlib
import hmac
import time
import requests
import json
import keys
from filters import *


def send(booking):
    url = "https://sens.apigw.ntruss.com"
    uri = "/sms/v2/services/" + keys.service_id + "/messages"
    api_url = url + uri
    timestamp = str(int(time.time() * 1000))
    access_key = keys.access_key
    string_to_sign = "POST " + uri + "\n" + timestamp + "\n" + access_key
    signature = make_signature(string_to_sign)

    # 예약내역 불러와서 변환
    phone = booking['phone'].replace("-", "")
    name = booking['name']
    booking_date = format_datetime(booking['date'])

    message = "{}님 bernini 예약이 승인되었습니다.\n예약일자: {}".format(name, booking_date)

    headers = {
        'Content-Type': "application/json; charset=UTF-8",
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': signature
    }

    body = {
        "type": "SMS",
        "contentType": "COMM",
        "from": "발신자번호",
        "content": message,
        "messages": [{"to": phone}]
    }

    body = json.dumps(body)

    response = requests.post(api_url, headers=headers, data=body)
    response.raise_for_status()


def make_signature(string):
    secret_key = bytes(keys.secret_key, 'UTF-8')
    string = bytes(string, 'UTF-8')
    string_hmac = hmac.new(secret_key, string, digestmod=hashlib.sha256).digest()
    string_base64 = base64.b64encode(string_hmac).decode('UTF-8')
    return string_base64

내가 작성한 풀 코드. key를 저장하는 keys.py 파일을 하나 만들어준 뒤 import 시켰다.(Git에 key까지 올라가는 것을 방지하기 위해)

 

끝!

'Web > Flask' 카테고리의 다른 글

[Flask] SSH를 통해 AWS EC2 접속하기  (0) 2020.03.01
[Flask] Jinja2 필터함수 등록하기(datetime)  (0) 2020.02.17