根据大神的文章,网易SMS-SDK,只使用其中发送模板短信部分,学习python。
云信短信API对接
功能说明:
- 基于python3 +请求实现。
- 网易官方未提供的Python版本的SDK包,只提供接口和参数说明。
- 并且官方文档给出的示例,有错误。(校验有坑,传入参数有坑)
- 全部接口都已测试,如果使用异常,仔细对照一下传参示例。
使用说明:
- 网易云信官网,注册一个测试帐号,默认送几十条免费测试短信。
- 拿到APP_KEY和APP_SECRET,传入模块。
- 云信上,需要配置一下模板短信的模板,需人工审核。
- 对应的ID,代码里的KEY,ID,都作了错误处理,非真实有效值,请注意替换。
import time, hashlib, uuid, requests
class NeteaseSmsAPI(object):
""" 网易云信短信验证码服务 API 接口:
"""
APP_KEY = '*********************'
APP_SECRET = '*********************'
# 接口列表:
API_URLS = {
"send": "https://api.netease.im/sms/sendcode.action",
"verify": "https://api.netease.im/sms/verifycode.action",
"send_template": "https://api.netease.im/sms/sendtemplate.action",
"query_status": "https://api.netease.im/sms/querystatus.action",
}
def __init__(self, app_key=None, app_secret=None):
self.app_key = app_key or self.APP_KEY
self.app_secret = app_secret or self.APP_SECRET
self.urls = self.API_URLS
@property
def nonce(self):
return uuid.uuid4().hex
@property
def curtime(self):
return str(int(time.time()))
def checksum(self, nonce, curtime):
s = "{}{}{}".format(self.app_secret, nonce, curtime).encode(encoding="utf-8")
return hashlib.sha1(s).hexdigest()
@property
def http_headers(self):
""" 构造 HTTP 请求头
:return:
"""
nonce = self.nonce
curtime = self.curtime
checksum = self.checksum(nonce, curtime)
return {
"AppKey": self.app_key,
"CurTime": curtime,
"Nonce": nonce,
"CheckSum": checksum,
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
}
@staticmethod
def _post(url, data, headers):
r = requests.post(url, data=data, headers=headers)
# print("url: {}\nHTTP-header: {}\nHTTP-data: {}".format(url, headers, data))
# print("\tstatus: {} \tresult: {}".format(r.status_code, r.content))
return r.json() if r.status_code == 200 else {}
def send_template(self, template_id, mobiles, params=None):
""" 发送模板短信
:param template_id: 模板 ID, 目前测试发现: 只支持通知类模板, 不支持验证码模板.
:param mobiles: 手机号列表
:param params: 参数列表
:return:
"""
url = self.urls.get("send_template")
data = {
"mobiles": str([mobiles]) if not isinstance(mobiles, list) else mobiles
}
if template_id:
data.update({"templateid": str(template_id)})
if params:
params = [params] if not isinstance(params, list) else params
data.update({"params": str(params)})
return self._post(url, data=data, headers=self.http_headers)
读取短信内容文档
包括短信签名,70字计1条短信费
def param():
with open(r'D:\SMS\SMS.txt') as f:
line = f.readlines()
if len(line[0]+8) < 40:
return line
else:
print('短信内容太长了,请再精简一些')
读取号码文档
def mobiles():
with open(r'D:\SMS\number.txt','r') as f:
line = f.readlines()
l = []
for row in line:
l.append(row[0:11])
return l
交互确认
初始密码、确认短信内容、确认短信手机号码等内容
def run():
params = param()
mima_queren = input('请输入密码: ')
if mima_queren == str('********'):
print('你现在准备发送的短信内容为:')
print(params[0],params[1])
neiront_queren = input("请确认:['Y'OR'N'] ")
if neiront_queren == ('y' or 'Y') :
print('请检查手机号码')
number_queren = input("是否检查完毕:['Y'OR'N'] ")
if number_queren == ('y' or 'Y'):
for mobile in mobiles():
print('开始发送短信:{}'.format(mobile))
# 模板ID
template_id = '******'
api = NeteaseSmsAPI()
api.send_template(template_id, mobile,params)
else:
print('请检查完毕再开始!')
else:
print('请重新编辑短信再开始!')
else:
print('密码不对,请重新开始')
主程序
if __name__ == '__main__':
run()
利用pyinstaller打包成exe
cmd模式下,切换到当前目录
pyintaller --onefile NeteastSMS.py
基本语法:
pyinstaller options myscript.py
常用的可选参数如下:
- --onefile 将结果打包成一个可执行文件
- --onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件(默认)
- --paths=DIR 设置导入路径
- --distpath=DIR 设置将打包的结果文件放置的路径
- --specpath=DIR 设置将spec文件放置的路径
- --windowed 使用windows子系统执行,不会打开命令行(只对windows有效)
- --nowindowed 使用控制台子系统执行(默认)(只对windows有效)
- --icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对windows有效)