117 lines
4.3 KiB
Python
117 lines
4.3 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
import hmac
|
|||
|
|
import hashlib
|
|||
|
|
import time
|
|||
|
|
import json
|
|||
|
|
import requests
|
|||
|
|
from typing import Dict, Any, Optional
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ArmCloudSignatureV2:
|
|||
|
|
def __init__(self, access_key_id: str, secret_key: str, base_url: str = "https://api.xiaosuanyun.com"):
|
|||
|
|
self.access_key_id = access_key_id
|
|||
|
|
self.secret_key = secret_key
|
|||
|
|
self.base_url = base_url # 国内: https://api.xiaosuanyun.com 海外: https://openapi-hk.armcloud.net
|
|||
|
|
|
|||
|
|
def _calculate_signature(self, timestamp: str, path: str, body: str = "") -> str:
|
|||
|
|
"""计算HMAC-SHA256签名"""
|
|||
|
|
string_to_sign = timestamp + path + (body if body else "")
|
|||
|
|
signature = hmac.new(
|
|||
|
|
self.secret_key.encode('utf-8'),
|
|||
|
|
string_to_sign.encode('utf-8'),
|
|||
|
|
hashlib.sha256
|
|||
|
|
).hexdigest()
|
|||
|
|
return signature
|
|||
|
|
|
|||
|
|
def sign_get_request(self, path: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
|
|||
|
|
"""为GET请求生成签名头"""
|
|||
|
|
timestamp = str(int(time.time() * 1000))
|
|||
|
|
# query_string = ""
|
|||
|
|
if params:
|
|||
|
|
query_string = "&".join([f"{k}={v}" for k, v in params.items()])
|
|||
|
|
body = query_string
|
|||
|
|
else:
|
|||
|
|
body = ""
|
|||
|
|
|
|||
|
|
signature = self._calculate_signature(timestamp, path, body)
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"authver": "2.0",
|
|||
|
|
"x-ak": self.access_key_id,
|
|||
|
|
"x-timestamp": timestamp,
|
|||
|
|
"x-sign": signature
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def sign_post_request(self, path: str, data: Dict[str, Any]) -> Dict[str, str]:
|
|||
|
|
"""为POST请求生成签名头"""
|
|||
|
|
timestamp = str(int(time.time() * 1000))
|
|||
|
|
request_body = json.dumps(data, ensure_ascii=False, separators=(',', ':'))
|
|||
|
|
signature = self._calculate_signature(timestamp, path, request_body)
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"authver": "2.0",
|
|||
|
|
"x-ak": self.access_key_id,
|
|||
|
|
"x-timestamp": timestamp,
|
|||
|
|
"x-sign": signature,
|
|||
|
|
"Content-Type": "application/json"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def get(self, path: str, params: Optional[Dict[str, Any]] = None) -> requests.Response:
|
|||
|
|
"""发起GET请求"""
|
|||
|
|
headers = self.sign_get_request(path, params)
|
|||
|
|
url = self.base_url + path
|
|||
|
|
return requests.get(url, params=params, headers=headers)
|
|||
|
|
|
|||
|
|
def post(self, path: str, data: Dict[str, Any]) -> requests.Response:
|
|||
|
|
"""发起POST请求"""
|
|||
|
|
headers = self.sign_post_request(path, data)
|
|||
|
|
url = self.base_url + path
|
|||
|
|
request_body = json.dumps(data, ensure_ascii=False, separators=(',', ':'))
|
|||
|
|
return requests.post(url, data=request_body, headers=headers)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 使用示例
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 初始化客户端 - 根据地区选择域名
|
|||
|
|
# 国内用户
|
|||
|
|
# client = ArmCloudSignatureV2("ACP250915XAGEH03", "your_secret_key", "https://api.xiaosuanyun.com")
|
|||
|
|
# 海外用户
|
|||
|
|
client = ArmCloudSignatureV2("gz8f1u0t63byzdu6ozbx8r5qs3e5lipt", "3yc8c8bg1dym0zaiwjh867al", "https://openapi-hk.armcloud.net")
|
|||
|
|
|
|||
|
|
# POST请求示例 - 板卡列表查询(接口路径请参考OpenAPI文档)
|
|||
|
|
device_list_data = {
|
|||
|
|
"page": 1,
|
|||
|
|
"rows": 10,
|
|||
|
|
"padCodes": ["AC21020010391"],
|
|||
|
|
"vmStatus": "1",
|
|||
|
|
"deviceStatus": "0"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 注意:此处路径仅为示例,实际路径请查看OpenAPI文档
|
|||
|
|
response = client.post("/openapi/open/device/list", device_list_data)
|
|||
|
|
print(f"板卡列表查询 Response: {response.status_code}")
|
|||
|
|
print(f"Response Body: {response.text}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"板卡列表查询 Error: {e}")
|
|||
|
|
|
|||
|
|
# POST请求示例 - 创建云实例(接口路径和参数请参考OpenAPI文档)
|
|||
|
|
create_instance_data = {
|
|||
|
|
"clusterCode": "001",
|
|||
|
|
"specificationCode": "m2-3",
|
|||
|
|
"imageId": "img-25080826717",
|
|||
|
|
"screenLayoutCode": "realdevice_1440x3120x560",
|
|||
|
|
"number": 2,
|
|||
|
|
"dns": "8.8.8.8",
|
|||
|
|
"storageSize": 16,
|
|||
|
|
"realPhoneTemplateId": 36
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 注意:此处路径仅为示例,实际路径请查看OpenAPI文档
|
|||
|
|
response = client.post("/openapi/open/pad/net/storage/res/create", create_instance_data)
|
|||
|
|
print(f"创建云实例 Response: {response.status_code}")
|
|||
|
|
print(f"Response Body: {response.text}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"创建云实例 Error: {e}")
|