02-Day01-腾讯云短信

image

一、注册腾讯云 & 开通云短信

1.1、注册并认证

  • 注册一个腾讯云账户,腾讯云中提供了很多功能:云服务器、云存储你、云直播、云短信等很多功能。
  • 注册地址:https://cloud.tencent.com/
  • 根据提示一步步进行注册即可,例如:

image
image
image
image

1.2 开通云短信

  • 腾讯云注册成功之后,登录腾讯云并去开通 云短信服务,开通短信服务后才能发短信。
  • 开通地址:https://console.cloud.tencent.com/smsv2
  • 根据流程进行开通之后,就可以进入云短信控制台。

image

1.3、创建应用

  • 创建应用并将应用中生成的SDK AppIDApp Key复制下来,之后通过python发送短信时需要用到;

image
image

1.4、创建签名

  • 在腾讯云短信签名时需要认证,认证需要填写签名类型:网站、APP、小程序、公众号,前三种需要提供企业资质等复杂的东西,个人公众号认证会比较便捷,所以推荐个人开发的话使用 公众号 进行签名。
  • 申请一个公众号 然后 创建签名;

1.4.1、申请微信订阅号

image
image
image

1.4.2、创建签名

  • 根据自己的需求选择 国内短信/国际短信 中的签名管理,进行创建签名;
  • PS:签名类型选择 公众号 ,并根据提示上传相关数据即可;
  • 签名创建并审核通过后,把你提交的 签名内容 值保存下来,之后Python发送短信用;
  • 提醒:签名创建完成之后,需要等待腾讯进行审核,也可以联系他们客服QQ加速审核;

image
image

1.4.3、创建模板

  • 根据自己需求创建短信模板,以后根据模板进行发送短信,例如:您的注册验证码:{1},如非本人操作,请忽略本短信!
  • 模板创建并审核通过之后,把模板ID保存下来,之后Python发送短信用。

image

1.5、发送短信

  • 上述的准备工作做完中我们开通相关服务并获取到如下几个值:
  • 创建应用,获取到 appidappkey
  • 创建签名,获取 签名内容
  • 创建模板,获取 模板ID
  • 接下来开始使用Python发送短信。

  • 第一步:安装SDK
pip3 install qcloudsms_py
  • 第二步:基于SDK发送短信
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError

def send_sms_single(phone_num, template_id, template_param_list):
    """
    单条发送短信
    :param phone_num: 手机号
    :param template_id: 腾讯云短信模板ID
    :param template_param_list: 短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = 112142311  # 自己应用ID
    appkey = "8cc5b87123y423423412387930004"  # 自己应用Key
    sms_sign = "SRE运维充电站"  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)
    sender = SmsSingleSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num, template_id, template_param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response

def send_sms_multi(phone_num_list, template_id, param_list):
    """
    批量发送短信
    :param phone_num_list:手机号列表
    :param template_id:腾讯云短信模板ID
    :param param_list:短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = 112142311
    appkey = "8cc5b87123y423423412387930004"
    sms_sign = "SRE运维充电站"
    sender = SmsMultiSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response
if __name__ == '__main__':
    result1 = send_sms_single("15354210333", 548760, [666, ])
    print(result1)
    result2 = send_sms_single( ["15354210333", "15354210334", "15354210335", ],548760, [999, ])
    print(result2)

1.6、关于频率限制

  • 腾讯云短信后台可以进行 短信频率 的限制。
  • 但是,由于我们是免费用户所以无法进行设置,只能使用默认的配置(30秒发1条/1小时发5条/1天发10条)。

image

二、项目配置云短信功能

2.1、测试sms.py提供短信方法

  • 创建utils,用于存放外部开发工具,封装tencent的sms工具包
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % mkdir -p utils/tencent
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % touch utils/tencent/sms.py

(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % cat utils/tencent/sms.py
# -*- coding:utf-8 -*-
import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError

def send_sms_single(phone_num, template_id, template_param_list):
    """
    单条发送短信
    :param phone_num: 手机号
    :param template_id: 腾讯云短信模板ID
    :param template_param_list: 短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = 1400153834001 # 自己应用ID
    appkey = "4493e79c2725ewqed680f66e408b8973509"  # 自己应用Key
    sms_sign = "SRE运维充电站"  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)
    sender = SmsSingleSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num, template_id, template_param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response

def send_sms_multi(phone_num_list, template_id, param_list):
    """
    批量发送短信
    :param phone_num_list:手机号列表
    :param template_id:腾讯云短信模板ID
    :param param_list:短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = 14005383401
    appkey = "4493e79c2725ed680f66e408bd238973509"
    sms_sign = "SRE运维充电站"
    sender = SmsMultiSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response
  • 配置urls路由,用于测试短信发送请求API
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % cat Bug_manager/urls.py    
"""Bug_manager URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from users_app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^send/sms/', views.send_sms),
]
  • 创建views视图方法,进行短信通知测试
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % cat users_app/views.py 
from django.shortcuts import render, HttpResponse
import random
from utils.tencent.sms import send_sms_single
# Create your views here.

def send_sms(request):
    """
    发送短信
    """
    # 生成随机验证码
    code = random.randrange(1000, 9999)
    res = send_sms_single('1535421xxxx', 1015500, [code, ])
    print(res)
    if res['result'] == 0:
        return HttpResponse('success')
    else:
        return HttpResponse(res['errmsg'])
  • 发送短信测试

image
image

2.2、将sms.py工具包配置放置配置文件

  • 主配置 :settings.py
  • 注意 :企业开发配置变量一律大写,如果本地测试的配置信息,需要存放在 local_settings.py配置文件中;
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % ls Bug_manager/settings.py
....
....
######## sms ########
# 腾讯云短信应用 app_id
TENCENT_SMS_APP_ID = 140025383401
# 腾讯云短信应用 app_key
TENCENT_SMS_APP_KEY = "4493e7w49c2725ed680f66e408b8973509"
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "SRE运维充电站"

try:
    from .local_settings import *
except ImportError:
    pass
  • sms攻击包使用配置文件配置
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % cat utils/tencent/sms.py 
# -*- coding:utf-8 -*-
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError
# 导入配置
from django.conf import settings


def send_sms_single(phone_num, template_id, template_param_list):
    """
    单条发送短信
    :param phone_num: 手机号
    :param template_id: 腾讯云短信模板ID
    :param template_param_list: 短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = settings.TENCENT_SMS_APP_ID  # 自己应用ID
    appkey = settings.TENCENT_SMS_APP_KEY  # 自己应用Key
    sms_sign = settings.TENCENT_SMS_SIGN  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)

    sender = SmsSingleSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num, template_id, template_param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response

def send_sms_multi(phone_num_list, template_id, param_list):
    """
    批量发送短信
    :param phone_num_list:手机号列表
    :param template_id:腾讯云短信模板ID
    :param param_list:短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = settings.TENCENT_SMS_APP_ID  # 自己应用ID
    appkey = settings.TENCENT_SMS_APP_KEY  # 自己应用Key
    sms_sign = settings.TENCENT_SMS_SIGN  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)

    sender = SmsMultiSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response

2.3、短信模板 ID 放入settings配置

  • 短信模板涉及多个模板ID,如用户注册、用户登录都是不同的模板ID,所以需要将模板ID使用 对短信接口的参数进行指定;
  • 主配置 :settings.py
  • 注意 :企业开发配置变量一律大写,如果本地测试的配置信息,需要存放在 local_settings.py配置文件中;
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % ls Bug_manager/settings.py
....
....
######## sms ########
# 腾讯云短信应用 app_id
TENCENT_SMS_APP_ID = 140025383401
# 腾讯云短信应用 app_key
TENCENT_SMS_APP_KEY = "4493e7w49c2725ed680f66e408b8973509"
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "SRE运维充电站"

# 短信模板
TENCENT_SMS_TEMPLATE = {
    'register': 1015500,    # 用户注册
    'login': 1015497,       # 用户登录
}

try:
    from .local_settings import *
except ImportError:
    pass
  • views视图sms接口优化
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % cat users_app/views.py 
from django.shortcuts import render, HttpResponse
from django.conf import settings
import random
from utils.tencent.sms import send_sms_single
# Create your views here.

def send_sms(request):
    """
    发送短信
        ?tpl=register -> 1015500
        ?tpl=login -> 1015497
    """
    # 生成随机验证码
    tpl = request.GET.get('tpl')
    template_id = settings.TENCENT_SMS_TEMPLATE.get(tpl)
    if not template_id:
        return HttpResponse('模板不存在')
    
    code = random.randrange(1000, 9999)
    res = send_sms_single('15354210326', 1015500, [code, ])
    print(res)
    if res['result'] == 0:
        return HttpResponse('success')
    else:
        return HttpResponse(res['errmsg'])

2.4、腾讯云示例结束,提交Git

Git : https://gitee.com/dz6666/bug_manager
pip3 freeze > requriements.txt
git add .
git commit -am "day01 - update settings"
posted @ 2021-06-25 13:04  SRE运维充电站  阅读(270)  评论(0编辑  收藏  举报