Skip to content

Commit 0191fc1

Browse files
Python SDK 예제 업데이트:
* Python PEP8 규칙에 맞게 변경 * 예약발송, 해외발송, 대체발송 예제 추가
1 parent 5e6613d commit 0191fc1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+1068
-1514
lines changed

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Solapi SDK for Python
22

3-
[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)
4-
3+
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-370/)
54

65
lib/config.ini 파일을 아래와 같이 설정 후 examples 아래 예제 코드를 실행해 보세요.
6+
77
```
88
[AUTH]
99
# 계정의 API Key와 API Secret을 입력해주세요
@@ -16,6 +16,9 @@ protocol = https
1616
prefix =
1717
```
1818

19-
아래 라이브러리 설치를 필요로 합니다.
19+
### SOLAPI SDK 이용을 위해 아래 라이브러리 설치를 필요로 합니다.
20+
2021
- requests
2122
- configparser
23+
24+
### 한 파일로 예제를 확인하고 싶으신 경우 examples/all_in_one.py를 참고 해주세요.

examples/all_in_one.py

Lines changed: 83 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6,98 +6,110 @@
66
import hashlib
77
import requests
88

9-
# apiKey, apiSecret 입력 필수
10-
apiKey = 'INPUT YOUR API KEY'
11-
apiSecret = 'INPUT YOUR SECRET KEY'
12-
139
# 아래 값은 필요시 수정
1410
protocol = 'https'
1511
domain = 'api.solapi.com'
1612
prefix = ''
1713

14+
1815
def unique_id():
1916
return str(uuid.uuid1().hex)
2017

18+
2119
def get_iso_datetime():
2220
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
2321
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
2422
return datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
2523

24+
2625
def get_signature(key, msg):
2726
return hmac.new(key.encode(), msg.encode(), hashlib.sha256).hexdigest()
2827

29-
def get_headers(apiKey, apiSecret):
28+
29+
def get_headers(api_key, api_secret):
3030
date = get_iso_datetime()
3131
salt = unique_id()
32-
data = date + salt
32+
combined_string = date + salt
33+
3334
return {
34-
'Authorization': 'HMAC-SHA256 ApiKey=' + apiKey + ', Date=' + date + ', salt=' + salt + ', signature=' +
35-
get_signature(apiSecret, data),
36-
'Content-Type': 'application/json; charset=utf-8'
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'
3738
}
3839

39-
def getUrl(path):
40-
url = '%s://%s' % (protocol, domain)
41-
if prefix != '':
42-
url = url + prefix
43-
url = url + path
44-
return url
4540

46-
def sendMany(data):
47-
return requests.post(getUrl('/messages/v4/send-many'), headers=get_headers(apiKey, apiSecret), json=data)
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
4847

49-
# 한번 요청으로 1만건의 메시지 발송이 가능합니다.
48+
49+
def send_many(data):
50+
# api_key, api_secret 입력 필수
51+
api_key = 'INPUT YOUR API KEY'
52+
api_secret = 'INPUT YOUR SECRET KEY'
53+
54+
return requests.post(get_url('/messages/v4/send-many'), headers=get_headers(api_key, api_secret), json=data)
55+
56+
57+
'''
58+
한번 요청으로 1만건의 메시지 발송이 가능합니다.
59+
해당 파일을 통해 별도 import 없이 발송 테스트가 가능합니다.
60+
from 데이터의 경우 반드시 관리 콘솔 내 등록하신 발신번호를 넣으셔야 정상 발송 가능합니다.
61+
'''
5062
if __name__ == '__main__':
51-
data = {
52-
'messages': [
53-
{
54-
'to': '01000000001',
55-
'from': '029302266',
56-
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 추가됩니다.'
57-
},
58-
{
59-
'to': '01000000002',
60-
'from': '029302266',
61-
'text': '한글 45자, 영자 90자 이상 입력되면 자동으로 LMS타입의 문자메시자가 발송됩니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
62-
},
63-
{
64-
'type': 'SMS',
65-
'to': '01000000003',
66-
'from': '029302266',
67-
'text': 'SMS 타입에 한글 45자, 영자 90자 이상 입력되면 오류가 발생합니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
68-
},
69-
{
70-
'to': [ '01000000004', '01000000005' ], # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
71-
'from': '029302266',
72-
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
73-
},
74-
# 해외발송
75-
{
76-
'country': '1', # 미국(1), 일본(81), 중국(86) 등 국가번호 입력
77-
'to': '01000000006', # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
78-
'from': '029302266',
79-
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
80-
},
81-
# 알림톡 발송
82-
{
83-
'to': '01000000004',
84-
'from': '029302266',
85-
'kakaoOptions': {
86-
'pfId': 'KA01PF200323182344986oTFz9CIabcx',
87-
'templateId': 'KA01TP200323182345741y9yF20aabcx',
88-
# 변수: 값 형식으로 모든 변수에 대한 변수값 입력
89-
'variables': {
90-
'#{변수1}': '변수1의 값',
91-
'#{변수2}': '변수2의 값',
92-
'#{버튼링크1}': '버튼링크1의 값',
93-
'#{버튼링크2}': '버튼링크2의 값',
94-
'#{강조문구}': '강조문구의 값'
95-
}
96-
}
97-
}
98-
# ...
99-
# 1만건까지 추가 가능
100-
]
101-
}
102-
res = sendMany(data)
103-
print(json.dumps(res.json(), indent=2, ensure_ascii=False))
63+
data = {
64+
'messages': [
65+
{
66+
'to': '01000000001',
67+
'from': '029302266',
68+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 추가됩니다.'
69+
},
70+
{
71+
'to': '01000000002',
72+
'from': '029302266',
73+
'text': '한글 45자, 영자 90자 이상 입력되면 자동으로 LMS타입의 문자메시자가 발송됩니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
74+
},
75+
{
76+
'type': 'SMS',
77+
'to': '01000000003',
78+
'from': '029302266',
79+
'text': 'SMS 타입에 한글 45자, 영자 90자 이상 입력되면 오류가 발생합니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ'
80+
},
81+
{
82+
'to': ['01000000004', '01000000005'], # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
83+
'from': '029302266',
84+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
85+
},
86+
# 해외발송
87+
{
88+
'country': '1', # 미국(1), 일본(81), 중국(86) 등 국가번호 입력, 국가 번호에 띄어쓰기가 있는 경우 붙여서 기입해야 합니다. 예) +1 809 -> '1809'
89+
'to': '01000000006', # 수신번호를 array로 입력하면 같은 내용을 여러명에게 보낼 수 있습니다.
90+
'from': '029302266',
91+
'text': '한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 발송됩니다.'
92+
},
93+
# 알림톡 발송
94+
{
95+
'to': '01000000004',
96+
'from': '029302266',
97+
'kakaoOptions': {
98+
'pfId': 'KA01PF200323182344986oTFz9CIabcx',
99+
'templateId': 'KA01TP200323182345741y9yF20aabcx',
100+
# 변수: 값 형식으로 모든 변수에 대한 변수값 입력
101+
'variables': {
102+
'#{변수1}': '변수1의 값',
103+
'#{변수2}': '변수2의 값',
104+
'#{버튼링크1}': '버튼링크1의 값',
105+
'#{버튼링크2}': '버튼링크2의 값',
106+
'#{강조문구}': '강조문구의 값'
107+
}
108+
}
109+
}
110+
# ...
111+
# 1만건까지 추가 가능
112+
]
113+
}
114+
res = send_many(data)
115+
print(json.dumps(res.json(), indent=2, ensure_ascii=False))

examples/group/add_group_message.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
import requests
2-
import configparser
31
import json
4-
import sys
5-
import os.path
6-
7-
sys.path.append('../../lib')
8-
9-
import auth
10-
import config
2+
import lib.message as message
113

124
if __name__ == '__main__':
135
# [INPUT_GROUP_ID] 에 그룹 아이디를 넣어주세요
@@ -33,7 +25,5 @@
3325
}
3426
]
3527
}
36-
res = requests.put(config.getUrl('/messages/v4/groups/[INPUT_GROUP_ID]/messages'),
37-
headers=auth.get_headers(config.apiKey, config.apiSecret),
38-
json=data)
28+
res = message.put('/messages/v4/groups/[INPUT_GROUP_ID]/messages', data=data)
3929
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))

examples/group/add_group_message_with_image.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
import requests
2-
import configparser
32
import json
4-
import sys
5-
import os.path
6-
7-
sys.path.append('../../lib')
8-
9-
import auth
10-
import config
3+
import lib.auth as auth
4+
import lib.config as config
5+
import lib.message as message
116

127
if __name__ == '__main__':
138
# [GROUP_ID] 에 그룹 아이디를 넣어주세요
@@ -29,7 +24,5 @@
2924
}
3025
])
3126
}
32-
res = requests.put(config.getUrl('/messages/v4/groups/[GROUP_ID]/messages',
33-
headers=auth.get_headers(config.apiKey, config.apiSecret),
34-
json=data)
27+
res = message.put('/messages/v4/groups/[GROUP_ID]/messages', data=data)
3528
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import json
2+
import lib.message as message
3+
4+
'''
5+
예약 발송 취소 예제, 이미 예약 발송이 설정되어 있어야 합니다.
6+
'''
7+
if __name__ == '__main__':
8+
# [INPUT_GROUP_ID] 에 그룹 아이디를 넣어주세요
9+
# ex) G4V20181005122748TESTTESTTESTTES
10+
res = message.delete('/messages/v4/groups/[INPUT_GROUP_ID]/schedule', data=None)
11+
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))

examples/group/create_group.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
import requests
21
import json
3-
import sys
4-
import os.path
5-
6-
sys.path.append('../../lib')
7-
8-
import auth
9-
import config
2+
import lib.message as message
103

114
if __name__ == '__main__':
12-
res = requests.post(config.getUrl('/messages/v4/groups'),
13-
headers=auth.get_headers(config.apiKey, config.apiSecret))
5+
res = message.post('/messages/v4/groups', data={})
146
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
1-
import requests
2-
import configparser
31
import json
4-
import sys
5-
import os.path
6-
7-
sys.path.append('../../lib')
8-
9-
import auth
10-
import config
2+
import lib.message as message
113

124
if __name__ == '__main__':
135
# [INPUT_GROUP_ID] 에 그룹 아이디를 넣어주세요
146
# ex) G4V20181005122748TESTTESTTESTTES
15-
res = requests.delete(config.getUrl('/messages/v4/groups/[INPUT_GROUP_ID]',
16-
headers=auth.get_headers(config.apiKey, config.apiSecret))
7+
res = message.delete('/messages/v4/groups/[INPUT_GROUP_ID]')
178
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))
Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
import requests
2-
import configparser
31
import json
4-
import sys
5-
import os.path
6-
7-
sys.path.append('../../lib')
8-
9-
import auth
10-
import config
2+
import lib.message as message
113

124
if __name__ == '__main__':
135
# [INPUT_GROUP_ID] 에 그룹 아이디를 넣어주세요
@@ -20,7 +12,6 @@
2012
'[INPUT_MESSAGE_ID]'
2113
]
2214
}
23-
res = requests.delete(config.getUrl('/messages/v4/groups/[INPUT_GROUP_ID]/messages',
24-
headers=auth.get_headers(config.apiKey, config.apiSecret),
25-
json=data)
15+
res = message.delete('/messages/v4/groups/[INPUT_GROUP_ID]/messages',
16+
data=data)
2617
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))

examples/group/get_group.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

examples/group/get_group_info.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
1-
import requests
2-
import configparser
31
import json
4-
import sys
5-
import os.path
6-
7-
sys.path.append('../../lib')
8-
9-
import auth
10-
import config
2+
import lib.message as message
113

124
if __name__ == '__main__':
135
# [INPUT_GROUP_ID] 에 그룹 아이디를 넣어주세요
146
# ex) G4V20181005122748TESTTESTTESTTES
15-
res = requests.get(config.getUrl('/messages/v4/groups/[INPUT_GROUP_ID]',
16-
headers=auth.get_headers(config.apiKey, config.apiSecret))
7+
res = message.get('/messages/v4/groups/[INPUT_GROUP_ID]')
178
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))

0 commit comments

Comments
 (0)