169
云计算
负载均衡
产品简介
产品价格
快速入门
用户指南
实践操作
常见问题
购买指南
云服务器
产品简介
计费规则
购买指导
控制台使用指南
常见问题
云数据库
产品简介
计费规则
购买指导
快速入门
连接实例
控制台使用指南
对象存储
产品简介
控制台使用指南
程序员百科
Python
如何调用天翼云服务器API?

产品推荐:

1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>

2、高防物理服务器20核/16G/50M/200G防御仅350元,点击抢购>>>

3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>>


点击这里注册天翼云特邀VIP帐号,立即体验天翼云主机>>>

要调用天翼云服务器API,先来了解一下天翼云API构造请求:

1)请求的URI

例如:{URI-scheme}://{Endpoint}/{resource-path}?{query-string}

参数描述是否必选
URI-scheme用于传输请求的协议,当前所有API均采用HTTPS协议。
Endpoint当前资源池或者通用的域名
resource-path资源路径,也即API访问路径。从具体API的URI模块获取,例如“获取用户1信息”API的resource-path为“/users/1”。
query-string查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?userID=1”,表示查询用户ID为1的数据。

2)请求方法

方法说明
GET请求服务器返回指定资源。
PUT请求服务器更新指定资源。
POST请求服务器新增资源或执行特殊操作。
DELETE请求服务器删除指定资源,如删除对象等。
HEAD请求服务器资源头部。
PATCH请求服务器更新资源的部分内容。当资源不存在的时候,PATCH可能会去创建一个新的资源。

3) 请求消息头

名称描述

Content-Type消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。application/json
................


接下来需要认证鉴权:


1)信息的获取

云网平台获取

登录云网门户,在“控制台”->“个人中心”->“第三方账号绑定”,通过创建或者查看获取ak,sk。

1.png

2.png

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排序后的组合列表(排序的header)header 以 header_name:header_value来一个一个通过\n拼接起来,EOP是强制要求ctyun-eop-request-id和eop-date这个头作为Header中的一部分,并且必须是待签名Header里的一个。需要进行签名算法的Header需要进行排序(将它们的header_name以26个英文字母的顺序来排序),将排序后得到的列表进行遍历组装成待签名的header。
排序的queryquery以&作为拼接,key和值以=连接,排序规则使用26个英文字母的顺序来排序,Query参数全部都需要进行签名
toHex(sha256(原封的body))传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制

排序的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

eop-dateyyyymmddTHHMMSSZ(20211221T163614Z)(年月日T时分秒Z)
Ktime使用ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime;Ktime = hmacSha256(ctyun-eop-sk, eop-date)
kAk使用ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk;kAk = hmacsha256(ktime,ctyun-eop-ak)
kdate使用kAk作为密钥,eop-date的年月日值作为数据;算出kdate;kdate = hmacsha256(kAk, eop-date)

5)签名应用及示例

由“构造动态秘钥”和“创建待签名字符串”分别的出来的待签名字符串string_sigture、kdate生成出Sigture;

Sigture待签名字符串string_sigture、kdate;再根据hmacsha256(kdate,string_sigture)得出的结果,再将结果进行base64编码得出Sigture
Eop-Authorizationctyun-eop-ak Header=你构造待签名字符串时的header排序 Signature(注意中间有空格)header排序以分号”;”拼接例子所述:你待签名的字符串header顺序是 eop-date和host;那么你加到header里的值就是Eop-Authorization: ctyun-eop-ak Header=eop-date;host Signature=xad01/ada

由上得到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帐号,立即体验天翼云主机>>>

这条帮助是否解决了您的问题? 已解决 未解决

提交成功!非常感谢您的反馈,我们会继续努力做到更好! 很抱歉未能解决您的疑问。我们已收到您的反馈意见,同时会及时作出反馈处理!