Skip to content

Commit f52505e

Browse files
all in one scripts 예제 추가:
잔액 조회, 메시지 조회, 예약발송 기능 추가
1 parent 6bfd72e commit f52505e

File tree

5 files changed

+323
-4
lines changed

5 files changed

+323
-4
lines changed

src/examples/modules/group/set_reservation_group.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
1212

1313
# 희망하시는 예약 날짜를 넣어주세요
14-
scheduledDate = datetime.datetime(2022, 2, 4).replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
14+
# datetime(년, 월, 일, 시, 분, 초)
15+
scheduledDate = datetime.datetime(2022, 2, 8, 0, 0, 0).replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
1516
data = {
1617
'scheduledDate': scheduledDate
1718
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import json
2+
import time
3+
import datetime
4+
import uuid
5+
import hmac
6+
import hashlib
7+
import requests
8+
9+
# 아래 값은 필요시 수정
10+
protocol = 'https'
11+
domain = 'api.solapi.com'
12+
prefix = ''
13+
14+
15+
def unique_id():
16+
return str(uuid.uuid1().hex)
17+
18+
19+
def get_iso_datetime():
20+
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
21+
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
22+
return datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
23+
24+
25+
def get_signature(key, msg):
26+
return hmac.new(key.encode(), msg.encode(), hashlib.sha256).hexdigest()
27+
28+
29+
def get_headers(api_key, api_secret):
30+
date = get_iso_datetime()
31+
salt = unique_id()
32+
combined_string = date + salt
33+
34+
return {
35+
'Authorization': 'HMAC-SHA256 ApiKey=' + api_key + ', Date=' + date + ', salt=' + salt + ', signature=' +
36+
get_signature(api_secret, combined_string),
37+
'Content-Type': 'application/json; charset=utf-8'
38+
}
39+
40+
41+
def get_url(path):
42+
url = '%s://%s' % (protocol, domain)
43+
if prefix != '':
44+
url = url + prefix
45+
url = url + path
46+
return url
47+
48+
49+
'''
50+
잔액 조회 예제
51+
'''
52+
if __name__ == '__main__':
53+
# 반드시 관리 콘솔 내 발급 받으신 API KEY, API SECRET KEY를 입력해주세요.
54+
api_key = 'INPUT YOUR API KEY'
55+
api_secret = 'INPUT YOUR SECRET KEY'
56+
57+
res = requests.get(get_url('/cash/v1/balance'),
58+
headers=get_headers(api_key, api_secret))
59+
60+
# 실제 충전금액 및 포인트는 response 내 각각 balance, point 데이터로 확인할 수 있습니다.
61+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import json
2+
import time
3+
import datetime
4+
import uuid
5+
import hmac
6+
import hashlib
7+
import requests
8+
9+
# 아래 값은 필요시 수정
10+
protocol = 'https'
11+
domain = 'api.solapi.com'
12+
prefix = ''
13+
14+
15+
def unique_id():
16+
return str(uuid.uuid1().hex)
17+
18+
19+
def get_iso_datetime():
20+
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
21+
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
22+
return datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
23+
24+
25+
def get_signature(key, msg):
26+
return hmac.new(key.encode(), msg.encode(), hashlib.sha256).hexdigest()
27+
28+
29+
def get_headers(api_key, api_secret):
30+
date = get_iso_datetime()
31+
salt = unique_id()
32+
combined_string = date + salt
33+
34+
return {
35+
'Authorization': 'HMAC-SHA256 ApiKey=' + api_key + ', Date=' + date + ', salt=' + salt + ', signature=' +
36+
get_signature(api_secret, combined_string),
37+
'Content-Type': 'application/json; charset=utf-8'
38+
}
39+
40+
41+
def get_url(path):
42+
url = '%s://%s' % (protocol, domain)
43+
if prefix != '':
44+
url = url + prefix
45+
url = url + path
46+
return url
47+
48+
49+
'''
50+
메시지 조회 예제(알림톡, 일반 문자 등 모두 포함)
51+
'''
52+
if __name__ == '__main__':
53+
# 반드시 관리 콘솔 내 발급 받으신 API KEY, API SECRET KEY를 입력해주세요
54+
api_key = 'INPUT YOUR API KEY'
55+
api_secret = 'INPUT YOUR SECRET KEY'
56+
57+
res = requests.get(get_url('/messages/v4/list'),
58+
headers=get_headers(api_key, api_secret))
59+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
60+
61+
# limit
62+
res = requests.get(get_url('/messages/v4/list?limit=10'),
63+
headers=get_headers(api_key, api_secret))
64+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
65+
66+
# messageId
67+
res = requests.get(get_url('/messages/v4/list?messageId=XXXXXXX'),
68+
headers=get_headers(api_key, api_secret))
69+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
70+
71+
# groupId
72+
res = requests.get(get_url('/messages/v4/list?groupId=XXXXXXX'),
73+
headers=get_headers(api_key, api_secret))
74+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
75+
76+
# 수신번호로 조회
77+
res = requests.get(get_url('/messages/v4/list?to=01000000001'),
78+
headers=get_headers(api_key, api_secret))
79+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
80+
81+
# 발신번호로 조회
82+
res = requests.get(get_url('/messages/v4/list?from=029302266'),
83+
headers=get_headers(api_key, api_secret))
84+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
85+
86+
# 메시지타입으로 조회
87+
res = requests.get(get_url('/messages/v4/list?type=SMS'),
88+
headers=get_headers(api_key, api_secret))
89+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
90+
91+
# 메시지 상태 코드로 조회
92+
res = requests.get(get_url('/messages/v4/list?statusCode=4000'),
93+
headers=get_headers(api_key, api_secret))
94+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
95+
96+
# 페이지 처리
97+
page1 = requests.get(get_url('/messages/v4/list?limit=5'),
98+
headers=get_headers(api_key, api_secret)).json()
99+
print(json.dumps(page1, indent=2, ensure_ascii=False))
100+
if 'nextKey' in res:
101+
# 읽어올 데이터가 더 있음
102+
startKey = res['nextKey']
103+
page2 = requests.get(get_url('/messages/v4/list?limit=5&startKey=%s' % startKey),
104+
headers=get_headers(api_key, api_secret)).json()
105+
print(json.dumps(page2, indent=2, ensure_ascii=False))

src/examples/scripts/send_messages.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import hmac
66
import hashlib
77
import requests
8+
import platform
89

910
# 아래 값은 필요시 수정
1011
protocol = 'https'
@@ -46,12 +47,16 @@ def get_url(path):
4647
return url
4748

4849

49-
def send_many(data):
50-
# api_key, api_secret 입력 필수
50+
def send_many(parameter):
51+
# 반드시 관리 콘솔 내 발급 받으신 API KEY, API SECRET KEY를 입력해주세요
5152
api_key = 'INPUT YOUR API KEY'
5253
api_secret = 'INPUT YOUR SECRET KEY'
54+
parameter['agent'] = {
55+
'sdkVersion': 'python/4.2.0',
56+
'osPlatform': platform.platform() + " | " + platform.python_version()
57+
}
5358

54-
return requests.post(get_url('/messages/v4/send-many'), headers=get_headers(api_key, api_secret), json=data)
59+
return requests.post(get_url('/messages/v4/send-many'), headers=get_headers(api_key, api_secret), json=parameter)
5560

5661

5762
'''
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import json
2+
import time
3+
import datetime
4+
import uuid
5+
import hmac
6+
import hashlib
7+
import requests
8+
9+
# 아래 값은 필요시 수정
10+
protocol = 'https'
11+
domain = 'api.solapi.com'
12+
prefix = ''
13+
14+
# 반드시 관리 콘솔 내 발급 받으신 API KEY, API SECRET KEY를 입력해주세요
15+
api_key = 'INPUT YOUR API KEY'
16+
api_secret = 'INPUT YOUR SECRET KEY'
17+
18+
19+
def unique_id():
20+
return str(uuid.uuid1().hex)
21+
22+
23+
def get_iso_datetime():
24+
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
25+
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
26+
return datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
27+
28+
29+
def get_signature(key, msg):
30+
return hmac.new(key.encode(), msg.encode(), hashlib.sha256).hexdigest()
31+
32+
33+
def get_headers(api_key, api_secret):
34+
date = get_iso_datetime()
35+
salt = unique_id()
36+
combined_string = date + salt
37+
38+
return {
39+
'Authorization': 'HMAC-SHA256 ApiKey=' + api_key + ', Date=' + date + ', salt=' + salt + ', signature=' +
40+
get_signature(api_secret, combined_string),
41+
'Content-Type': 'application/json; charset=utf-8'
42+
}
43+
44+
45+
def get_url(path):
46+
url = '%s://%s' % (protocol, domain)
47+
if prefix != '':
48+
url = url + prefix
49+
url = url + path
50+
return url
51+
52+
53+
def get(url):
54+
return requests.get(get_url(url), headers=get_headers(api_key, api_secret))
55+
56+
57+
def post(url, parameter):
58+
return requests.post(get_url(url), headers=get_headers(api_key, api_secret), json=parameter)
59+
60+
61+
def put(url, parameter):
62+
return requests.put(get_url(url), headers=get_headers(api_key, api_secret), json=parameter)
63+
64+
65+
def delete(url):
66+
return requests.delete(get_url(url), headers=get_headers(api_key, api_secret))
67+
68+
69+
'''
70+
예약발송 예제
71+
'''
72+
if __name__ == '__main__':
73+
# STEP 1 그룹 추가
74+
addGroupResponse = post('/messages/v4/groups', parameter={})
75+
groupResponse: dict = addGroupResponse.json()
76+
groupId = groupResponse['groupId']
77+
78+
# STEP 2 발송할 메시지 데이터 추가
79+
messagesDict = {
80+
'messages': [
81+
{
82+
'to': '01000000001',
83+
'from': '029302266',
84+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 추가됩니다.'
85+
},
86+
{
87+
'to': '01000000002',
88+
'from': '029302266',
89+
'text': '한글 45자, 영자 90자 이상 입력되면 자동으로 LMS타입의 문자메시자가 발송됩니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
90+
},
91+
{
92+
'type': 'SMS',
93+
'to': '01000000003',
94+
'from': '029302266',
95+
'text': 'SMS 타입에 한글 45자, 영자 90자 이상 입력되면 오류가 발생합니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
96+
},
97+
{
98+
'to': ['01000000004', '01000000005'], # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
99+
'from': '029302266',
100+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
101+
},
102+
# 해외발송
103+
{
104+
'country': '1', # 미국(1), 일본(81), 중국(86) 등 국가번호 입력, 국가 번호에 띄어쓰기가 있는 경우 붙여서 기입해야 합니다. 예) +1 809 -> '1809'
105+
'to': '01000000006', # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
106+
'from': '029302266',
107+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
108+
},
109+
# 알림톡 발송
110+
{
111+
'to': '01000000004',
112+
'from': '029302266',
113+
'kakaoOptions': {
114+
'pfId': 'KA01PF200323182344986oTFz9CIabcx',
115+
'templateId': 'KA01TP200323182345741y9yF20aabcx',
116+
# 변수: 값 형식으로 모든 변수에 대한 변수값 입력
117+
'variables': {
118+
'#{변수1}': '변수1의 값',
119+
'#{변수2}': '변수2의 값',
120+
'#{버튼링크1}': '버튼링크1의 값',
121+
'#{버튼링크2}': '버튼링크2의 값',
122+
'#{강조문구}': '강조문구의 값'
123+
}
124+
}
125+
}
126+
# ...
127+
# 1만건까지 추가 가능
128+
]
129+
}
130+
put('/messages/v4/groups/%s/messages' % groupId, parameter=messagesDict)
131+
132+
# STEP 3 예약 발송일 등록
133+
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
134+
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
135+
136+
# 희망하시는 예약 날짜를 넣어주세요 년
137+
# datetime(년, 월, 일, 시, 분, 초)
138+
scheduledDate = datetime.datetime(2022, 2, 8, 15, 0, 0).replace(
139+
tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
140+
scheduledDateDict = {
141+
'scheduledDate': scheduledDate
142+
}
143+
setScheduledGroupResponse = post('/messages/v4/groups/%s/schedule' % groupId, parameter=scheduledDateDict)
144+
print(json.dumps(json.loads(setScheduledGroupResponse.text), indent=2, ensure_ascii=False))
145+
146+
# 예약 발송 취소를 희망하실 경우 아래 코드를 추가해주세요.
147+
# delete('/messages/v4/groups/%s/schedule' % groupId)

0 commit comments

Comments
 (0)