apis/open_api_sign.py (84 lines of code) (raw):

#!/usr/bin/env python # -*- encoding: utf-8 -*- import uuid import datetime import hmac import base64 from urllib.parse import quote import hashlib import requests import ssl import warnings # 使用HTTPS协议访问OpenAPI时,默认会开启校验SSL/TLS证书有效性,若您代码环境没有证书环境,则会报错证书校验失败。 # 为保障生产环境通信安全,建议您保持开启,若在测试环境必须忽略证书校验,可以通过运行时参数ignore_ssl设置 warnings.filterwarnings("ignore") ssl._create_default_https_context = ssl._create_unverified_context() def params_info(access_key, api_version): public_param = { "Format": "JSON", "SignatureMethod": "HMAC-SHA1", "SignatureVersion": "1.0", "Version": api_version, "AccessKeyId": access_key } return public_param def sign(public_params, http_method, accesskey_secret): public_param = public_params format_time = '%Y-%m-%dT%H:%M:%SZ' utctime = datetime.datetime.utcnow().strftime(format_time) signature_nonce = str(uuid.uuid1()) public_param['SignatureNonce'] = signature_nonce public_param['Timestamp'] = utctime sort_all_params = list() for key, value in public_param.items(): all_params = key + '=' + str(value) sort_all_params.append(all_params) sort_all_params.sort() for i in range(len(sort_all_params)): if 'NextToken' in sort_all_params[i]: continue sort_all_params[i] = quote(sort_all_params[i], '=') # tmp = sort_all_params[i] if sort_all_params[i].find('+'): sort_all_params[i].replace('+', '%20') elif sort_all_params[i].find('*'): sort_all_params[i].replace('*', '%2A') elif sort_all_params[i].find('%7E'): sort_all_params[i].replace('%7E', '~') # print(sort_all_params) str_to_sign = '' for i in range(len(sort_all_params)): str_to_sign = str_to_sign + sort_all_params[i] + '&' str_to_sign = http_method + '&%2F&' + quote(str_to_sign[:-1]) # print(str_to_sign) key = accesskey_secret + '&' signature = hmac.new(key.encode('utf-8'), str_to_sign.encode('utf-8'), digestmod=hashlib.sha1) signature = base64.b64encode(signature.digest()).decode() # print(signature) # 解决签名中包含有'+'的特殊情况 signature = list(signature) for i in range(len(signature)): if signature[i] == '+': signature[i] = '%2B' new_signature = ''.join(signature) public_param['Signature'] = new_signature return public_param def request_url(public_param, domain): draft_url = '' for k, v in public_param.items(): draft_url += f'&{k}={v}' draft_url = draft_url[1:] url = domain + draft_url return url def post_request(latest_url): response = requests.post(latest_url, verify=False) response_json = response.json() return response_json def get_request(latest_url): response = requests.get(latest_url, verify=False) response_json = response.json() return response_json if __name__ == '__main__': AK = 'this is ak' SK = 'this is sk' config_api_version = '2019-01-08' config_api_domain = 'https://config.cn-shanghai.aliyuncs.com/?' params = params_info(AK, config_api_version) params.update({ 'Action': 'ListConfigRules' }) # sign sig_params = sign(params, 'GET', SK) # get url url = request_url(sig_params, config_api_domain) # call res = get_request(url) print(res)