首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DescribeProject接口,提示4100错误 ????

DescribeProject接口,提示4100错误 ????

提问于 2019-04-15 11:20:24
回答 2关注 0查看 440

使用python3调用此接口时提示

{'code': 4100, 'codeDesc': 'AuthFailure', 'message': '身份认证失败,用户身份验证失败'}

代码应该问题

几个点已经排查

  1. 签名方法参考的是 : https://cloud.tencent.com/document/product/378/4378
  2. 对字典参数排序自己写的函数如下:
# -*-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()

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档