以前工作中寫指令碼訪問阿里雲的資源時,都是通過呼叫系統命令(呼叫cli工具)的方式,這次嘗試通過http請求來實現想要的操作。
本次實現中遇到的問題:
1、向api傳送請求是總是返回報錯:specified parameter version is not valid,從報錯上看是引數中設定的version的值有問題,但反覆核實請求中帶的version並沒有問題。
解決方法:如果你遇到同樣的問題,估計跟我一樣,構建好請求url後,在向api傳送請求時也是以呼叫系統命令(curl)的方式來實現的,這裡要把請求的url用引號引起來,形式如下:cmd = "curl 『 ",具體為什,據說是因為url中的&符號,是乙個命令列執行後台掛起的標誌,導致curl命令執行與預期不符,我並沒有去驗證,大體上應該就是這麼回事了
2、在解決了上乙個問題後,再次傳送請求,返回結果為:errorcode:incompletesignature,msg:「the request signature does not conform to aliyun standards.」
解決方法:報錯很明顯是計算得到的簽名signature有問題,問題出在待簽名字串上,待簽名字串中的引數部分,我只對它進行了一次urlencode操作,還需要再進行一次percentencode操作,將其中的等號「=」,編碼成%3d
下面記錄一下**的實現,學過的東西還是要多複習,畢竟編碼經驗還不純熟。(我安裝的是python3.7的版本)
import datetime, urllib.request, urllib.parse, hmac, base64, os, json ,uuid
#阿里雲的accesskey,accesskeysecret,endpoint
ak="aosdokewlaf******x"
sk="osisadfssakf************x"
endpoint=
""#計算時間戳引數,使用的是utc時間,並格式化成指定的格式
timestamp = datetime.datetime.utcnow(
).strftime(
"%y-%m-%dt%h:%m:%sz"
)#下面三個引數要求全域性唯一,使用uuid生成隨機字串
#clienttoken = str(uuid.uuid4()) #本示例中用不到
#token = str(uuid.uuid4()) #本示例中用不到
signaturenonce =
str(uuid.uuid4())
#參考api文件,定義公共引數
slbcommonparam =
#自定義引數,即阿里雲的api和api請求的引數,示例中簡單新增兩個引數
customparams =
#下面根據阿里雲文件計算待簽名字串
#def generatetosignstr(commonparams,customparams):
#首先合併公共引數和自定義引數,然後排序
sumparams =
sortedparams =
sorted
(sumparams.items(
), key=
lambda x: x[0]
)#然後對合併排序後的引數進行urlencode編碼,得到的是多個key=value的鍵值對通過&符號連線後組成的字串
urlencodeparams = urllib.parse.urlencode(sortedparams)
#再處理一次,將urlencode後的字串中的「=」和「&」進行percent編碼
urlencodeparams = urllib.parse.quote_plus(urlencodeparams)
#最後生成待簽名字串
tosignstr =
"get"
+"&"
+urllib.parse.quote_plus(
"/")
+"&"
+urlencodeparams
#計算簽名
h = hmac.new(
(sk+
"&")
.encode(
),tosignstr.encode,
"sha1"
)signature = base64.encodebytes(h.digest())
.strip(
).decode(
)#將signature新增到請求引數,生成請求url
sumparams[
"signature"
]= signature
url = endpoint+
"?"+urllib.parse.urlencode(sumparams)
#傳送請求並列印結果
# response = os.popen("curl " + "'" + url + "'")
response = urllib.request.urlopen(url)
#先將結果轉換成字典,再轉換成json物件,格式化輸出
res = json.load(response)
print
(json.dumps(res, sort_keys=
true
, indent=2)
)
用python實現生成sign的方法
每個單位都有自己的計算sign欄位的方法,沒有參考性,只是記錄下思路 import time import hashlib def get sign apidata commomdata finaldata 建立乙個空字典 finaldata.update commomdata finaldata....
python雲計算服務 阿里雲python 雲計算
阿里雲python 雲計算 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等...
Python接入阿里雲oss實現上傳檔案
阿里雲物件儲存服務 object storage service,簡稱 oss 是阿里雲提供的海量 安全 低成本 高可靠的雲儲存服務。其資料設計永續性不低於 99.999999999 服務設計可用性不低於 99.99 具有與平台無關的 restful api 介面,我們可以在任何應用 任何時間 任何...