腾讯云 python sdk_python3 实现腾讯云验签
背景:公司需要拉取腾讯云的dns解析记录,没有发现腾讯云的sdk, 需要自己手动实现DNS 解析 DNSPod 请求签名cloud.tencent.com看了一下腾讯云的凭证加密方式,还是挺复杂。所以就开始动手实践了一下, 踩了几个坑耽搁了很长时间。仿照阿里云简单的实现了一次请求, 这里记下来为以后做笔记逻辑上分成两个类,一个是请求类,一个是执行类。先说请求类, 请求类是接口参数的封装, 下面是
背景:
公司需要拉取腾讯云的dns解析记录,没有发现腾讯云的sdk, 需要自己手动实现DNS 解析 DNSPod 请求签名cloud.tencent.com
看了一下腾讯云的凭证加密方式,还是挺复杂。所以就开始动手实践了一下, 踩了几个坑耽搁了很长时间。
仿照阿里云简单的实现了一次请求, 这里记下来为以后做笔记
逻辑上分成两个类,一个是请求类,一个是执行类。
先说请求类, 请求类是接口参数的封装, 下面是就是”获取腾讯云域名列表“接口的实现,定义了action、请求方式、主机名等信息,为执行类准备
class DomainList(object):
"""获取腾讯云域名列表"""
Action = "DomainList"
method = "GET"
host = "cns.api.qcloud.com"
path = "/v2/index.php"
def __init__(self):
self.params = dict()
def set_offset(self, offset):
self.params.update(dict(offset=offset))
def set_length(self, length):
self.params.update(dict(length=length))
def set_keyword(self, keyword):
"""要添加的域名"""
self.params['keyword'] = keyword
执行类需要在实例化请求类, 在将公共参数和请求参数合并加密得到sinature,在拼装请求链接, 主要方法有do_action、get_signature;
注意事项:连接的求取方式和接口方式要是一致,要么都是GET,要么都是POST
使用hmac 的digest方法获取加密bytes变量, 在使用base64编码, 在将signature进行url编码
class TencentUtil(object):
def __init__(self):
self.params = dict()
self.region = 'gz'
self.tencent_key = os.environ.get("TENCET_KEY")
self.tencent_secret = os.environ.get("TENCET_SECRET")
self.signature_method = 'HmacSHA1'
self.request = None
def get_nonce(self):
"""获取随机数"""
return str(random.randrange(10000, 100000))
def get_timestamp(self):
"""获取时间戳"""
return str(int(time.time()))
def get_headers(self):
if getattr(self, "_data", None):
return self._data
data = dict(Action=self.request.Action, SecretId=self.tencent_key, Timestamp=self.get_timestamp(),
Nonce=self.get_nonce(), Region=self.region)
setattr(self, "_data", data)
return data
def get_all_params(self):
"""获取所有的参数"""
data = self.get_headers()
data.update(**self.request.params)
return data
def get_origin_params_str(self):
"""获取原始参数串"""
params = self.get_all_params()
params = sorted(params.items(), key=lambda x: x[0])
params = ["{}={}".format(key, value) for key, value in params]
return '&'.join(params)
def get_origin_signature(self):
"""获取签名原始串"""
origin_signature = "{method}{host}{path}?{params_str}".format(method=self.request.method, host=self.request.host,
path=self.request.path,
params_str=self.get_origin_params_str())
return origin_signature
def get_signature(self):
"""获取签名"""
origin_signature = self.get_origin_signature()
hmac_code = hmac.new(self.tencent_secret.encode('utf-8'), origin_signature.encode('utf-8'), hashlib.sha1)
return hmac_code.digest()
def get_url(self):
"""获取连接"""
params_str = self.get_origin_params_str()
return "https://{host}{path}?{params_str}".format(host=self.request.host, path=self.request.path,
params_str=params_str)
def clear_data(self):
setattr(self, "_data", None)
def _reqeust(self, url):
"""基础请求"""
res = requests.get(url)
return res.json()
def do_action(self, request):
"""执行动作"""
self.clear_data()
self.request = request
signature = self.get_signature()
signature = base64.b64encode(signature).decode()
signature = parse.quote(signature)
self.request.params.update(dict(Signature=signature))
return self._reqeust(self.get_url())
if __name__ == '__main__':
tencent = TencentUtil()
request = DomainList()
request.set_domain(name)
res = tencent.do_action(request)
更多推荐
所有评论(0)