def sign()

in apis/open_api_sign.py [0:0]


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