最近有時間研究了一下阿里雲api使用手冊,對api 進行簡單封裝了一下,能夠簡化阿里雲 api調用。 #-*- coding: utf-8 -*- # author: sunwei import json import uuid from urllib import request import hmac,base64 from hashlib import sha1 from datetime import datetime, timedelta, timezone,date from urllib.parse import urlencode,quote from abc import ABCMeta,abstractclassmethod class BaseSignature(object): __metaclass__ = ABCMeta def __init__(self,Access_Key_Id,Access_key_secret,Format='JSON'): self.AccessKeyId = str(Access_Key_Id) self.AccessKeySecret = str(Access_key_secret) self.SignatureMethod = 'HMAC-SHA1' self.SignatureVersion = '1.0' self.SignatureNonce = str(uuid.uuid4()) self.Format = Format self.Action = '' self.Version = '' def params(self): self.D = {} self.D['Action'] = self.Action self.D.update(self.kv) self.kv.clear() self.D['SignatureMethod'] = self.SignatureMethod self.D['AccessKeyId'] = self.AccessKeyId self.D['SignatureVersion'] = self.SignatureVersion self.D['SignatureNonce'] = self.SignatureNonce self.D['Timestamp'] = self._UtcTimeStamp() self.D['Version'] = self.Version self.D['Format'] = self.Format def _ToSign(self): sortedD = sorted(self.D.items(), key=lambda x: x[0]) canstring = '' for k, v in sortedD: #print(k,v) canstring += '&' + self.percentEncode(k) + '=' + self.percentEncode(v) stringToSign = 'GET&%2F&' + self.percentEncode(canstring[1:]) return stringToSign.encode('utf-8') def Signature(self): key = (self.AccessKeySecret + '&').encode('utf-8') v = self._ToSign() h = hmac.new(key , v, sha1) return base64.encodebytes(h.digest()).strip().decode('utf-8') def percentEncode(self,s): res = quote(s,'') res = res.replace('+', '%20') res = res.replace('*', '%2A') res = res.replace('%7E', '~') return res def _UtcTimeStamp(self): return (datetime.now() - timedelta(hours=8)).strftime('%Y-%m-%dT%XZ') def urlencode(self): self.params() self.D['Signature'] = self.Signature() return urlencode(self.D) @abstractclassmethod def url(self): pass class BaseApi(BaseSignature): Version = '' Baseurl = '' def __init__(self, Access_Key_Id, Access_key_secret,Format='JSON'): super(BaseApi,self).__init__(Access_Key_Id, Access_key_secret, Format) def url(self,**kwargs): kv = kwargs self.Action = kv.pop('Action') self.SignatureNonce = str(uuid.uuid4()) self.kv = kv d = {k: v for k, v in self.__class__.__dict__.items() if not k.startswith('_') and not k.startswith('Baseurl')} self.Version = d.pop('Version') return self.Baseurl + self.urlencode() from urllib.error import URLError,HTTPError class DecodeData(object): def __call__(self,url): try: response = request.urlopen(request.Request(url)).read() #de = response.decode('utf-8') de = json.loads(response) ddd = json.dumps(de,indent=4) except HTTPError as e: ddd = {'Data': e.msg} return ddd class DomainApi(BaseApi): """ Usage : r = DomainApi(accesskeys,accesskeys_secrey) r.url(Action='QueryDomainList',PageNum = '1',PageSize = '20') """ Version = '2018-01-29' Baseurl = 'https://domain.aliyuncs.com/?' class RegionApi(BaseApi): Version = '2014-05-26' Baseurl = "https://ecs.aliyuncs.com/?" class EcsApi(BaseApi): Baseurl = 'https://ecs.aliyuncs.com/?' Version = '2014-05-26' class RdsApi(BaseApi): Baseurl = 'https://rds.aliyuncs.com/?' Version = '2014-08-15' class SlbApi(BaseApi): Baseurl = 'https://slb.aliyuncs.com/?' Version = '2014-05-15' class VpcApi(BaseApi): Baseurl = 'https://vpc.aliyuncs.com/?' Version = '2016-04-28' class VpcApi(BaseApi): """ dnat : DescribeForwardTableEntries """ Baseurl = "https://vpc.aliyuncs.com/?" Version = "2016-04-28"