热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python短信验证码登录_PythonWeb篇之生成短信验证码

web后台,尤其用户权限设置一块,比较频繁用到短信验证码。笔者以容联云通讯为例,借助云平台服务。其提供的免费试用足够应付代码测试需求。AP

web后台,尤其用户权限设置一块,比较频繁用到短信验证码。

笔者以容联云通讯为例,借助云平台服务。其提供的免费试用足够应付代码测试需求。API开发文档中提供了详细的讲解,但是关于python只提供了py2.x,以下直接贴代码:

注:python interpreter 3.x版本,笔者为py3.7

0,以下为笔者项目目录树:

1,以下为CCPRestSDK.py文件:

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author: Bannirui

# Datetime: 2019/7/4 14:53

# Software: PyCharm

import hashlib

import base64

import datetime

import json

import requests

from flask import jsonify

import pysnooper

class REST:

AccountSid = ''

AccountToken = ''

AppId = ''

SubAccountSid = ''

SubAccountToken = ''

ServerIP = ''

ServerPort = ''

SoftVersion = ''

Iflog = False #是否打印日志

Batch = '' #时间戳

Headers = {}

BodyType = 'json'#包体格式,可填值:json 、xml

def __init__(self, ServerIP, ServerPort, SoftVersion):

"""

初始化

:param ServerIP: 必选参数 服务器地址

:param ServerPort: 必选参数 服务器端口

:param SoftVersion: 必选从那时瞳 REST 版本号

"""

self.ServerIP = ServerIP

self.ServerPort = ServerPort

self.SoftVersion = SoftVersion

def setAccount(self, AccountSid, AccountToken):

"""

设置主账号

:param AccountSid: 必选参数 主账号

:param AccountToken: 必选参数 主账号TOKEN

:return:

"""

self.AccountSid = AccountSid

self.AccountToken = AccountToken

def setAppId(self, AppId):

"""

设置应用ID

:param AppId: 必选参数 应用ID

:return:

"""

self.AppId = AppId

def log(self, url, body, data):

"""

打印信息 调试

:param url: 请求网址

:param body: 请求包体

:param data: 响应包体

:return:

"""

print('这是请求的URL:')

print(url)

print('这是请求包体:')

print(body)

print('这是响应包体:')

print(data)

print('********************************')

# @pysnooper.snoop()

def sendTemplateSMS(self, to, datas, tempId):

"""

发送模板短信

:param to: 必选参数,短信接收手机号码集合,用英文逗号隔开

:param datas: 可先参数,内容数据,列表:['1234', '5'] 验证码1234,有效时间5分钟

:param tempId: 模板ID

:return:

"""

self.accAuth()

nowdate = datetime.datetime.now()

self.Batch = nowdate.strftime("%Y%m%d%H%M%S")

# 生成sig

signature = self.AccountSid + self.AccountToken + self.Batch

sig = hashlib.new('md5', signature.encode('utf-8')).hexdigest().upper()

# 拼接URL

url = "https://"+self.ServerIP + ":" + str(self.ServerPort) + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SMS/TemplateSMS?sig=" + sig

print(url)

# 生成auth

src = self.AccountSid + ":" + self.Batch

auth = base64.b64encode(src.encode(encoding='utf-8')).strip()

headers = {

'Accept': 'application/json',

'Content-Type': 'application/json;charset=utf-8',

'Content-Length': '139',

'Authorization': auth

}

data = json.dumps(

{

"to": to,

"datas": str(datas),

"templateId": tempId,

"appId": self.AppId

}

)

try:

req = requests.post(url, headers=headers, data=data)

if req.status_code == 200:

res = json.loads(req.text)

if self.Iflog:

self.log(url, data, res)

return res

except Exception as e:

# print(str(e))

if self.Iflog:

self.log(url, data, str(e))

return jsonify({'172001', '网络错误'})

#主帐号鉴权

def accAuth(self):

if self.ServerIP == "":

print('172004')

print('IP为空')

if self.ServerPort <&#61; 0:

print(&#39;172005&#39;)

print(&#39;端口错误(小于等于0)&#39;)

if self.SoftVersion &#61;&#61; "":

print(&#39;172013&#39;)

print(&#39;版本号为空&#39;)

if self.AccountSid &#61;&#61; "":

print(&#39;172006&#39;)

print(&#39;主帐号为空&#39;)

if self.AccountToken &#61;&#61; "":

print(&#39;172007&#39;)

print(&#39;主帐号令牌为空&#39;)

if self.AppId &#61;&#61; "":

print(&#39;172012&#39;)

print(&#39;应用ID为空&#39;)

#设置包头

def setHttpHeader(self,req):

if self.BodyType &#61;&#61; &#39;json&#39;:

self.Headers["Accept"] &#61; "application/json"

self.Headers["Content-Type"] &#61; "application/json;charset&#61;utf-8"

else:

pass

2&#xff0c;以下为SendTenplateSMS.py文件&#xff1a;

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author: Bannirui

# Datetime: 2019/7/4 14:53

# Software: PyCharm

from CCPRestSDK import REST

# 主帐号

accountSid &#61; &#39;主账号&#39;

# 主帐号Token

accountToken &#61; &#39;主账号TOKEN&#39;

# 应用Id

appId &#61; &#39;主账号APPID&#39;

# 请求地址&#xff0c;格式如下&#xff0c;不需要写http://

serverIP &#61; &#39;app.cloopen.com&#39;

# 请求端口

serverPort &#61; 8883

# 版本号

softVersion &#61; &#39;2013-12-26&#39;

class CCP(object):

"""

自己封装的发送短信的辅助类

"""

# 用于保存对象的类属性

instance &#61; None

def __init__(self):

pass

def __new__(cls):

# 单例模式 判断CCP类是否有已经创建好的对象&#xff0c;如果没有&#xff0c;则创建一个对象并保存&#xff0c;如果有则将保存的对象直接返回

if cls.instance is None:

obj &#61; super(CCP, cls).__new__(cls)

# 初始化REST SDK

obj.rest &#61; REST(serverIP, serverPort, softVersion)

obj.rest.setAccount(accountSid, accountToken)

obj.rest.setAppId(appId)

cls.instance &#61; obj

return cls.instance

def send_template_sms(self, to, datas, temp_id):

"""

发送模板短信

:param to: 手机号码

:param datas: 内容数据&#xff0c;格式为列表&#xff0c;如[&#39;1234&#39;, &#39;4&#39;] 验证码1234&#xff0c;时间为4分钟

:param temp_id: 模板ID

:return:

"""

result &#61; self.rest.sendTemplateSMS(to, datas, temp_id)

for k, v in result.items():

if k &#61;&#61; &#39;templateSMS&#39;:

for k, s in v.items():

print(&#39;%s:%s&#39; % (k, s))

else:

print(&#39;%s:%s&#39; % (k, v))

if __name__ &#61;&#61; &#39;__main__&#39;:

ccp &#61; CCP()

ccp.send_template_sms(&#39;接收验证码的手机号码&#39;, [&#39;1234&#39;, &#39;5&#39;], 1)



推荐阅读
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • MySQL binlog与增量备份的基本原理总结
    定义binlog是记录所有数据库表结构变更(例如CREATE、ALTERTABLE…)以及表数据修改(INSERT、UPDATE即使up ... [详细]
author-avatar
王友仁国珍_326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有