美文网首页
Python3利用云信发短信

Python3利用云信发短信

作者: 火星贪狼 | 来源:发表于2017-08-25 13:09 被阅读0次

    根据大神的文章,网易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有效)

    相关文章

      网友评论

          本文标题:Python3利用云信发短信

          本文链接:https://www.haomeiwen.com/subject/bxeudxtx.html