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