3

我正在尝试通过他们的 API 使用 GoDaddy 更新我的 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)无法处理的实体

4

6 回答 6

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})
于 2018-04-20T09:48:14.260 回答
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 的“数组”要求以及现在似乎也需要的其他字段。

于 2016-08-28T00:02:10.637 回答
0

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

你可以在这里参考他们的 API ,在这里你可以看到数据示例,还可以尝试命令并查看错误消息。

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

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

$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
}
于 2017-01-21T18:20:48.233 回答
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
于 2018-05-29T01:18:04.313 回答
0

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

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

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

让我知道您在此处看到的内容,我们将努力寻找解决方案。

于 2016-08-24T13:59:29.877 回答
0

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"
于 2016-12-06T20:20:16.767 回答