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)

浙公网安备 33010602011771号