首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过bash调用Tuya API

通过bash调用Tuya API
EN

Stack Overflow用户
提问于 2022-09-27 21:37:25
回答 1查看 240关注 0票数 0

在使用curl时,我很难调用Tuya。

Tuya需要生成如下签名:HMAC-HMAC 256(client_id+ t,机密)。我构建了一个很小的脚本来完成Tuya的要求。我还通过尝试使用文档中相同的client_id、t和机密生成签名进行了双重检查,生成的签名与文档中的内容相匹配。

client_id是预赋值t是13位数字的时间戳(我认为这里是错误所在)秘密是一个预先赋值的值。

生成签名后,需要在POST调用中通过curl使用签名,但Tuya一直拒绝签名,但出现以下错误:

{“代码”:1004,“msg”:“签名无效”,“成功”:false,"t":1664314067553}

现在,我认为问题在于时机问题。为了让我的脚本生成签名,需要几毫秒,当t的值被传递给curl时,它将与curl的执行(当然)不匹配。这是我的密码:

代码语言:javascript
复制
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}]}"

当然,我已经尝试使用&&一起执行所有命令,但是没有任何变化。有人知道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-25 11:27:16

您的sign无效。

声明您的变量:

代码语言:javascript
复制
ClientID="replace_with_you_client_Id yyr8hxxxxxxxxd4mji"
ClientSecret="replace_with_you_client_secret cc75fd7xxxxxxxxx63d032b"
Device="replace_with_your_device 717715xxxxxxx520"

首先你必须得到一个access_token

代码语言:javascript
复制
AccessToken=$(t=$(date +%s%N |sed "s/......$//g"); curl -sSLkX GET "https://openapi.tuyaeu.com/v1.0/token?grant_type=1" -H "sign_method: HMAC-SHA256" -H "client_id: $ClientID" -H "t: $t" -H "mode: cors" -H "Content-Type: application/json" -H "sign: $(echo -en "${ClientID}${t}GET\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n\n/v1.0/token?grant_type=1" | openssl dgst -sha256 -hmac "$ClientSecret"  | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")" -H "access_token: " | sed "s/.*\"access_token\":\"//g"  |sed "s/\".*//g")`

然后你需要计算好的“符号”。你需要你的ClientId,时间戳,access_token,方法,encoded_bodyurl

代码语言:javascript
复制
TimeStamp=$(date +%s%N |sed "s/......$//g")
METHOD='POST'
BODY='{"commands":[{"code":"switch_1","value":true}]}'
encodedBody=$(echo -n "$BODY" | openssl dgst -sha256 | sed "s/.*[ ]//g")
URL="/v1.0/iot-03/devices/$Device/commands"

计算sign

代码语言:javascript
复制
SIGN=$(echo -n "$ClientID${AccessToken}${TimeStamp}${METHOD}
$encodedBody

$URL" | openssl dgst -sha256 -hmac "$ClientSecret"  | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")`

或者是一行:

代码语言:javascript
复制
SIGN=$(echo -en "$ClientID${AccessToken}${TimeStamp}${METHOD}\n$encodedBody\n\n$URL" | openssl dgst -sha256 -hmac "$ClientSecret"  | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")

然后发送请求:

代码语言:javascript
复制
curl -sSLkX $METHOD "https://openapi.tuyaeu.com$URL" -H "sign_method: HMAC-SHA256" -H "client_id: $ClientID" -H "t: $TimeStamp" -H "mode: cors" -H "Content-Type: application/json" -H "sign: $SIGN" -H "access_token: $AccessToken" -d "$BODY"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73874058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档