python實現阿里雲Signature簽名計算

2021-10-07 06:43:08 字數 2616 閱讀 8983

以前工作中寫指令碼訪問阿里雲的資源時,都是通過呼叫系統命令(呼叫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 介面,我們可以在任何應用 任何時間 任何...