路飛學城專案之整合騰訊雲簡訊服務、簡訊驗證碼介面

一切隨心走_水瓶發表於2021-01-04

1、整合騰訊雲簡訊服務

1.1、說明

1、API文件,介面的使用說明
2、SDK,基於開發語言封裝的可以直接呼叫的功能(工具)集合
	官網sdk使用文件中找到安裝命令: pip install qcloudsms_py
	按照sdk使用說明進行開發: https://cloud.tencent.com/document/product/382/11672
# 所有配置換成申請的資料

# 申請的簡訊應用 SDK AppID
appid = 1400
# 申請的簡訊應用 SDK AppKey
appkey = "ba81"
# 申請的簡訊模板ID,需要在簡訊控制檯中申請
template_id = 5447
# 申請的簽名,引數使用的是'簽名內容',而不是'簽名ID'
sms_sign = "allen的技術棧"


from qcloudsms_py import SmsSingleSender
sender = SmsSingleSender(appid, appkey)

import random
def get_code():
    code = ''
    for i in range(4):
        code += str(random.randint(0, 9))
    return code

mobile = 13344556677
# 模板所需引數和申請的模板中佔位符要保持一致
code = get_code()
print(code)
params = [code, 5]
try:
    result = sender.send_with_param(86, mobile, template_id, params, sign=sms_sign, extend="", ext="")
    if result and result.get('result') == 0:
        print('傳送成功')
except Exception as e:
    print('簡訊傳送失敗: %s' % e)

1.2、簡訊服務二次封裝

在libs下建立 tx_sms 包

1.2.1、init.py
from .sms import get_code, send_code
1.2.2、settings.py
# 申請的簡訊應用 SDK AppID
APP_ID = 1400
# 申請的簡訊應用 SDK AppKey
APP_KEY = "ba81"
# 申請的簡訊模板ID,需要在簡訊控制檯中申請
TEMPLATE_ID = 5447
# 申請的簽名,引數使用的是'簽名內容',而不是'簽名ID'
SIGN = "allen的技術棧"
1.2.3、sms.py
import random
def get_code():
    code = ''
    for i in range(4):
        code += str(random.randint(0, 9))
    return code


from qcloudsms_py import SmsSingleSender
from . import settings
from utils.logging import logger
sender = SmsSingleSender(settings.APP_ID, settings.APP_KEY)
def send_code(mobile, code, exp):
    try:
        result = sender.send_with_param(
            86,
            mobile,
            settings.TEMPLATE_ID,
            (code, exp),
            sign=settings.SIGN,
            extend="", ext=""
        )
        if result and result.get('result') == 0:
            return True
        logger.error('簡訊傳送失敗: %s' % result.get('errmsg'))
    except Exception as e:
        logger.critical('簡訊傳送異常: %s' % e)
    return False

2、簡訊驗證碼介面

1、前端傳送get請求,攜帶手機號,呼叫封裝好的傳送簡訊介面,完成傳送簡訊,給使用者返回提示資訊
2 路由: send_code 檢視函式: SendCodeView
3、惡意使用你的介面解決方式:
	(1) 限制頻: 手機號一分鐘一次
    (2) 限制ip: 一分鐘一次
    (3) 傳送驗證碼之前,先輸入驗證碼(可以整合極驗滑動驗證碼)

2.1、路由

router.register('', views.SendCodeView, basename='sendcodeview')

2.2、檢視函式

import re
from django.core.cache import cache
from django.conf import settings

class SendCodeView(ViewSet):
    @action(methods=['GET', ], detail=False)
    def send_code(self, request, *args, **kwargs):
        mobile = request.GET.get('mobile')
        if mobile is None:
            return APIResponse(status=1, msg='手機號不能為空')
        if re.match(r'^1[3-9][0-9]{9}$', mobile):
            # 生成驗證碼
            code = sms.get_code()
            flag, msg = sms.send_sms(mobile, code)
            if flag:
                # 儲存驗證碼 3分鐘
                cache.set(settings.SMS_CACHE_KEY % {'mobile': mobile}, code, settings.SMS_CACHE_TIME)
                return APIResponse(msg=msg)
            else:
                return APIResponse(status=1, msg=msg)
        else:
            return APIResponse(status=1, msg='手機號不合法')

dev.py中快取的配置

# 快取到記憶體中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定快取使用的引擎
        'LOCATION': 'unique-snowflake',  # 寫在記憶體中的變數的唯一值
        'TIMEOUT': 300,  # 快取超時時間(預設為300秒,None表示永不過期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大快取記錄的數量(預設300)
            'CULL_FREQUENCY': 3,  # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
        }
    }
}

user_setting.py中快取的配置

SMS_CACHE_KEY = 'sms_cache_%(mobile)s'
SMS_CACHE_TIME = 60 * 3

相關文章