Skip to content
This repository was archived by the owner on Feb 28, 2025. It is now read-only.

Commit 4de63a9

Browse files
committed
api message 구현
1 parent 1634e26 commit 4de63a9

6 files changed

Lines changed: 121 additions & 158 deletions

File tree

sdk/api/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
print("CC")
-18 Bytes
Binary file not shown.
499 Bytes
Binary file not shown.

sdk/api/message.py

Lines changed: 47 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@
66
sys.path.insert(0, "../../")
77

88
from sdk.coolsms import Coolsms
9+
from sdk.exceptions import CoolsmsException
910
from sdk.exceptions import CoolsmsSDKException
10-
11-
#import sdk.coolsms
12-
13-
#from coolsms import coolsms
11+
from sdk.exceptions import CoolsmsSystemException
12+
from sdk.exceptions import CoolsmsServerException
1413

1514
# class Message
1615
class Message:
17-
#
16+
cool = None
17+
18+
# initialize
1819
def __init__(self, api_key, api_secret):
19-
Coolsms(api_key, api_secret)
20+
self.cool = Coolsms(api_key, api_secret)
2021

2122
# access to send resource
2223
def send(self, params):
@@ -37,156 +38,75 @@ def send(self, params):
3738
and more informations, visit 'http://www.coolsms.co.kr/SMS_API_v2#POSTsend'
3839
3940
Returns:
40-
A JSON type string will be returned. On failure, thorw Exception
41+
A JSON type string will be returned. On failure, raise Exception
4142
"""
42-
43-
print("GG")
44-
print(type(params))
43+
# params type check
4544
if type(params) is not dict:
46-
raise CoolsmsSDKException("params type is no dictionary")
45+
raise CoolsmsSDKException("parameter type is not dictionary", 201)
46+
47+
# require fields check
48+
if all (k in params for k in ("to", "from", "text")) == False:
49+
raise CoolsmsSDKException("parameter 'to', 'from', 'text' is required", 201)
4750

4851
for key, val in params.items():
4952
print("Code : {0}, Value : {1}".format(key, val))
53+
5054
if key == "text" and sys.version_info[0] == 2:
5155
t_temp = text.decode('utf-8')
5256
text = t_temp.encode('utf-8')
5357
text = unicode(text, encoding='utf-8')
5458
params['text'] = text
5559

56-
if key == "to" and type(to) == list:
60+
# convert list to a comma seperated string
61+
if key == "to" and val == list:
5762
to = ','.join(to)
5863

64+
# message type check
65+
if key == "type" and val.lower() not in ['sms', 'lms', 'mms', 'ata']:
66+
raise CoolsmsSDKException("message type is not supported", 201)
5967

68+
# system info
6069
params['os_platform'] = platform.system()
6170
params['dev_lang'] = "Python %s" % platform.python_version()
6271
params['sdk_version'] = "sms-python %s" % Coolsms.sdk_version
63-
64-
for key, val in params.items():
65-
print("Code : {0}, Value : {1}".format(key, val))
6672

73+
# type이 mms일때 image file check
74+
files = {}
75+
if 'type' in params and params['type'] == 'mms':
76+
if params['image'] is None:
77+
raise CoolsmsSDKException('image file is required')
6778

68-
# convert list to a comma seperated string
69-
"""
70-
71-
if app_version:
72-
self.app_version = app_version
73-
74-
# get authentication info.
75-
timestamp, salt, signature = self.__get_signature__()
76-
77-
fields = {'api_key': self.api_key,
78-
'timestamp': timestamp,
79-
'salt': salt,
80-
'signature': signature.hexdigest(),
81-
'type': mtype,
82-
'os_platform': os_platform,
83-
'dev_lang': dev_lang,
84-
'sdk_version': sdk_version,
85-
'app_version': self.app_version}
86-
87-
if self.test:
88-
fields['mode'] = 'test'
89-
if self.srk:
90-
fields['srk'] = self.srk
91-
if to:
92-
fields['to'] = to
93-
if text:
94-
fields['text'] = text
95-
if sender:
96-
fields['from'] = sender
97-
if subject:
98-
fields['subject'] = subject
99-
if datetime:
100-
fields['datetime'] = datetime
101-
if extension:
102-
fields['extension'] = extension
103-
if country:
104-
fields['country'] = country
105-
106-
if image is None:
107-
image = self.imgfile
108-
109-
if mtype.lower() == 'mms':
110-
if image is None:
111-
self.__set_error__('image file path input required')
112-
return False
11379
try:
114-
with open(image, 'rb') as content_file:
80+
with open(params['image'], 'rb') as content_file:
11581
content = content_file.read()
116-
except IOError as e:
117-
self.__set_error__("I/O error({0}): {1}".format(e.errno, e.strerror))
118-
return False
119-
except:
120-
self.__set_error__("Unknown error")
121-
return False
82+
except Exception as e:
83+
raise CoolsmsSystemException(e, 399)
84+
12285
files = {'image': {'filename': image, 'content': content}}
123-
else:
124-
files = {}
12586

12687
# request post multipart-form
127-
host = self.host + ':' + str(self.port)
128-
selector = "/sms/%s/send" % self.api_version
129-
130-
try:
131-
status, reason, response = post_multipart(host, selector, fields, files)
132-
except Exception as e:
133-
print(e)
134-
self.__set_error__("could not connect to server")
135-
return False
136-
if status != 200:
137-
try:
138-
err = json.loads(response)
139-
except:
140-
self.__set_error__("%u:%s" % (status, reason))
141-
return False
142-
self.__set_error__("%s:%s" % (err['code'], reason))
143-
return False
144-
return json.loads(response)
145-
"""
88+
response = self.cool.request_post_multipart("send", params, files)
89+
return response
14690

147-
# access to sent resource
148-
def status(self, page=1, count=20, s_rcpt=None, s_start=None, s_end=None, mid=None):
149-
params = dict()
150-
if page:
151-
params['page'] = page
152-
if count:
153-
params['count'] = count
154-
if s_rcpt:
155-
params['s_rcpt'] = s_rcpt
156-
if s_start:
157-
params['s_start'] = s_start
158-
if s_end:
159-
params['s_end'] = s_end
160-
if mid:
161-
params['mid'] = mid
162-
response, obj = self.request_get('sent', params)
163-
return obj
91+
# access to statusresource
92+
def status(self, params=None):
93+
response = self.cool.request_get('status', params)
94+
return response
16495

16596
# access to status resource
166-
def line_status(self, count=1):
167-
params = dict()
168-
if count:
169-
params['count'] = count
170-
response, obj = self.request_get('status', params)
171-
return obj
97+
def sent(self, params=None):
98+
response = self.cool.request_get('sent', params)
99+
return response
172100

173101
# access to balance resource
174102
def balance(self):
175-
response, obj = self.request_get('balance')
176-
return int(obj['cash']), int(obj['point'])
103+
response = self.cool.request_get('balance')
104+
return response
177105

178106
# access to cancel resource
179-
def cancel(self, mid=None, gid=None):
180-
if mid is None and gid is None:
181-
return False
182-
183-
params = dict()
184-
if mid:
185-
params['mid'] = mid
186-
if gid:
187-
params['gid'] = gid
188-
189-
response, obj = self.request_post('cancel', params)
190-
if response.status == 200:
191-
return True
192-
return False
107+
def cancel(self, params):
108+
if 'message_id' not in params and 'group_id' not in params:
109+
raise CoolsmsSDKException("message_id or group_id either one must be entered", 202)
110+
111+
response = self.cool.request_post('cancel', params)
112+
return response

sdk/coolsms.py

Lines changed: 71 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import time
1010
import platform
1111

12+
from sdk.exceptions import CoolsmsServerException
13+
1214
# sys.version_info.major is available in python version 2.7
1315
# use sys.version_info[0] for python 2.6
1416
if sys.version_info[0] == 2:
@@ -28,6 +30,9 @@ class Coolsms:
2830
# SDK Version
2931
sdk_version = "2.0"
3032

33+
# API Version
34+
api_version = "2"
35+
3136
# SMS Gateway address
3237
host = 'api.coolsms.co.kr'
3338

@@ -65,57 +70,86 @@ def get_error(self):
6570

6671
# http GET request
6772
def request_get(self, resource, params=None):
68-
timestamp, salt, signature = self.__get_signature__()
69-
base_params = {'api_key': self.api_key, 'timestamp': timestamp,
70-
'salt': salt, 'signature': signature.hexdigest()}
71-
if params:
72-
base_params.update(params.items())
73+
if params == None:
74+
params = dict()
75+
76+
params = self.set_base_params(params)
7377
params_str = urlencode(base_params)
7478
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain",
7579
"User-Agent": "sms-python"}
7680
conn = HTTPSConnection(self.host, self.port)
7781
conn.request("GET", "/sms/%s/%s?" % (self.api_version, resource) + params_str, None, headers)
7882
response = conn.getresponse()
79-
data = response.read()
83+
data = response.read().decode()
8084
conn.close()
81-
obj = response, json.loads(data)
85+
86+
# https status code is not 200, raise Exception
87+
if response.status != 200:
88+
raise CoolsmsServerException(response.reason, response.status)
89+
90+
# response data parsing
91+
obj = None
92+
if data:
93+
obj = json.loads(data)
94+
8295
return obj
8396

8497
# http POST request
8598
def request_post(self, resource, params=None):
86-
timestamp, salt, signature = self.__get_signature__()
87-
base_params = {'api_key': self.api_key, 'timestamp': timestamp, 'salt': salt,
88-
'signature': signature.hexdigest()}
89-
if params:
90-
base_params.update(params)
91-
params_str = urlencode(base_params)
99+
if params == None:
100+
params = dict()
101+
102+
params = self.set_base_params(params)
103+
params_str = urlencode(params)
92104
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain",
93105
"User-Agent": "sms-python"}
94106
conn = HTTPSConnection(self.host, self.port)
95107
conn.request("POST", "/sms/%s/%s" % (self.api_version, resource), params_str, headers)
96108
response = conn.getresponse()
97-
data = response.read()
109+
data = response.read().decode()
98110
conn.close()
99-
json_obj = None
111+
112+
# https status code is not 200, raise Exception
113+
if response.status != 200:
114+
raise CoolsmsServerException(response.reason, response.status)
115+
116+
obj = None
100117
if data:
101-
json_obj = json.loads(data)
102-
return response, json_obj
118+
obj = json.loads(data)
119+
120+
return obj
103121

104122
# send multipart form to the server
105-
def request_post_multipart(host, selector, fields, files):
106-
content_type, body = encode_multipart_formdata(fields, files)
107-
h = HTTPSConnection(host)
108-
h.putrequest('POST', selector)
109-
h.putheader('content-type', content_type)
110-
h.putheader('content-length', str(len(body.encode('utf-8'))))
111-
h.putheader('User-Agent', 'sms-python')
112-
h.endheaders()
113-
h.send(body.encode('utf-8'))
114-
resp = h.getresponse()
115-
return resp.status, resp. reason, resp.read().decode()
123+
def request_post_multipart(self, resource, params, files):
124+
host = self.host + ':' + str(self.port)
125+
selector = "/sms/%s/%s" % (self.api_version, resource)
126+
127+
params = self.set_base_params(params)
128+
content_type, body = self.encode_multipart_formdata(params, files)
129+
conn = HTTPSConnection(host)
130+
conn.putrequest('POST', selector)
131+
conn.putheader('content-type', content_type)
132+
conn.putheader('content-length', str(len(body.encode('utf-8'))))
133+
conn.putheader('User-Agent', 'sms-python')
134+
conn.endheaders()
135+
conn.send(body.encode('utf-8'))
136+
response = conn.getresponse()
137+
data = response.read().decode()
138+
conn.close()
139+
140+
# https status code is not 200, raise Exception
141+
if response.status != 200:
142+
raise CoolsmsServerException(response.reason, response.status)
143+
144+
# response data parsing
145+
obj = None
146+
if data:
147+
obj = json.loads(data)
148+
149+
return obj
116150

117151
# format multipart form
118-
def encode_multipart_formdata(fields, files):
152+
def encode_multipart_formdata(self, fields, files):
119153
boundary = str(uuid.uuid1())
120154
crlf = '\r\n'
121155
l = []
@@ -140,3 +174,11 @@ def encode_multipart_formdata(fields, files):
140174
# get content type
141175
def get_content_type(filename):
142176
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
177+
178+
# set base parameter
179+
def set_base_params(self, params):
180+
timestamp, salt, signature = self.__get_signature__()
181+
base_params = {'api_key': self.api_key, 'timestamp': timestamp, 'salt': salt,
182+
'signature': signature.hexdigest()}
183+
params.update(base_params)
184+
return params

sdk/exceptions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
# -*- coding: utf8 -*-
33

44
class CoolsmsException(Exception):
5-
pass
5+
def __init__(self, message, code):
6+
self.code = code
7+
self.msg = message
68

79
class CoolsmsSDKException(CoolsmsException):
810
pass

0 commit comments

Comments
 (0)