使用Powershell更新GoDaddy API上的DNS记录时出现错误422

时间:2016-08-24 12:21:55

标签: rest powershell godaddy-api

我正在尝试使用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)不可处理的实体

6 个答案:

答案 0 :(得分:3)

我一直在使用基于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})

答案 1 :(得分:1)

在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的“数组”要求以及现在似乎也需要的其他字段。

答案 2 :(得分:0)

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

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

让我们验证哪种Data GoDaddy会通过此端点向您显示。也许他们有一个不同的术语来制作@记录?我们可以通过很多方式解决问题。

让我知道你在这里看到的内容,我们将努力解决问题。

答案 3 :(得分:0)

A记录设置在第20行,而不是VAR $名称,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"

答案 4 :(得分:0)

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

您可以参考他们的API here,您可以在其中查看数据示例,还可以尝试命令并查看错误消息。

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

错误处理的完整示例:

$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
}

答案 5 :(得分:0)

我能够使用以下内容:

$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