【非官方教程】【视频】云API实践教程(上)

2018-07-17 09:18:56 浏览数 (1)

本教程非官方教程,所以仅供大家学习使用!


云API存在的目的是什么?有控制台给我们提供给中便利,我们为什么要用API来做一些操作?

腾讯云API怎么鉴权,怎么发送请求,怎么处理复杂类型,怎么做相关接口的组合?

很多问题,其实都是大家好奇的,所以,为了解决大家的疑问,也是抛砖引玉,我就决定录一套视频:

通过简单的签名,发送请求,组合应用,来作为基础,和大家分享腾讯云 云API的使用,通过Django等框架,来搭建一个自己的管理后台或者云产品控制台,来提高团队以后的工作效率,创造更多价值!

好了,废话不说了,先上四个视频:

视频1:

入门:签名 - 从云API到构建自己的控制台

视频2:

深入:数组类型和组合应用 - 从云API到构建自己的控制台

视频3:

深入:复杂类型和简单应用 -从云API到构建自己的控制台

视频4:

广告:APICoder的使用方法 - 从云API到构建自己的控制台

然后这四个视频可能用到的代码大约如下:

1:签名过程

代码语言:javascript复制
def sign(secretKey, signStr, signMethod):
    '''
    该方法主要是实现腾讯云的签名功能
    :param secretKey: 用户的secretKey
    :param signStr: 传递进来字符串,加密时需要使用
    :param signMethod: 加密方法
    :return:
    '''
    if sys.version_info[0] > 2:
        signStr = signStr.encode("utf-8")
        secretKey = secretKey.encode("utf-8")
 
    # 根据参数中的signMethod来选择加密方式
    if signMethod == 'HmacSHA256':
        digestmod = hashlib.sha256
    elif signMethod == 'HmacSHA1':
        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

2:字典到字符串的过程

代码语言:javascript复制
def dictToStr(dictData):
    '''
    本方法主要是将Dict转为List并且拼接成字符串
    :param dictData:
    :return: 拼接好的字符串
    '''
    tempList = []
    for eveKey, eveValue in dictData.items():
        tempList.append(str(eveKey)   "="   str(eveValue))
    return "&".join(tempList)
 

3:字典排序过程

代码语言:javascript复制
def signStrFun(dictData):
    '''
    本方法用来进行字典排序
    :param dictData:
    :return:
    '''
    tempList = []
    resultList = []
    tempDict = {}
    for eveKey,eveValue in dictData.items():
        tempLowerData = eveKey.lower()
        tempList.append(tempLowerData)
        tempDict[tempLowerData] = eveKey
    tempList.sort()
    for eveData in tempList:
        keyTempData = str(tempDict[eveData]).replace("_",".")
        tempStr = str(tempDict[eveData])   "="   str(dictData[tempDict[eveData]])
        resultList.append(tempStr)
    return "&".join(resultList)
 
 

4:复杂类型使用方法

代码语言:javascript复制
signDictData = {
    "Action":"DescribeRegions",
    "Nonce":nonceData,
    "Region":"ap-guangzhou",
    "SecretId":"AKID993qRrf91jKl9MeKJBxgJpDQRKApeFF5",
    "SignatureMethod":signMethod,
    "Timestamp":int(timeData),
    "Version":"2017-03-12",
    # 以下是复杂类型
    "Placement.Zone":"api-beijing-1",
}

6:数组类型使用方法

代码语言:javascript复制
signDictData = {
    "Action":"DescribeRegions",
    "Nonce":nonceData,
    "Region":"ap-guangzhou",
    "SecretId":"AKID993qRrf91jKl9MeKJBxgJpDQRKApeFF5",
    "SignatureMethod":signMethod,
    "Timestamp":int(timeData),
    "Version":"2017-03-12",
    # 以下两个是数组类型
    "InstanceIds.0":"abcdef",
    "InstanceIds.1":"abcde3",
}

7:一次完整的请求

代码语言:javascript复制
# -*- coding: utf-8 -*-
 
# 作者:Dfounderliu(刘宇)
# 程序功能:腾讯云API DEMO
# Python版本:Python 3.0
 
import binascii
import hashlib
import hmac
import sys
import urllib.parse
import urllib.request
import time
import random
 
def sign(secretKey, signStr, signMethod):
    '''
    该方法主要是实现腾讯云的签名功能
    :param secretKey: 用户的secretKey
    :param signStr: 传递进来字符串,加密时需要使用
    :param signMethod: 加密方法
    :return:
    '''
    if sys.version_info[0] > 2:
        signStr = signStr.encode("utf-8")
        secretKey = secretKey.encode("utf-8")
 
    # 根据参数中的signMethod来选择加密方式
    if signMethod == 'HmacSHA256':
        digestmod = hashlib.sha256
    elif signMethod == 'HmacSHA1':
        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(dictData):
    '''
    本方法主要是将Dict转为List并且拼接成字符串
    :param dictData:
    :return: 拼接好的字符串
    '''
    tempList = []
    for eveKey, eveValue in dictData.items():
        tempList.append(str(eveKey)   "="   str(eveValue))
    return "&".join(tempList)
 
 
def signStrFun(dictData):
    '''
    本方法用来进行字典排序
    :param dictData:
    :return:
    '''
    tempList = []
    resultList = []
    tempDict = {}
    for eveKey,eveValue in dictData.items():
        tempLowerData = eveKey.lower()
        tempList.append(tempLowerData)
        tempDict[tempLowerData] = eveKey
    tempList.sort()
    for eveData in tempList:
        keyTempData = str(tempDict[eveData]).replace("_",".")
        tempStr = str(tempDict[eveData])   "="   str(dictData[tempDict[eveData]])
        resultList.append(tempStr)
    return "&".join(resultList)
 
 
# 用户必须准备好的secretId和secretKey
# 可以在 https://console.cloud.tencent.com/capi 获取
secretId = "AKID993qRrf91jKl9MeKJBxgJpDQRKApeFF5"
secretKey = "wnU1gAXiiW9hIk1610seMuHTUKDez97u"
 
# 在此处定义一些必须的内容
# 时间戳
timeData = str(int(time.time()))
# Nonce,官网给的信息:随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
nonceData = int(random.random()*10000)
# uri,请参考官网
uriData = "cvm.tencentcloudapi.com"
# 加密方法
signMethod="HmacSHA256"
# 请求方法,在签名时会遇到,如果签名时使用的是GET,那么在请求时也请使用GET
requestMethod = "GET"
 
# 签名时需要的字典
# 首先对所有请求参数按参数名做字典序升序排列,所谓字典序升序排列,
# 直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增
# 顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二
# 个“字母”,依此类推。
# 此处可以考虑对key进行lower,然后sort,当然,本程序生成的是排序好的参数
signDictData = {
    "Action":"DescribeRegions",
    "Nonce":nonceData,
    "Region":"ap-guangzhou",
    "SecretId":"AKID993qRrf91jKl9MeKJBxgJpDQRKApeFF5",
    "SignatureMethod":signMethod,
    "Timestamp":int(timeData),
    "Version":"2017-03-12",
    "Placement.Zone":"api-beijing-1",
}
 
# 获得拼接的字符串,用于签名
# 此步骤生成请求字符串。 将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式,如对Action参数,
# 其参数名称为"Action",参数值为"DescribeInstances",因此格式化后就为Action=DescribeInstances。
# 注意:“参数值”为原始值而非url编码后的值。
# 然后将格式化后的各个参数用"&"拼接在一起,最终生成请求字符串。
# 此步骤生成签名原文字符串。 签名原文字符串由以下几个参数构成:
# 1) 请求方法: 支持 POST 和 GET 方式,这里使用 GET 请求,注意方法为全大写。
# 2) 请求主机:查看实例列表(DescribeInstances)的请求域名为:cvm.tencentcloudapi.com。实际的请求域名根据接口所属模块的不同而不同,详见各接口说明。
# 3) 请求路径: 当前版本云API的请求路径固定为 / 。 4) 请求字符串: 即上一步生成的请求字符串。
# 签名原文串的拼接规则为:
#   请求方法   请求主机  请求路径   ?   请求字符串
requestStr = "%s%s%s%s%s"%(requestMethod,uriData,"/","?",signStrFun(signDictData))
 
# 调用签名方法,同时将结果进行url编码,官方文档描述如下:
# 生成的签名串并不能直接作为请求参数,需要对其进行 URL 编码。 注意:如果用户的请求方法是GET,则对所有请求参
# 数值均需要做URL编码。 如上一步生成的签名串为 EliP9YW3pW28FpsEdkXt/ WcGeI= ,最终得到的签名串请求参数(Signature)
# 为: EliP9YW3pW28FpsEdkXt/+WcGeI= ,它将用于生成最终的请求URL。
signData = urllib.parse.quote(sign(secretKey,requestStr,signMethod))
 
# 上述操作是实现签名,下面即进行请求
# 先建立请求参数, 此处参数只在签名时多了一个Signature
actionArgs = signDictData
actionArgs["Signature"] = signData
 
# 根据uri构建请求的url
requestUrl = "https://%s/?"%(uriData)
# 将请求的url和参数进行拼接
requestUrlWithArgs = requestUrl   dictToStr(actionArgs)
 
# 获得response
responseData = urllib.request.urlopen(requestUrlWithArgs).read().decode("utf-8")
 
print(responseData)

之后,我还会发关于如何定制化构建自己的云产品控制台的例子,希望抛砖引玉,给大家思路。

最后也感谢大家的支持和鼓励哦!

关于为什么要做自己的管理后台,控制台,或者说为什么要学习腾讯云云API的相关解释:

这个实际上是对运维或者是大公司会有一些用途的。

像对服务器进行管理这类的云API的目的很大一部分都是为了提高效率。

例如,你是某运维,这次搞活动你要在不同区域建立若干服务器,传统的你,可能是要在腾讯云或者阿里云上面选择区域做一些配置,然后生成,而且不同地域的操作基本是类似的。当活动结束了,你要删除服务器,也需要做若干类似的重复的动作,这可能只是你搞一次活动,如果每年若干次活动,这是不是大大影响效率,如果我们可以通过云API,来组合成适合自己的高级应用,那么是不是就可以大大提高自己的工作效率,可以说写一次代码,以后每次活动都是点几下或者一条指令的事情了,这样就会提高效率创造价值了。

当然,更高级的应用不仅仅有这些,还有很多很多功能的组合使用,例如,你买了腾讯云或者阿里云的数据库,你不能一次买很大,这会很浪费,但是你可以买一个动态变化的,写一个脚本,一旦数据库达到一个阈值,那么自动通过API扩容,这样是不是会节约很多钱?就像我视频中说的,如果去面试大公司运维,说自己做了自动管理服务期的工具,来管理自己的服务器,这也一定是一个亮点。

当然,我这里只是拿腾讯云做了一个例子,也希望大家举一反三,通过腾讯云 云API的操作,通过我的抛砖引玉,组合出更高级的应用,提高我们的效率

0 人点赞