如何调用天翼云服务器API? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
产品推荐: 1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>; 2、高防物理服务器20核/16G/50M/500G防御仅350元,点击抢购>>> 3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>> 4、阿里云服务器2核2G3M仅99元/年、2核4G5M仅199元/年,新老同享,点击抢购>>> 5、腾讯云服务器2核2G4M仅99元/年、新老同享,点击抢购>>> 要调用天翼云服务器API,先来了解一下天翼云API构造请求: 1)请求的URI 例如:{URI-scheme}://{Endpoint}/{resource-path}?{query-string}
2)请求方法
3) 请求消息头
接下来需要认证鉴权: 1)信息的获取 云网平台获取 登录云网门户,在“控制台”->“个人中心”->“第三方账号绑定”,通过创建或者查看获取ak,sk。 2)基本签名流程 ctyun-eop-ak/ctyun-eop-sk基本签名流程 1、待签字符串:使用规范请求和其他信息创建待签字符串; 2、计算密钥:使用HEADER、ctyun-eop-sk、ctyun-eop-ak来创建Hmac算法的密钥; 3、计算签名:使用第三步的密钥和待签字符串在通过hmacsha256来计算签名。 4、签名应用:将生成的签名信息作为请求消息头添加到HTTP请求中。 3)创建待签名字符串 待签名字符串的构造规则如下: 待签名字符串=需要进行签名的Header排序后的组合列表+ "\n" + 排序的query + "\n" + toHex(sha256(原封的body))
排序的header例子: 假设你需要将ctyun-eop-request-id、eop-date、host都要签名,则待签名的header构造出来是: ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\nhost:1.1.1.1:9080\n ctyun-eop-request-id、eop-date和host的排序就是这个顺序,如果你加入一个ccad的header;同时这个header也要是进行签名,则待签名的header组合: ccda:123\n ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\nhost:1.1.1.1:9080\n 4)构造动态密钥 发起请求时,需要构造一个eop-date的时间,这个时间的格式是yyyymmddTHHMMSSZ;言简意赅一些,就是年月日T时分秒Z 1、先是拿你申请来的ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime 2、拿ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk; 3、拿kAk作为密钥,eop-date的年月日值作为数据;算出kdate
5)签名应用及示例 由“构造动态秘钥”和“创建待签名字符串”分别的出来的待签名字符串string_sigture、kdate生成出Sigture;
由上得到Eop-Authorization,然后将数据整合成HEADER放在http_client内,发出即可。 http_client所需请求头部如下: Eop-Authorization: ctyun-eop-ak Header= ctyun-eop-request-id;eop-date Signature=xad01/ada eop-date:20211221T163614Z ctyun-eop-request-id: 123456789 (注:若需要进行签名的Header不止默认的ctyun-eop-request-id和eop-date,需要在http_client的请求头部中加上,并且Eop-Authorization中也需要增加) 下面来看一下Python调用示例: # -*- coding: utf8 -*- import requests import json import hashlib import base64 import hmac import datetime import uuid METHOD_GET = 'GET' METHOD_POST = 'POST' # 官网accessKey AK = '3d98d123d633xxxxxxxxxxx5a60d4bb3' # 官网securityKey SK = '173615ae4177xxxxxxxxxxxd17b1c3ed' def hmac_sha256(secret, data): secret = bytearray(secret) data = bytearray(data) return hmac.new(secret, data, digestmod=hashlib.sha256).digest() def base64_of_hmac(data): return base64.b64encode(data) def get_request_uuid(): return str(uuid.uuid1()) def get_sorted_str(data): """ 鉴权用的参数整理 :param data: dict 需要整理的参数 :return: str """ sorted_data = sorted(data.items(), key=lambda item: item[0]) str_list = map(lambda x_y: '%s=%s' % (x_y[0], x_y[1]), sorted_data) return '&'.join(str_list) def build_sign(query_params, body_params, eop_date, request_uuid): """ 计算鉴权字段 :param query_params: dict get请求中的参数 :param body_params: dict post请求中的参数 :param eop_date: str 请求时间,格式为:'%Y%m%dT%H%M%SZ' :return: str """ # body_str = json.dumps(body_params) if body_params else '' body_str = json.dumps(body_params) body_digest = hashlib.sha256(body_str.encode('utf-8')).hexdigest() # 请求头中必要的两个参数 header_str = 'ctyun-eop-request-id:%s\neop-date:%s\n' % (request_uuid, eop_date) # url中的参数,或get参数 query_str = get_sorted_str(query_params) signature_str = '%s\n%s\n%s' % (header_str, query_str, body_digest) print_log(repr('signature_str is: %s' % signature_str)) sign_date = eop_date.split('T')[0] # 计算鉴权密钥 k_time = hmac_sha256(SK, eop_date) k_ak = hmac_sha256(k_time, AK) k_date = hmac_sha256(k_ak, sign_date) signature_base64 = base64_of_hmac(hmac_sha256(k_date, signature_str)) # 构建请求头的鉴权字段值 sign_header = '%s Headers=ctyun-eop-request-id;eop-date Signature=%s' % (AK, signature_base64) return sign_header def get_sign_headers(query_params, body): """ 获取鉴权用的请求头参数 :param query_params: dict get请求中的参数 :param body: dict post请求中的参数 :return: """ now = datetime.datetime.now() eop_date = datetime.datetime.strftime(now, '%Y%m%dT%H%M%SZ') request_uuid = get_request_uuid() headers = { # 三个鉴权用的参数 'eop-date': eop_date, 'ctyun-eop-request-id': request_uuid, 'Eop-Authorization': build_sign(query_params=query_params, body_params=body, eop_date=eop_date, request_uuid=request_uuid), } return headers def get(url, params=None, header_params=None, get_body=None): return execute(url, method=METHOD_GET, params=params, header_params=header_params, get_body=get_body) def post(url, params=None, header_params=None): return execute(url, method=METHOD_POST, params=params, header_params=header_params) def execute(url, method, params=None, header_params=None, get_body=None): get_body = get_body or {} params = params or {} header_params = header_params or {} query_params, body = (params, get_body) if method == METHOD_GET else ({}, params) headers = get_sign_headers(query_params, body) headers.update(header_params) print_log(u'url: %s' % url) print_log(u'请求方式: %s' % method) print_log(u'请求头: %s' % headers) print_log(u'请求参数: %s' % params) if method == METHOD_GET: res = requests.get(url, params=params, headers=headers, verify=False, json=get_body) else: res = requests.post(url, json=params, headers=headers, verify=False) print_log(u'返回状态码: %s' % res.status_code) print_log(u'返回: %s' % res.text) return res def print_log(log_info): now = datetime.datetime.now() log_info = u'[%s]: %s' % (str(now), log_info) print log_info post("https://ctecs-global.ctapi.ctyun.cn/v4/ecs/instance-list", params={ "regionID": "bb9fdb42056f11eda1610242ac110002", "azName": "cn-huadong1-jsnj1A-public-ctcloud" }) 点击这里注册天翼云特邀VIP帐号,立即体验天翼云主机>>> |