安装模块

pip3 install tencentcloud-sdk-python -i https://pypi.douban.com/simple

url

# 发送短信
path('tencent_sms/', TencentSmsCodeAPIView.as_view()),

view(如果不使用celery的话,使用普通短信发送函数调用接口)

import random
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Responsefrom cat.libs.sms.tencent_sms import t_sms
from celery.result import AsyncResultclass TencentSmsCodeAPIView(APIView):"""腾讯短信发送(基于v3版本)"""permission_classes = []def get(self, request, *args, **kwargs):telephone = request.GET.get('phone')tpl = request.GET.get('tpl')# 同步"""        t_sms.telephone = telephonet_sms.tpl = tplprint(t_sms.telephone, t_sms.tpl)ret = t_sms.sms_check()"""# 异步from cat_celery.sms.tasks import send_sms# 执行任务ret = send_sms.delay(telephone, tpl)# 异步判断返回值if isinstance(ret, AsyncResult):return Response(data='ok', status=status.HTTP_200_OK)data = {'status': ret.get("status"),'msg': ret.get("msg"),}return Response(data=data, status=status.HTTP_200_OK)

TencentSmsCode(发送短信的封装)

import re
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.sms.v20210111 import sms_client, modelsfrom django.conf import settingsfrom django_redis import get_redis_connection# pip3 install tencentcloud-sdk-pythonclass TencentSmsCode(object):"""phone strcode [str,str]tpl_id str"""def __init__(self, telephone, code, tpl):self.telephone = telephoneself.code = codeself.tpl = tplself.tpl_id = ''def __data(self, status, msg):"""返回格式封装"""data = {"status": status,"msg": msg}return datadef __check(self):"""进行校验是否合法"""ret_telephone = self.__check_telephone()if not ret_telephone:data = self.__data(1001, '手机号格式不正确')return data# 进行校验是否有tplret_tpl = self.__check_tpl()if not ret_tpl:data = self.__data(1002, '模板不正确')return data# 验证码的生成 redis进行查询是否过期 redis的存储ret_code = self.__set_code()if not ret_code:data = self.__data(1003, '60秒只能发送1次')return datareturn self.__data(1005, '发送成功')def sms_check(self):"""正常发送"""ret = self.__check()# 校验# print(ret)status = ret.get('status')if status in [1001, 1002, 1003]:return retself.__send_msg()return retdef __send_msg(self):try:phone = '+86%s' % self.telephonecred = credential.Credential(settings.TENCENT_SECRET_ID, settings.TENCENT_SECRET_KEY)httpProfile = HttpProfile()httpProfile.endpoint = "sms.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)req = models.SendSmsRequest()params = {"PhoneNumberSet": [phone, ],  # 手机号"SmsSdkAppId": settings.TENCENT_APP_ID,  # 应用AppId,v2要应用sdk/key,v3新增了密钥,取消了key"SignName": settings.TENCENT_SIGN,  # 签名的模版名称"TemplateId": self.tpl_id,  # 短信模板的id,str格式"TemplateParamSet": self.code  # 格式必须是 ["验证码",参数]  参数可以为空,具体看自己的模板要求}req.from_json_string(json.dumps(params))resp = client.SendSms(req)print("resp.to_json_string()", resp.to_json_string())if resp.SendStatusSet[0].Fee == 1:return Truereturnexcept TencentCloudSDKException as err:print('err', err)def __check_telephone(self):"""手机号校验:param phone: 手机号:return: True/None"""ret = re.match('^1[3-9][0-9]{9}$', self.telephone)if ret:return Truereturndef __check_tpl(self):tpl = self.tpl# print('tpl:', tpl)tpl_id = settings.TENCENT_SMS_TEMPLATES.get(tpl)if tpl_id:# print('tpl_id', tpl_id)self.tpl_id = tpl_idreturn Truereturndef __set_code(self):"""生成验证码存放redis:param phone: 手机号:return:"""# 生成codecode = self.code[0]# print(code)# 保存redisconn = get_redis_connection('sms_code')pipe = conn.pipeline()  # 创建管道pipe.multi()  # 开启批量操作  (事务,)#  # 后端倒计时校验 查看redis是否有,有抛异常init_code = conn.get('init_code_%s' % self.telephone)if init_code:return# 保存正常验证码pipe.set('sms_code_%s' % self.telephone, code, ex=60 * 60 * 24 * 14)# 保存倒计时码pipe.set('init_code_%s' % self.telephone, code, ex=60)pipe.execute()  # 批量执行了return codeimport randomcode = str(random.randrange(1000, 9999))
print(code)
t_sms = TencentSmsCode(telephone='1223334444', code=[code], tpl='login')

settings.py

# redis
# 上面是django项目settings中的其他配置....
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://106.14.42.253:3306",  # 安装redis的主机的 IP 和 端口"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 1000,"encoding": 'utf-8'},"PASSWORD": "foobared"  # redis密码}},# 提供存储短信验证码"sms_code": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://106.14.42.253:3306/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 1000,"encoding": 'utf-8'},"PASSWORD": "foobared"  # redis密码}},
}# ############################# 腾讯云短信配置 ##########################
TENCENT_SECRET_ID = "AKIDbz7yZyxxxxxxxUO1MQDjzxf5E6h1"  # 密钥id
TENCENT_SECRET_KEY = "4rMbZGgxxxxxxxz5ukJbcMp1vYv0o"  # 密钥key
TENCENT_CITY = "ap-guangzhou"  # 地域,默认即可,
TENCENT_APP_ID = "14xxxxx1766"  # 应用id,v2要应用id/key,v3新增了密钥
TENCENT_SIGN = "python后端接口开发"  # 签名的模版名称
# 短信模板
TENCENT_SMS_TEMPLATES = {# 单个参数'register': "993292",'login': "993155"
}

异步调用配置(需要安装django-redis)

安装

pip install redis==3.4.1 -i https://pypi.douban.com/simple/
pip install celery==4.4.2 -i https://pypi.douban.com/simple/

目录结构

auc_celery(文件夹,一般放在根目录下)sms(包)__init__.pytask.py__init__.pyconfig.pymain.py

main.py

from celery import Celery# 创建celery实例对象
app = Celery("auction")  # celery对象可以创建多个,所以我们最好给我们当前的celery应用起个名字,比如叫做dbj# 把celery和django进行组合,需要识别和加载django的配置文件
import osos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'auction_api.settings')
# 如果只是使用了logging日志功能的话可以不写以下两句,因为logging是python提供的模块,但是将来可能使用celery来执行其他的django任务,所以我们先写上
import djangodjango.setup()# 通过app对象加载配置
app.config_from_object("auc_celery.config")# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["auc_celery.sms", ])

config.py

# 配置文件
# 1. 有redis有密码
# 任务队列的链接地址(变量名必须叫这个)
broker_url = 'redis://:foobared@106.14.42.253:3306/14'
# 结果队列的链接地址(变量名必须叫这个)
result_backend = 'redis://:foobared@106.14.42.253:3306/15'# 2. redis无密码写法
# 任务队列的链接地址(变量名必须叫这个)
# broker_url = 'redis://127.0.0.1:6379/14'
# 结果队列的链接地址(变量名必须叫这个)
# result_backend = 'redis://127.0.0.1:6379/15'

task.py

# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
from auc_celery.main import appfrom utils.common.tencent_sms import TencentSmsCode@app.task(name="send_sms")  # name表示设置任务的名称,如果不填写,则默认使用函数名(路径)做为任务名
def send_sms(telephone, code, tpl):t_sms = TencentSmsCode(telephone, code, tpl)t_sms.sms_check()return 'ok'

启动celery

celery -A cat_celery.main worker -l info -P eventlet --logfile=D:/pythonProject/cat/logs/celery.log

settings.py

# redis
# 上面是django项目settings中的其他配置....
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://106.14.42.253:3306",  # 安装redis的主机的 IP 和 端口"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 1000,"encoding": 'utf-8'},"PASSWORD": "foobared"  # redis密码}},# 提供存储短信验证码"sms_code": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://106.14.42.253:3306/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 1000,"encoding": 'utf-8'},"PASSWORD": "foobared"  # redis密码}},
}# ############################# 腾讯云短信配置 ##########################
TENCENT_SECRET_ID = "AKIDbz7yZyxxxxxxxUO1MQDjzxf5E6h1"  # 密钥id
TENCENT_SECRET_KEY = "4rMbZGgxxxxxxxz5ukJbcMp1vYv0o"  # 密钥key
TENCENT_CITY = "ap-guangzhou"  # 地域,默认即可,
TENCENT_APP_ID = "14xxxxx1766"  # 应用id,v2要应用id/key,v3新增了密钥
TENCENT_SIGN = "python后端接口开发"  # 签名的模版名称
# 短信模板
TENCENT_SMS_TEMPLATES = {# 单个参数'register': "993292",'login': "993155"
}

腾讯短信发送(基于v3版本封装)相关推荐

  1. 阿里和云之讯短信发送服务

    目录 1 云之讯短信验证码 1.1 创建应用 1.2 创建短信模板 1.3 发送短信api 1.4 编写代码 1.5 编写测试用例 1.6 编写接口服务 2 阿里云短信服务 2.1 申请签名与模板 2 ...

  2. 前端登录注册页面、多方式登录功能、腾讯云短信发送功能二次封装(包)、发送短信接口

  3. Java整合腾讯云短信发送

    1. 引入相关maven依赖 <dependency><groupId>com.github.qcloudsms</groupId><artifactId&g ...

  4. php 腾讯短信接口api,浅谈PHP使用腾讯云发送短信

    在开发过程中总会遇到需要发送短信的需求,以下介绍使用腾讯云短信api来发送短信的详细过程. 1.登录腾讯云,在应用列表里创建你的应用,输入你的应用名称,应用简介 2.点击应用,获取应用的SDK App ...

  5. Java 短信发送 ( 腾讯云)

    Java 短信发送 (保姆级使用说明) 该功能可包括验证码短信,通知短信,调用腾讯云SDK,阿里云腾讯云大同小异,只是当时申请的时候,腾讯云支持公众号申请 ( 现在阿里云也支持了). 1. 前期准备 ...

  6. 腾讯云短信发送(php - think PHP 6)

    1.腾讯云短信服务 - 快速入门 ,流程走完. 2.使用 API Explorer 云-API-控制台 - 发送短信 调试控制台获取示例代码 PS:完善必填参数, 注意某些非必填参数:SignName ...

  7. 短信验证的实现(基于云之讯短信验证SDK)

    短信验证用途: 进行身份验证,验证手机号码是本人的 短信验证逻辑流程: 发送请求给服务器,根据服务器的返回Json/xml获取 返回码,创建时间. 根据返回码判断是否正确,正确会收到短信.不正确就收不 ...

  8. php创蓝253四要素认证_PHP下基于创蓝253接口的短信发送

    写这篇博客纪念下我此次尴尬的工做.api 首先此次的需求是公司基于借款人给投资人还款时批量发送短信的需求,刚接到需求的时候我一脸懵逼,无所适从.我但是从没写过的,也不知道发送短信的机制是什么.今天写下 ...

  9. android实现直接发短信,android5.0以上版本如何直接发送短信?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面的代码在5.0一下版本能够直接发送,但5.0以上就会跳转到系统的短信发送界面,应该怎么修改呢?(我有看到过一个叫"招商致远手机证券" ...

最新文章

  1. 非静态方法可以调用静态变量吗
  2. 随笔(一)-- Jupyter Notebook如何切换主题、更改字体大小
  3. Ralink5350开发环境搭建
  4. LocalBroadcastManager 的使用
  5. 网络爬虫数据挖掘_我如何构建无服务器网络爬虫以大规模挖掘温哥华房地产数据...
  6. python字典保存为excel_python将字典列表导出为Excel文件的方法
  7. Java中正则表达式替换字符串
  8. 四川专利代理机构列表
  9. 升级ubuntu后EMACS 无法使用
  10. 【大数据】【Spark】Spark概述
  11. PS高斯模糊后变清晰(智能滤镜、蒙版)的使用
  12. 李清照(诗词介绍收藏)
  13. 北理工嵩天Python学习笔记
  14. 单线程顺序爬取图片以及对应的标签
  15. java文件批量改名代码_[原创]JAVA版批量更名程序(附源码)(要求加分)
  16. 世界上读书最多的国家(以色列人均64本)
  17. 通过软件架构来达到易用性-易用性的好处
  18. 知+付费推广:我花3W烧出来的投放经验
  19. win10引导安卓x86_生命不息折腾不止 Win10竟与安卓有一腿
  20. 利用word邮件合并批量导入照片

热门文章

  1. 如何完整的搭建一个项目的开发环境?
  2. java中注解和注释的说明
  3. Traceroute
  4. cool域名是什么意思?cool域名怎么样?
  5. 套索回归 岭回归_岭和套索回归简介
  6. 基于VCamera,仿微信录制短视频
  7. Mysql全文搜索之MATCH...AGAINST的用法介绍
  8. 十进制浮点数转成二进制(IEEE 754 在线计算器)
  9. 游戏玩家的心理分析,让游戏更好的吸引玩家和抓住玩家。
  10. 【Unity Shader】使用Geometry Shader进行大片草地的实时渲染