Python3利用云信发短信

根据大神的文章,网易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有效)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容