腾讯云api调用

背景

随着业务上云,云资源也逐步增多。需要批量操作的如果还是通过控制台人肉运维操作不仅效率低下而且容易出错,并且不能做到定时操作。

腾讯云api介绍

目前腾讯云产品很多api已有封装好的SDK(API 3.0),这为调用云产品的api提供了很大的方便和简洁,大大提高了开发和运维效率。但是有的云产品还没有配套的SDK,对于这种云产品只能通过计算签名然后拼接字符串去调用。

1
2
3
4
# 腾讯SDK explorer,封装好的SDK以及控制台在线调用。
https://console.cloud.tencent.com/api/explorer
# 安装腾讯云SDK,python
pip install tencentcloud-sdk-python
  • API概览

    1
    2
    3
    这里提供了调用api的Action,定义操作
    不同的Action有不同的必要输入参数
    https://cloud.tencent.com/document/api/302/4031
  • 请求结构
    包含:服务地址、通信协议、请求方法、请求参数和字符编码组成。

    • 服务地址

      1
      2
      API支持就近地域接入,例如上海地域的cvm接口域名地址:cvm.ap-shanghai.tencentcloudapi.com,如果对调用无时延要求,也可不加地址:cvm.tencentcloudapi.com
      https://cloud.tencent.com/document/api/213/15691
    • 通信协议

      1
      腾讯云 API 的大部分接口都通过 HTTPS 进行通信,为您提供高安全性的通信通道。
    • 请求方法

      1
      腾讯云 API 同时支持POST和GET请求
    • 请求参数

      1
      腾讯云 API 的每个请求都需要指定两类参数:公共请求参数以及接口请求参数。
    • 字符编码

      1
      腾讯云 API 的请求及返回结果均使用 UTF-8 字符集进行编码
  • 公共请求参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 必选参数
    Action: 具体操作的指令接口名称
    Region: 地域参数,用来标识希望操作哪个地域的实例。
    Timestamp: 当前 UNIX 时间戳,可记录发起 API 请求的时间。
    Nonce: 用户可自定义随机正整数,与 Timestamp 联合起来, 用于防止重放攻击。
    SecretId: 在 云API密钥 上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey , 而 SecretKey 会用来生成请求签名 Signature。
    Signature: 请求签名,用来验证此次请求的合法性,需要用户根据实际的输入参数计算得出。
    # 可选参数
    SignatureMethod: 签名方式,目前支持 HmacSHA256 和 HmacSHA1。只有指定此参数为 HmacSHA256 时,才使用 HmacSHA256 算法验证签名,其他情况均使用 HmacSHA1 验证签名。
    Token: 临时证书所用的 Token,需要结合临时密钥一起使用。长期密钥不需要 Token。
  • 接口请求参数

    1
    接口请求参数与具体的接口有关,不同的接口支持的接口请求参数也不一样。接口请求参数的首字母均为小写,以此区分于公共请求参数。
  • 最终请求形式

    1
    2
    3
    4
    5
    6
    腾讯云 API 接口请求 URL 的拼接规则为:
    https:// + 请求域名 + 请求路径 + ? + 最终请求参数串
    # 组成部分说明:
    # 请求域名:请求域名由接口所属的产品或所属产品的模块决定,不同产品或不同产品的模块的请求域名会有不同,如腾讯云 CVM 的查询实例列表(DescribeInstances)的请求域名为:cvm.api.qcloud.com。具体产品请求域名详见各接口说明。
    # 请求路径: 腾讯云 API 对应产品的请求路径,一般是一个产品对应一个固定路径(如腾讯云 CVM 请求路径固定为 /v2/index.php)。
    # 最终请求参数串: 接口的请求参数串包括公共请求参数和接口请求参数。

API请求签名

1
腾讯云 API 会对每个访问的请求进行身份验证,即每个请求都需要在公共请求参数中包含签名信息(Signature),以验证用户身份。签名信息由用户所执有的安全凭证生成.

生成签名串
有了安全凭证 SecretId 和 SecretKey 后,就可以生成签名串了。生成签名串的详细过程如下:

mark

  • 对参数排序

    1
    首先对所有请求参数按参数名做字典序升序排列。(所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。)
  • 拼接请求字符串

    1
    2
    3
    此步骤将生成请求字符串。
    将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式,如对 Action 参数,其参数名称为"Action",参数值为"DescribeInstances",因此格式化后就为 Action=DescribeInstances。
    然后将格式化后的各个参数用"&"拼接在一起。
  • 拼接签名原文字符串

    1
    2
    3
    4
    5
    6
    7
    8
    此步骤将生成签名原文字符串。
    签名原文字符串的拼接规则为:
    请求方法 + 请求主机 +请求路径 + ? + 请求字符串
    # 参数构成说明:
    # 请求方法: 支持 POST 和 GET 方式,这里使用 GET 请求, 注意方法为全大写。
    # 请求主机:即主机域名,请求域名由接口所属的产品或所属产品的模块决定,不同产品或不同产品的模块的请求域名会有不同。如腾讯云 CVM 的查询实例列表(DescribeInstances)的请求域名为:cvm.api.qcloud.com,具体产品请求域名详见各接口说明。
    # 请求路径: 腾讯云 API 对应产品的请求路径,一般是一个产品对应一个固定路径,如腾讯云 CVM 请求路径固定为/v2/index.php。
    # 请求字符串: 即上一步生成的请求字符串。
  • 生成签名串

    1
    2
    此步骤生成签名串
    计算签名的方法有两种:HmacSHA256 和 HmacSHA1 这里要根据您指定的签名算法(即 SignatureMethod 参数)生成签名串。当指定 SignatureMethod 为 HmacSHA256 时,需要使用 HmacSHA256 计算签名,其他情况请使用 HmacSHA1 计算签名。
  • 签名串编码

    1
    生成的签名串并不能直接作为请求参数,需要对其进行 URL 编码。

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import base64,hashlib,hmac
import time,random
import requests

# api密钥
id = 'AKIDENN***********4U6'
key = 'e6Rac********Jt1'

# 根据请求公共参数,自定义数据字典
data = {
# Action 定义操作(在API概览里查看),本例是用的云解析
'Action': 'RecordList',
'Region': 'ap-shanghai',
'Nonce': random.randint(10000, 99999),
'SecretId': id,
'Timestamp': int(time.time()),
'domain': 'key1024.cn',
}

# 请求接口地址
url = 'cns.api.qcloud.com/v2/index.php'

# 对所有请求参数排序
signature_old = ''
for i in sorted(data):
signature_old = signature_old + i + "=" + str(data[i]) + "&"
signature_old = signature_old[:-1]

# 拼接请求字符串
query = 'GET' + url + '?' + signature_old

# 使用加密算法生产请求签名
hmac_str = hmac.new(key.encode('utf-8'), query.encode('utf-8'), hashlib.sha1).digest()
signature = base64.b64encode(hmac_str)
# print(signature)
# 将signature加入data字典中
data['Signature'] = signature

resp = requests.get('https://' + url ,params=data)
print(resp.content.decode('utf-8'))

mark

反思总结

结合任务计划定时执行某些操作,而且可使用无服务函数,摆脱传统服务器环境去执行脚本。

-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。