当前位置 博文首页 > 小白的成长记录:python 腾讯云API 请求签名 实例(DNS)

    小白的成长记录:python 腾讯云API 请求签名 实例(DNS)

    作者:[db:作者] 时间:2021-07-06 12:27

    在此记录一下获取请求签名及请求接口的认证方式 ,官方给出的代码示例实在难以理解

    # -*- coding: utf-8 -*-
    import requests
    import hashlib
    import base64
    import random
    import time
    import hmac
    
    
    class QcloudAPI:
        def __init__(self, params):
            self.params = params
            self.methed = 'POST'
            self.src = 'cns.api.qcloud.com/v2/index.php'
            self.url = 'https://cns.api.qcloud.com/v2/index.php'
            self.secret_id = 'AKIDSl8GAoEZbXXXXXXXXXX'
            self.secret_key = 'XigNpZFKAkRwXXXXXXXXXX'
    
        @staticmethod
        def hmac_sha1_base64(txt, key):
            """
            :param txt: 需要加密的字符串
            :param key: The starting key for the hash.
            :return: 经过sha1加密并转换为base64编码的数据
            """
            key = key.encode(encoding='utf-8')
            txt = txt.encode(encoding='utf-8')
            code = hmac.new(key, txt, digestmod=hashlib.sha1).digest()
            return base64.b64encode(code)
    
        def auth(self):
            """
            :return: 包含签名认证的数据
            """
            public_args = {  # 公共请求参数
                'SecretId': self.secret_id,
                'Nonce': random.randint(1, 100000),
                'Timestamp': int(time.time()),
            }
            data = dict(public_args, **self.params)  # 整合公共请求参数和接口请求参数
            base = sorted(data.items(), key=lambda d: d[0])  # 把参数名按照字母排序
            sign = ''.join([self.methed, self.src, '?', '&'.join([f'{k}={v}' for k, v in base])])
            data['Signature'] = self.hmac_sha1_base64(sign, self.secret_key)
            return data
    
    
    def main():
        params = {'Action': 'RecordList', 'domain': 'mizhiweixiao.cn'}  # 接口请求参数
        api = QcloudAPI(params)
        data = api.auth()
        response = requests.post(api.url, data=data)
        print(response.json() if response.ok else response.text)
    
    
    if __name__ == '__main__':
        main()
    
    
    
    cs