閱讀864 返回首頁    go 阿裏雲 go 技術社區[雲棲]


10分鍾教你使用阿裏雲API

    我也是從13年才正式開始接觸阿裏雲的,在2014年才開始用,當時可能有些自動化的需求但是沒有找到“python SDK”,所以自己就寫了個簡單的通用SDK。最近發現用阿裏雲的朋友越來越多,今天分享給大家,這裏以負載均衡服務為例子。

    阿裏雲API核心:拚接請求參數把Access Key ID”放到請求參數裏麵“相當於用戶名”,把url的參數用“Access Key Secret”進行sha1混淆加密生成把簽名追加入請求參數。這樣這個簽名就可以保證參數的完整和安全不可逆轉。


[公共參數參考傳送門]

[簽名機製傳送門]

我嚐試用圖片流程還原了整個API的請求過程,大家可以參考這個過程進行API調用:


首先API是通過http/https進行訪問的,以GET請求為例,

1. 參數內分為:user_param,公共參數,url編碼參數並拚接成url使用的參數形式。

2. 這裏詳細說下簽名的獲取方法:url使用的參數形式添加HTTPmethod&拚接後,使用“Access Key Secret”為salt調用hashlib.sha1算法加密,然後使用base64編碼使用生成簽名

3.把訪問服務的"http協議"+"域名"+"參數"+"簽名"=請求地址

b6b7bc2e1211ba9b3ef8635c10ee3913a1730dbc



下麵是我要分享的自己寫的代碼,歡迎各位拍磚QQ:850900633


https://github.com/bashhu/blog/blob/master/test/aliyun_api_sdk_v2.py

# coding=utf-8
"""
__created__ =  2017/6/9 17:33
__author__ = 'baishaohua'
# @Site    : https://github.com/bashhu
"""

import os, sys
import hashlib
import hmac
import base64
import urllib
import time
import uuid
import requests


def get_iso8601_time():
    '''返回iso8601格式的時間'''
    TIME_ZONE = "GMT"
    FORMAT_ISO8601 = "%Y-%m-%dT%H:%M:%SZ"
    return time.strftime(FORMAT_ISO8601, time.gmtime())


def get_uuid():
    '''返回uuid'''
    return str(uuid.uuid4())


def get_parameters(user_param, Action, AccessKeyId, Version):
    '''
    拚接參數字典
    user_param: {"RegionId":"cn-beijing", "LoadBalancerName":"test-node1", "AddressType":"intranet", "VSwitchId":"vsw-2zevjlczuvp2mkhhch12x"}
    Action操作例如:CreateLoadBalancer
    AccessKeyId:access key ID
    Version: 接口的版本
    '''
    parameters = {}
    parameters['HTTPMethod'] = 'GET'
    parameters['AccessKeyId'] = AccessKeyId
    parameters['Format'] = 'json'
    parameters['Version'] = Version
    parameters['SignatureMethod'] = 'HMAC-SHA1'
    parameters['Timestamp'] = get_iso8601_time()
    parameters['SignatureVersion'] = '1.0'
    parameters['SignatureNonce'] = get_uuid()
    parameters['Action'] = Action
    for (k, v) in sorted(user_param.items()):
        parameters[k] = v
    return parameters


def get_param(parameters):
    '''把公共參數拚接成字符串'''
    param_str = ''
    for (k, v) in sorted(parameters.items()):
        param_str += "&" + urllib.quote(k, safe='') + "=" + urllib.quote(v, safe='')
    param_str = param_str[1:]
    return param_str


def get_StringToSign(parameters, param_str):
    '''拚接生成簽名的字符串'''
    StringToSign = parameters['HTTPMethod'] + "&%2F&" + urllib.quote(param_str, safe='')
    return StringToSign


def get_signature(StringToSign, AccessKeySecret):
    '''構建簽名'''
    h = hmac.new(AccessKeySecret, StringToSign, hashlib.sha1)
    signature = base64.encodestring(h.digest()).strip()
    return signature


def build_request(server_url, param_str, signature, AccessKeySecret):
    '''拚接url並進行請求'''
    Signature = "Signature=" + urllib.quote(signature)
    param = param_str + "&" + Signature
    request_url = server_url + param
    s = requests.get(request_url)
    print s.content

def get_regions(server_url, Action, user_param, AccessKeySecret, AccessKeyId, Version):
    '''對請求進行模塊
    server_url: slb.aliyun.com
    Action = 'DescribeRegions'
    AccessKeySecret, AccessKeyId:也就是ak
    user_param = {'LoadBalancerId': 'lb-2zekxu2elibyexxoo9hlw'}
    Version:例如slb的版本是2014-05-15,每個服務都不相同
    '''
    server_url = 'https://' + server_url + '/?'
    AccessKeySecret = AccessKeySecret
    AccessKeyId = AccessKeyId
    parameters = get_parameters(user_param, Action, AccessKeyId, Version)
    param_str = get_param(parameters)
    StringToSign = get_StringToSign(parameters, param_str)
    signature = get_signature(StringToSign, AccessKeySecret + '&')
    build_request(server_url, param_str, signature, AccessKeySecret)

'''
#create slb
Action = 'CreateLoadBalancer'
user_param = {"RegionId":"cn-beijing", "LoadBalancerName":"test-node1", "AddressType":"intranet", "VSwitchId":"vsw-2zevjlczuvp2mkhhch12x"}
server_url = 'slb.aliyuncs.com'
Version = '2014-05-15'
AccessKeySecret='xxx'
AccessKeyId='xxxx'
get_regions(server_url, Action, user_param, AccessKeySecret, AccessKeyId, Version)
#create user
Action = 'CreateUser'
user_param = {"UserName":"new.nginxs.net", "DisplayName":"xxxxx", "Email":"xxxx@126.com", "Comments":"測試用戶"}
server_url = 'ram.aliyuncs.com'
AccessKeySecret='xxx'
AccessKeyId='xxx'
Version = '2015-05-01'
get_regions(server_url, Action, user_param, AccessKeySecret, AccessKeyId, Version)
'''



防爬蟲:https://new.nginxs.net

https://nginxs.blog.51cto.com/

最後更新:2017-07-17 19:32:23

  上一篇:go  從數據化運營到數據產品化 —— 阿裏雲MVP趙瑋主題分享【3】
  下一篇:go  Vim技能修煉教程(14) - 寫個ex命令吧