最近制作注册系统需要进行一个短信验证的功能,决定使用阿里云通信的短信服务,可是坑爹的问题就来了,阿里提供的SDK不支持Python3.x,遂只能通过其HTTP协议方式拼接url 官方文档
因为涉及到url编码问题,博主之前全是encode('utf-8')之后再转string再处理replace('\\x','%')真是太幸酸,后面知道可以使用urllib中的request包的quote函数方方便便的url编码问题,其他的就是跟着协议来了。贴上实现代码:
from urllib import request
import uuid
import time
import hashlib
import hmac
import base64
import os
def log(text):
def decorator(function):
def wrapper(*args,**kwargs):
print('Pid:%s running %s [function:%s] at %s'%(os.getpid(),text,function.__name__,time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())))
return function(*args,**kwargs)
return wrapper
return decorator
class MsgUrlBulid:
def __init__(self,Dic,SercetID=None):
self.HttpMethod='GET'
self._infor=Dic
if SercetID==None:
raise ValueError('SercetID must input!')
self._SercetID=SercetID
print('api information write compelet!')
@staticmethod
def Encode(x):
x=request.quote(x,safe='')
x = x.replace("+", "%20").replace("*", "%2A").replace("%7E", "~")
return x
@log('build sorted dictionary')
def _BulidQuery(self):
if self._infor==None:
raise ValueError('please init first')
lst=sorted(self._infor)
tmpLst=[]
for k in lst:
v=self._infor[k]
para='%s=%s'%(self.Encode(k),self.Encode(v))
tmpLst.append(para)
return '&'.join(tmpLst)
@log('build string to sign')
def _Signtosign(self,x):
return self.HttpMethod+'&'+self.Encode('/')+'&'+self.Encode(x)
@log('create a sign')
def _CreateSign(self,x):
Sha1=hmac.new((self._SercetID+'&').encode('utf-8'),x.encode('utf-8'),hashlib.sha1).digest()
Sign=base64.b64encode(Sha1)
return self.Encode(Sign)
@log('reset the informaton of api')
def resetinfor(self,Dic):
self._infor=Dic
@log('start build request')
def UrlBulid(self):
Basestr=self._BulidQuery()
tmp=self._Signtosign(Basestr)
x=self._CreateSign(tmp)
return 'http://dysmsapi.aliyuncs.com/?Signature=%s&%s'%(x,Basestr)
使用方法 把相关数据替换一下就可以了:
if __name__=='__main__':
form={}
form["SignatureMethod"] = "HMAC-SHA1"
form["SignatureNonce"] = str(uuid.uuid1())
form["AccessKeyId"] = 'your AcessKeyId'
form["SignatureVersion"] = "1.0"
form['Timestamp'] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
form['Action'] = "SendSms"
form['Version'] = "2017-05-25"
form['RegionId'] = "cn-hangzhou"
form['SignName'] = "your signname"#签名
form['TemplateParam'] = '{"code":"xxxx"}'#模板替换部分
form['PhoneNumbers'] = "target telphone number"#接受信息的号码
form['TemplateCode'] = "your templatecode"#模板号
x=MsgUrlBulid(form,'your sercetid')#
print(x.UrlBulid())
需要重置信息调用x.resetinfor(form)就好
运行结果:
1746



被折叠的 条评论
为什么被折叠?



