2016-08-24 4 views
0

내 API를 사용하여 GoDaddy로 DNS를 업데이트하려고합니다 (내 홈 네트워크가 동적 IP에 있음).Powershell을 사용하여 GoDaddy API에서 DNS 레코드를 업데이트하는 경우

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) Unprocessable Entity

답변

0

이 문제를 해결하려면 먼저 같은 끝점에서 GET 작업을 시작하는 것이 좋습니다. 이 명령을 실행?

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

이의이 엔드 포인트를 통해 방법을 보여줍니다 데이터 GoDaddy와 어떤 종류의 유효성을 확인합시다. 어쩌면 그들이 @ 기록을 만들기위한 다른 용어가? 우리가 문제로 실행 될 수있는 많은 방법이있다.

여기에있는 내용을 알려 주시면 해결 방법을 알려 드리겠습니다.

1

godaddy에서 프로덕션 키 만들기. 테스트 키가 제대로 작동하지 않았습니다.

그리고 ttl은 정수 여야합니다. 문자열이 아니라면 그 문자열을 ''에서 제거하십시오.

또한 그것은 단지 MX 및 SRV 레코드를 위한거야, 우선 순위를 제거 (및 40 %에 @를 변경) A 레코드는 오히려 VAR의 $ 이름과 TTL 것보다 라인 (20)에 설정되어

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

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


$Request = @{ttl=1;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/Test -method put -headers $headers -Body $json -ContentType "application/json" 
+0

코드를 시도했지만 422 오류가 발생합니다. – Yster

+0

감사합니다, 선생님! 키워드 "godaddy에서 프로덕션 키 만들기." – mrkarp

0

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" 
0

이동 아빠 (TTL 숫자이어야한다, 우선 순위가 [그 우선 순위를 유의하시기 바랍니다에만 SRV 레코드를 사용한다] 숫자이어야 함), 및 일부 비즈니스 어떤 종류의 제약 조건을 가지고에 대한

감사합니다 제약 조건 (예 : 최소 600 회, 10 분 강제) 등

데이터 예를 볼 수있는 API here을 참조하고 명령을 시도하고 오류 메시지를 확인하십시오.

컨텐츠 속성을 사용할 수 없습니다 때문에 당신이 HTTP 오류를 얻을 때, 당신은 설명 here

같은 응답 스트림에서 오류 메시지를 추출한다 PowerShell에서 직접 오류 메시지가 표시 선호하는 경우, 다른 한편으로

오류 처리 기능이있는 전체 샘플 :

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