Python3利用云信发短信

2017-08-25  本文已影响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有效)
上一篇下一篇

猜你喜欢

热点阅读