阿里云首页

使用Python脚本生成一个可以调用的API URL

概述

某些API接口需要通过字符转换、参数拼接和签名等操作实现接口调用,如果您需要通过CURL或者浏览器直接进行API接口调用,可参见本方案生成API URL地址。本文主要介绍如何生成一个直接可以通过CURL和浏览器访问的API接口地址。

详细信息

说明:使用脚本前,建议先阅读相关文档,了解产品的公共参数、API接口参数、加密过程。根据文档说明,对参考脚本中的access_key_idaccess_key_secret、服务地址server_address、API接口参数user_params 、公共参数parameters进行调整,然后在Python环境下执行即可获取到对应的请求链接。

本文以ECS DescribeInstances接口为例,使用Python脚本生成一个可以直接调用的API URL,脚本内容如下,以下脚本在Python 2.6.0环境中验证可用,需要在相应的操作系统中安装Python 2.X.X的执行环境,然后把代码复制到IDE(类似于Pycharm)或者文本编辑器(类似于Sublime Text)中执行。

#!/usr/bin/env python
#coding: utf-8
import sys,os
import urllib,urllib2
import base64
import hmac
import hashlib
from hashlib import sha1
import time
import uuid
import json
access_key_id = 'LTAI*******yxefv'
access_key_secret = 'nohb*************PEdln'
server_address = 'https://ecs.aliyuncs.com'

user_params = {'Action': 'DescribeInstances', 'RegionId': 'cn-hangzhou', 'VpcId': 'vpc-bp******wtww','VSwitchId':'vsw-bp******tjo0'}
def percent_encode(encodeStr):
 encodeStr = str(encodeStr)
 res = urllib.quote(encodeStr.decode('utf8').encode('utf8'), '')
 res = res.replace('+', '%20')
 res = res.replace('*', '%2A')
 res = res.replace('%7E', '~')
 return res


def compute_signature(parameters, access_key_secret):
 sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0])
 canonicalizedQueryString = ''
 for (k,v) in sortedParameters:
  canonicalizedQueryString += '&' + percent_encode(k) + '=' + percent_encode(v)
  stringToSign = 'GET&%2F&' + percent_encode(canonicalizedQueryString[1:])
 print "stringToSign:"+stringToSign
 h = hmac.new(access_key_secret + "&", stringToSign, sha1)
 signature = base64.encodestring(h.digest()).strip()
 return signature


def compose_url(user_params):
 timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time()))
 parameters = {
  'Format' : 'JSON',
  'Version': '2014-05-26',
  'AccessKeyId' : access_key_id,
  'SignatureVersion': '1.0',
  'SignatureMethod' : 'HMAC-SHA1',
  'SignatureNonce': str(uuid.uuid1()),
  'Timestamp' : timestamp
 }
 for key in user_params.keys():
  parameters[key] = user_params[key]
 signature = compute_signature(parameters, access_key_secret)
 parameters['Signature'] = signature
 url = server_address + "/?" + urllib.urlencode(parameters)
 return url


def make_request(user_params, quiet=False):
 url = compose_url(user_params)
 print url

make_request(user_params)

脚本执行结果类似如下。

相关文档

适用于

  • 云服务器 ECS
首页 使用Python脚本生成一个可以调用的API URL