【问题标题】:Error 422 When Using Powershell to Update DNS Records on GoDaddy API使用 Powershell 更新 GoDaddy API 上的 DNS 记录时出现错误 422
【发布时间】:2016-08-24 12:21:55
【问题描述】:

我正在尝试通过 GoDaddy 的 API 更新我的 DNS(我的家庭网络位于动态 IP 上)。

在通过 cygwin 运行时,使用http://teanazar.com/2016/05/godaddy-ddns-updater/ 处的脚本时,我能够成功更新。

但是我试图简单的事情,而不是在 powershell 中执行此操作。

但是,当尝试使用以下脚本时:

$IP = Invoke-WebRequest http://api.ipify.org?format=json
$IP2 = ConvertFrom-JSON $ip
$domain = 'example.com'
$type = 'A'
$name = '@'

$key = 'key'
$secret = 'secret'


$Request = @{ttl='600';data=$ip2.ip;priority='1'}

$JSON = Convertto-Json $request

$headers = @{}
$headers["Authorization"] = 'sso-key ' + $key + ':' + $secret

Invoke-WebRequest    https://api.godaddy.com/v1/domains/$domain/records/$Type/$Name -contenttype "application/json" -method put -body $json -headers $headers

到目前为止,我已经设法解决了每个问题,并且我知道它正在验证。但是当我执行时,我得到“远程服务器返回一个错误:(422)无法处理的实体

【问题讨论】:

    标签: rest powershell godaddy-api


    【解决方案1】:

    我一直在使用基于 drizin 提供的解决方案的实现......直到最近它都运行良好。

    GoDaddy 似乎加强了 JSON 验证,但现在失败并出现以下错误:

    {
      "code": "INVALID_BODY",
      "fields": [
        {
          "code": "UNEXPECTED_TYPE",
          "message": "is not a array",
          "path": "records"
        }
      ],
      "message": "Request body doesn't fulfill schema, see details in `fields`"
    }
    

    根据https://developer.godaddy.com/doc/endpoint/domains#/v1/recordReplaceTypeName 处的 API 规范,发送的 JSON 应该是一个数组...即[ { ... } ],其中代码创建了{ ... }

    要解决此问题,需要对构建 JSON 的代码行进行简单更改...

    发件人:

    $JSON = ConvertTo-Json @{data=$IP;ttl=3600}
    

    收件人:

    $JSON = ConvertTo-Json @(@{data=$IP;ttl=3600})
    

    【讨论】:

      【解决方案2】:

      在 godaddy 上制作生产密钥。测试密钥对我不起作用。

      而且你的 ttl 需要是一个整数。不是字符串,把''去掉。

      (并将您的 @ 更改为 %40)

      $IP = Invoke-WebRequest http://api.ipify.org?format=json
      $IP2 = ConvertFrom-JSON $ip
      $domain = 'example.com'
      $type = 'A'
      $name = 'Test'
      
      $key = 'key'
      $secret = 'secret'
      
      
      [array]$Request=@{data=$IP2.ip; "port"=1; "priority"=0; "protocol"="none"; "service"="none"; "ttl"=3600; "weight"=1}
      
      $JSON = Convertto-Json $request
      
      $headers = @{}
      $headers["Authorization"] = 'sso-key ' + $key + ':' + $secret
      
      
      Invoke-WebRequest    https://api.godaddy.com/v1/domains/$domain/records  -method get -headers $headers
      Invoke-WebRequest    https://api.godaddy.com/v1/domains/$domain/records/A/Test  -method put -headers $headers -Body $json -ContentType "application/json"
      

      看起来 GoDaddy 更新了 API。更新了解决方案以包括 JSON 的“数组”要求以及现在似乎也需要的其他字段。

      【讨论】:

      • 这个,谢谢先生!关键字“在 godaddy 上制作生产密钥。”
      【解决方案3】:

      要解决这个问题,我首先建议您从同一端点的GET 操作开始。运行此命令时您会看到什么?

      Invoke-WebRequest   https://api.godaddy.com/v1/domains/$domain/records `
        -contenttype "application/json" -method GET -headers $headers
      

      让我们验证一下 GoDaddy 将通过此端点向您显示哪种数据。也许他们有不同的术语来制作@ 记录?我们可能会遇到很多问题。

      让我知道你在这里看到了什么,我们会努力解决。

      【讨论】:

        【解决方案4】:

        A 记录在第 20 行设置,而不是 VAR $name,并且 TTL 在第 11 行设置为 1,我认为 Godaddy 会在这个值上踢它。将 TTL 设置为 3600 并将 var 插入 20 它应该可以工作,无论如何它对我有用。

        感谢指点 :)

        $IP = Invoke-WebRequest http://api.ipify.org?format=json
        $IP2 = ConvertFrom-JSON $ip
        $domain = 'domain.co.uk'
        $type = 'A'
        $name = 'record'
        
        $key = 'blahhhhh'
        $secret = 'blahhh'
        
        
        $Request = @{ttl=3600;data=$ip2.ip}
        
        $JSON = Convertto-Json $request
        
        $headers = @{}
        $headers["Authorization"] = 'sso-key ' + $key + ':' + $secret
        
        
        Invoke-WebRequest    https://api.godaddy.com/v1/domains/$domain/records  -method get -headers $headers
        Invoke-WebRequest    https://api.godaddy.com/v1/domains/$domain/records/A/$name  -method put -headers $headers -Body $json -ContentType "application/json"
        

        【讨论】:

          【解决方案5】:

          Go Daddy 有一些类型限制(TTL 应该是数字,优先级应该是数字[请注意,优先级应该只用于 SRV 记录]),以及一些业务限制(例如强制 TTL 至少为 600,即 10 分钟) ) 等。

          您可以参考他们的APIhere,在那里您可以看到数据示例,也可以尝试命令并查看错误消息。

          另一方面,如果您希望直接在 powershell 中查看错误消息,因为 Content 属性在您收到 HTTP 错误时不可用,您应该从响应流中提取错误消息,如所述 here

          带有错误处理的完整示例:

          $IPj = Invoke-WebRequest http://api.ipify.org?format=json
          $IP = (ConvertFrom-JSON $IPj).ip
          $domain = 'mydomain.com'
          $type = 'A'
          $alias = 'myalias' # myalias.mydomain.com
          
          $key = 'etc'
          $secret = 'etc'
          
          $JSON = ConvertTo-Json @{data=$IP;ttl=3600}
          # you can also use an array of values: @(@{data=$IP1;ttl=3600},@{data=$IP2;ttl=3600},etc...)
          
          $headers = @{}
          $headers["Authorization"] = 'sso-key ' + $key + ':' + $secret
          
          try {
              $ret = Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/$type/$alias  -method put -headers $headers -Body $json -ContentType "application/json"
              if ($ret.StatusCode -eq 200) { Write-Host "Success!" -for yellow } else { Write-Host "ERROR" -for red }
          }
          catch {
              $result = $_.Exception.Response.GetResponseStream()
              $reader = New-Object System.IO.StreamReader($result)
              $reader.BaseStream.Position = 0
              $reader.DiscardBufferedData()
              $responseBody = $reader.ReadToEnd();
              $responseBody = $responseBody | ConvertFrom-Json | Format-Custom | Out-String
              Write-Host "ERROR: $responseBody" -for red
          }
          

          【讨论】:

            【解决方案6】:

            我能够通过以下方式让它工作:

            $apiKey = 'YOUR API KEY'
            $apiSecret = 'YOUR API SECRET'
            $domain = 'YOUR DOMAIN NAME'
            #ENTER THE NAME OF THE RECORD YOU WISH TO UPDATE#
            $name = '@'
            $Headers = @{}
            $Headers["Authorization"] = 'sso-key ' + $apiKey + ':' + $apiSecret
            $result = Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/A/$name -method get -headers $headers
            $content = ConvertFrom-Json $result.content
            $dnsIp = $content.data
            $currentIp = Invoke-RestMethod http://ipinfo.io/json | Select -exp ip
            #THIS SECTION CHECKS THE CURRENT IP ADDRESS AGAINST THE PULL AND WILL UPDATE IF NOT CORRECT#
            if ( $currentIp -ne $dnsIp) {
                #$Request = @{ttl=600;data=$currentIp }
                $JSON = ConvertTo-Json @(@{data=$currentIp;ttl=600})
                Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/A/$name -method put -headers $headers -Body $json -ContentType "application/json"
            
            }
            #SHOWS RESULTS OF THE HEADER PULL
            Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/ -Method Get -Headers $Headers | ConvertFrom-Json
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-04
              • 1970-01-01
              • 1970-01-01
              • 2016-12-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多