12Django-容联通讯短信接口文档解读第二部分

文档地址:https://doc.yuntongxun.com/p/5a533de33b8496dd00dce07c

 文档原文:

2 发送模板短信接口

2.1 请求地址

POST  /2013-12-26/Accounts/{accountSid}/SMS/TemplateSMS?sig={SigParameter}

2.2 请求包体

属性 类型 约束 说明
to String 必选 短信接收端手机号码集合,用英文逗号分开,每批发送的手机号数量不得超过200个
appId String 必选 应用Id,官网控制台应用列表获取
templateId String 必选

模板Id,官网控制台模板列表获取。

测试模板id是1。

测试模板的内容是:【云通讯】您使用的是云通讯短信模板,您的验证码是{1},请于{2}分钟内正确输入

datas Array 可选 内容数据外层数组节点
data String 可选 内容数据,用于替换模板中{序号},模板如果没有变量,此参数可不传,多个变量,使用数组的数据格式
subAppend String 可选 扩展码,四位数字 0~9999
reqId String 可选 第三方自定义消息id,最大支持32位,同账号下同一自然天内不允许重复。
         

JSON请求示例

POST /2013-12-26/Accounts/abcdefghijklmnopqrstuvwxyz012345/SMS/TemplateSMS?sig=
 C1F20E7A9733CE94F680C70A1DBABCDE HTTP/1.1
 
 Host:192.168.0.1:8883
 content-length: 139
 Accept:application/json; 
 Content-Type:application/json;charset=utf-8; 
 Authorization:ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
 
 {"to":"13911281234,15010151234,13811431234","appId":"ff8080813fc70a7b013fc72312324213","reqId":"abc123","subAppend":"8888","templateId":"1","datas":["替换内容1","替换内容2"]}   

分析:

这部分文档主要是告诉我们如何组装请求体,出来3个必选参数外,我们还选择了一个可选参数datas,目的是替换短信内容中的变量,例如:

【云通讯】您使用的是云通讯短信模板,您的验证码是{替换内容1},请于替换内容2}分钟内正确输入

文档孩提到statusCode为"000000"表示请求发送成功,说明只要我们请求(POST  /2013-12-26/Accounts/{accountSid}/SMS/TemplateSMS?sig={SigParameter})这个地址成功,那么短信就会发送成功,因此

我们按照文档要求把请求体数据组织好后,用python发送出去即可。

python有一个库可用于发送http/https 请求,这个库叫requests,安装方法pip install requests

开始:

1组装请求体:

 #构建请求体
    def get_request_body(self,phone,code):
        return {
            "to": phone,
            "appId":self.appId,
            "templateId":"1",
            "datas":[code,"15"]
        }

2编写发送请求

#发送post请求而且还是json类型的提交
    def requests_api(self,url,header,body):
        #发送请求
        res = requests.post(url,headers=header,data=body)
        #返回响应体的内容
        return res.text

3执行run方法测试

import datetime, hashlib, base64
import json

from django.conf import settings
import requests #发送http/https请求
class Yuntongxin():
    #固定不变的东西用类属性表达
    base_url = 'https://app.cloopen.com:8883'
    #比较有差异化的东西在init里定义
    def __init__(self,accountSid,accountToken,appId,templateId):
        self.accountSid = accountSid #账户id
        self.accountToken = accountToken #授权令牌
        self.appId = appId #appid
        self.templateId = templateId #短信模板id

    #定义生成时间戳方法
    def get_timestamp(self):
        return datetime.datetime.now().strftime('%Y%m%d%H%M%S')

    #生成签名即业务url中的sig={SigParameter}
    def get_sig(self,timestamp):
        # 使用md5对(账号id+账户授权令牌+时间戳)进行加密
        s = self.accountSid+self.accountToken+timestamp
        m = hashlib.md5()
        m.update(s.encode())
        #md5值必须是大写
        return m.hexdigest().upper()


    #生成通信要用的路由:
    #业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/{funcdes}?sig={SigParameter}
    def get_request_url(self,sig):
        self.url=self.base_url + '/2013-12-26/Accounts/%s/SMS/TemplateSMS?sig=%s'%(self.accountSid,sig)
        return self.url

    #生成请求头
    def get_request_head(self,timestamp):
        #Authorization:对(账户id+冒号+时间戳)进行base64编码的字符串
        s = self.accountSid + ':' + timestamp
        auth = base64.b64encode(s.encode()).decode()
        #组织数据
        dataJson = {
            'Accept':'application/json',
            'Content-Type':'application/json;charset=utf-8',
            'Content-Length':"256",
            'Authorization':auth
        }
        return dataJson

    #构建请求体
    def get_request_body(self,phone,code):
        return {
            "to": phone,
            "appId":self.appId,
            "templateId":"1",
            "datas":[code,"15"]
        }

    #发送post请求而且还是json类型的提交
    def requests_api(self,url,header,body):
        #发送请求
        res = requests.post(url,headers=header,data=body)
        #返回响应体的内容
        return res.text

#定义一个run方法进行测试
    def run(self,phone,code):
        timestamp = self.get_timestamp() #生成时间戳
        sig = self.get_sig(timestamp) #生成签名
        url = self.get_request_url(sig) #生成业务url
        #print(url)
        header = self.get_request_head(timestamp)
        #print(header)
        #生成请求头
        body = self.get_request_body(phone,code)
        #发请求
        data = self.requests_api(url,header,json.dumps(body))
        return data
if __name__ == '__main__':
    #accountSid,accountToken,appId,templateId
    config = {
        "accountSid":"eeeeeeeeeeeeeee",
        "accountToken":"333333333333",
        "appId":"4567889087766544321",
        "templateId":"1",
    }
    yun = Yuntongxin(**config)
    res = yun.run("17600588787","202112")
    print(res)

 

  

posted @ 2021-12-13 21:07  linuxTang  阅读(57)  评论(0)    收藏  举报