我在使用curl时很难调用Tuya API。
涂鸦需要生成如下签名:HMAC-SHA256(client_id + t, Secret)。我构建了一个小脚本,完全按照 Tuya 的要求进行操作。我还通过尝试使用其文档中的相同 client_id、t 和 Secret 来生成签名作为示例进行了双重检查,并且生成的签名与文档中的内容相匹配。
client_id 是一个预先分配的值 t 是 13 位的时间戳(这里我认为这是错误所在) Secret 是一个预先分配的值
签名构建完成后,需要在 POST 调用中通过curl使用,但涂鸦一直拒绝签名,并出现以下错误:
{"code":1004,"msg":"签名无效","成功":false,"t":1664314067553}
现在,我认为问题在于时机。为了让我的脚本生成签名需要几毫秒,并且当 t 的值传递给curl 时,它与curl 的执行不匹配(当然)。这是我的代码:
t=($(($(date +%s%N)/1000000))); sign1=$(echo -n "yyr8hxxxxxxxxd4mji$t" | openssl dgst -sha256 -hmac "cc75fd7xxxxxxxxx63d032b" | awk '{print$2}') && sign2=$(echo ${sign1^^}) ; curl --request POST "https://openapi.tuyaeu.com/v1.0/iot-03/devices/717715xxxxxxx520/commands" --header "sign_method: HMAC-SHA256" --header "client_id: yyr8hxxxxxxxxd4mji" --header "t: t" --header "mode: cors" --header "sign: $sign2" --header "access_token: cc75fd7xxxxxxxxx63d032b" --data "{"commands":[{"code":"switch_1","value":true}]}"
Run Code Online (Sandbox Code Playgroud)
我当然已经尝试使用 && 一起执行所有命令,但没有任何变化。有人有什么想法吗?
小智 6
我有一个用例,我想从涂鸦智能插头中提取设备的耗电量。我按照https://github.com/jasonacox/tuyapower上的 Tuya API 创建说明进行操作,然后遇到了与您相同的问题,{"code":1004,"msg":"sign invalid"," ...永远无法解决。
bobolecoco 的原始答案也不适合我。使用https://developer.tuya.com/en/docs/iot/singnature?id=Ka43a5mtx1gsc上的 Tuya 文档,我发现生成的文件sign由于换行符而无效,printf因此使用echo. 请参阅下面的代码,该代码易于调试并且在 bash 5.1.16 中适用于我。
# Set debug value to true or false to (de)activate output
debug=true
# Declare constants
ClientID="<<ENTER CLIENT ID HERE>>"
ClientSecret="<<ENTER CLIENT SECRET HERE>>"
BaseUrl="https://openapi.tuyaeu.com"
EmptyBodyEncoded="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
tuyatime=`(date +%s)`
tuyatime=$tuyatime"000"
if ($debug) then echo Tuyatime is now $tuyatime; fi;
# Get Access Token
URL="/v1.0/token?grant_type=1"
StringToSign="${ClientID}${tuyatime}GET\n${EmptyBodyEncoded}\n\n${URL}"
if ($debug) then echo StringToSign is now $StringToSign; fi;
AccessTokenSign=$(printf $StringToSign | openssl sha256 -hmac "$ClientSecret" | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")
if ($debug) then echo AccessTokenSign is now $AccessTokenSign; fi;
AccessTokenResponse=$(curl -sSLkX GET "$BaseUrl$URL" -H "sign_method: HMAC-SHA256" -H "client_id: $ClientID" -H "t: $tuyatime" -H "mode: cors" -H "Content-Type: application/json" -H "sign: $AccessTokenSign")
if ($debug) then echo AccessTokenResponse is now $AccessTokenResponse; fi;
AccessToken=$(echo $AccessTokenResponse | sed "s/.*\"access_token\":\"//g" |sed "s/\".*//g")
if ($debug) then echo Access token is now $AccessToken; fi;
# Send Device status request
URL="/v1.0/iot-03/devices/status?device_ids=<<ENTER DEVICE IDs HERE, COMMA SEPARATED>>"
StringToSign="${ClientID}${AccessToken}${tuyatime}GET\n${EmptyBodyEncoded}\n\n${URL}"
if ($debug) then echo StringToSign is now $StringToSign; fi;
RequestSign=$(printf $StringToSign | openssl sha256 -hmac "$ClientSecret" | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")
if ($debug) then echo RequestSign is now $RequestSign; fi;
RequestResponse=$(curl -sSLkX GET "$BaseUrl$URL" -H "sign_method: HMAC-SHA256" -H "client_id: $ClientID" -H "t: $tuyatime" -H "mode: cors" -H "Content-Type: application/json" -H "sign: $RequestSign" -H "access_token: $AccessToken")
if ($debug) then echo RequestResponse is now $RequestResponse; fi;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |