背景:

公司需要拉取腾讯云的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)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐