【问题标题】:Call to Tuya API via bash通过 bash 调用涂鸦 API
【发布时间】:2022-10-25 19:27:16
【问题描述】:

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

涂鸦需要生成签名如下: HMAC-SHA256(client_id + t,秘密)。 我构建了一个小脚本,它完全按照 Tuya 的要求。我还通过尝试使用与文档中相同的 client_id、t 和 secret 作为示例生成签名进行了仔细检查,并且生成的签名与文档中的内容相匹配。

client_id 是一个预先分配的值 t 是 13 位数字的时间戳(我认为这是错误所在) secret 是一个预先分配的值

构建签名后,需要在 POST 调用中通过 curl 使用,但涂鸦一直拒绝签名,并出现以下错误:

{"code":1004,"msg":"sign invalid","success":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}]}"

我当然已经尝试过使用 && 一起执行所有命令,但没有任何变化。有人有什么想法吗?

【问题讨论】:

    标签: bash curl tuya


    【解决方案1】:

    您的“标志”无效。

    声明你的变量:

    ClientID="replace_with_you_client_Id yyr8hxxxxxxxxd4mji"
    ClientSecret="replace_with_you_client_secret cc75fd7xxxxxxxxx63d032b"
    Device="replace_with_your_device 717715xxxxxxx520"
    

    首先你必须得到一个 access_token :

    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
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    
    /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_body、url。

    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=$(echo -n "$ClientID${AccessToken}${TimeStamp}${METHOD}
    $encodedBody
    
    $URL" | openssl dgst -sha256 -hmac "$ClientSecret"  | tr '[:lower:]' '[:upper:]' |sed "s/.* //g")`
    

    或在一行中:

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

    然后发送请求:

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多