使用python3调用此接口时提示
{'code': 4100, 'codeDesc': 'AuthFailure', 'message': '身份认证失败,用户身份验证失败'}
代码应该问题
几个点已经排查
# -*-coding:utf8-*-
import binascii
import hashlib
import hmac
import sys
import time
import random
import requests
from urllib.parse import quote
class GetInstanceList:
'''根据ak获取实例列表详情'''
def __init__(self, secret_id, secret_key):
self.secret_id = secret_id
self.secret_key = secret_key
self.timeData = str(int(time.time()))
self.nonceData = int(random.random() * 100000)
self.httpProfile = "account.api.qcloud.com" # HOST
self.signMethod = "HmacSHA256" # 加密方法
self.requestMethod = "GET" # 请求方法
def sign(self, secretKey, signStr, signMethod):
''' 签名鉴权 '''
if sys.version_info[0] > 2:
signStr = signStr.encode("utf-8")
secretKey = secretKey.encode("utf-8")
# 根据参数中的signMethod来选择加密方式
if signMethod == 'HmacSHA256':
digestmod = hashlib.sha256
else:
digestmod = hashlib.sha1
# 完成加密,生成加密后的数据
hashed = hmac.new(secretKey, signStr, digestmod)
base64 = binascii.b2a_base64(hashed.digest())[:-1]
if sys.version_info[0] > 2:
base64 = base64.decode()
return base64
def dictToStr(self, data):
'''将Dict转为List并且拼接成字符串'''
l = []
for k, v in data.items():
l.append(str(k) + "=" + str(v))
return "&".join(l)
def generate_sign_str(self, dictData):
'''对字典进行排序;并拼接成请求字符串'''
tempList = []
resultList = []
tempDict = {}
for eveKey, eveValue in dictData.items():
tempLowerData = eveKey.lower()
tempList.append(tempLowerData)
tempDict[tempLowerData] = eveKey
tempList.sort()
for eveData in tempList:
tempStr = str(tempDict[eveData]) + "=" + \
str(dictData[tempDict[eveData]])
resultList.append(tempStr)
return "&".join(resultList)
def generate_common_args(self):
'''请求签名,构建公共参数'''
common_args = {
'Action': "DescribeProject",
'Nonce': self.nonceData,
'Region': "ap-shanghai",
'SecretId': self.secret_id,
'Timestamp': int(self.timeData)
}
full_request_args = common_args
full_request_args["allList"] = 1
res_str = self.generate_sign_str(full_request_args) # ①对对参数排序并拼接字符串
requestStr = "%s%s%s%s%s%s" % (
self.requestMethod, self.httpProfile, "/", "v2/index.php", "?", res_str) # ②拼接签名原文字符串
sign_str = self.sign(self.secret_key,requestStr,self.signMethod) # ③生成签名串
signData = quote(sign_str,"utf-8") # ④签名串URL编码
full_request_args["Signature"] = signData # 将Signature键加入公共参数
return full_request_args
def generate_req_url(self):
'''生成请求地址'''
payload = self.generate_common_args()
requestUrl = "https://%s/v2/index.php?" % (self.httpProfile)
req_url = requestUrl + self.dictToStr(payload)
return req_url
def json_to_dict(self, str):
import json
dic = json.loads(str)
return dic
def get_region_projectName(self):
requestUrl = self.generate_req_url()
print(requestUrl)
try:
r = requests.get(requestUrl)
if r.status_code == 200:
context = r.text
objects_dic = self.json_to_dict(context)
print(objects_dic)
except Exception as e:
print(222,e)
return str(e)
if __name__ == "__main__":
secretId = "xxxx"
secretKey = "XXXXXX"
GL = GetInstanceList(secretId, secretKey)
GL.get_region_projectName()
相似问题