如果您碰巧使用榛子云家的云短信服务,并且您也恰好使用了他家的PythonSDK出了错,那么这篇博客可以为您解答这些问题。至于如何下载他们家的SDK以及如何使用,这些作为一个开发者而言是最基础的基本功,我这里就不再赘述了,如果您像我一样直接点击python3那个选项,那么恭喜你那个文件是有问题的,不知道是他们在发布之前是不是没有进行测试,从下载下来的SDK来看,其实所谓的SDK真的不是SDK充其量只是一个python调用接口的单文件,出现这么低级错误真的不应该。下面是原来的SDK代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# -*- coding: utf-8 -*-
import urllib.request
import urllib.parse


class ZhenziSmsClient(object):
def __init__(self, apiUrl, appId, appSecret):
self.apiUrl = apiUrl
self.appId = appId
self.appSecret = appSecret

def send(self, params):
data = params
data['appId'] = self.appId
data['appSecret'] = self.appSecret

data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(self.apiUrl + '/sms/send.do', data=data)
res_data = urllib.request.urlopen(req)
res = res_data.read()
res = res.decode('utf-8')
return res

def balance(self):
data = {
'appId': self.appId,
'appSecret': self.appSecret
}
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(self.apiUrl + '/account/balance.do', data=data)
res_data = urllib.request.urlopen(req)
res = res_data.read()
return res

def findSmsByMessageId(self, messageId):
data = {
'appId': self.appId,
'appSecret': self.appSecret,
'messageId': messageId
}
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(self.apiUrl + '/smslog/findSmsByMessageId.do', data=data)
res_data = urllib.request.urlopen(req)
res = res_data.read()
return res

其实要是在使用之前,仔细阅读这个代码的话,不难发现文档提供的API接口是基于https的,使用https的时候是需要进行证书认证的,但是这个所谓的SDK的代码根本就没有考虑到这个事情。于是我本着平时有问题及时反馈的习惯向客服反馈了这个问题,以下是我们的对话。

chat1
chat2
chat3
chat4

由于本人时间有限,并且我也不是该公司的员工,本着能解决就解决的想法,毕竟我还是要用人家的API接口的,所以我使用Request对该SDK进行重写,将重写的代码提交给了客服人员(我没有索要任何酬劳,当然人家也没有任何表示),下面是修复的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -*- coding: utf-8 -*-
import requests


class ZhenziSmsClient(object):
def __init__(self, api_url, app_id, app_secret_key):
self._api_url = api_url
self._data = {
"appId": app_id,
"appSecret": app_secret_key
}

def send(self, params):
self._data.update(params)
response = requests.post(self._api_url + "/sms/send.do", data=self._data, verify=False)
return response.text

def balance(self):
response = requests.post(self._api_url + "/account/balance.do", data=self._data, verify=False)
return response.text

def findSmsByMessageId(self, messageId):
self._data.update({"messageId": messageId})
response = requests.post(self._api_url + "/smslog/findSmsByMessageId.do", data=self._data, verify=False)
return response.text

【补充】
今天又上该公司的官网看了一下,SDK的问题已经更改,下面新的SDK的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

class ZhenziSmsClient(object):
4def __init__(self, apiUrl, appId, appSecret):
44self.apiUrl = apiUrl
44self.appId = appId
44self.appSecret = appSecret

4def send(self, params):
44data = params
44data['appId'] = self.appId
44data['appSecret'] = self.appSecret
44requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
44response = requests.post(self.apiUrl+'/sms/send.do', data=data, verify=False)
44result = str(response.content,'utf-8')
44return result


4def balance(self):
44data = {
44 'appId': self.appId,
44 'appSecret': self.appSecret
44}
44requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
44response = requests.post(self.apiUrl+'/account/balance.do', data=data, verify=False)
44result = str(response.content,'utf-8')
44return result;

4def findSmsByMessageId(self, messageId):
44data = {
44 'appId': self.appId,
44 'appSecret': self.appSecret,
44 'messageId': messageId
44}
44requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
44response = requests.post(self.apiUrl+'/smslog/findSmsByMessageId.do', data=data, verify=False)
44result = str(response.content,'utf-8')
44return result

看到这个代码,我只想说一声:唉!这就是所谓的工程师?????