cloudflare_dyndns
Это старая версия документа!
Содержание
Автоматическое обновление домашнего IP-адреса Cloudflare DDNS
Проверка API-токена
curl.exe "https://api.cloudflare.com/client/v4/user/tokens/permission_groups" --request GET --header "Authorization: Bearer FyqTNMl5JiZf1q77v275VgtQpo2Uh4fqdnYisugL9wSReadZ/Q8YAM6jIK7rvLYO+xOTb85Bf3E="
cloudflare_dyndns.ps1
# Cloudflare DynDNS Script for Windows
# Конфигурация
$ZoneID = "JaYRnJAoKlHujNxXEBRWG1hkD/zJeWIXJ9VDnXxyOjIP094mt3u+ShPhIf5PF15R"
$ApiToken = "Gwl35a3UHXye2X0VsW9qVL5mpo+c6u/9ibKigEThwQFpAvxX4DdmHEJcLH5Z0qhUIjvMFoVPDUs="
$RecordName = "k7rhM3VJApTpPAldQR0rrQx6Z/BrRpuB"
$RecordType = "A"
# Функция для получения внешнего IP
function Get-ExternalIP {
try {
$ip = (Invoke-RestMethod -Uri "http://checkip.amazonaws.com" -TimeoutSec 10).Trim()
return $ip
}
catch {
try {
$ip = (Invoke-RestMethod -Uri "http://api.ipify.org" -TimeoutSec 10).Trim()
return $ip
}
catch {
Write-Error "Не удалось получить внешний IP"
exit 1
}
}
}
# Функция для работы с Cloudflare API
function Update-CloudflareDNS {
param(
[string]$ZoneID,
[string]$ApiToken,
[string]$RecordName,
[string]$RecordType,
[string]$NewIP
)
$headers = @{
"Authorization" = "Bearer $ApiToken"
"Content-Type" = "application/json"
}
# Получаем информацию о текущей записи
$getUrl = "https://api.cloudflare.com/client/v4/zones/$ZoneID/dns_records?type=$RecordType&name=$RecordName"
try {
$response = Invoke-RestMethod -Uri $getUrl -Headers $headers -Method GET
}
catch {
Write-Error "Ошибка при получении данных из Cloudflare: $_"
return $false
}
if ($response.success -and $response.result.Count -gt 0) {
$record = $response.result[0]
$recordID = $record.id
$currentIP = $record.content
Write-Host "Текущий IP в Cloudflare: $currentIP"
Write-Host "Новый внешний IP: $NewIP"
if ($currentIP -eq $NewIP) {
Write-Host "IP не изменился. Обновление не требуется."
return $true
}
# Обновляем запись
$updateUrl = "https://api.cloudflare.com/client/v4/zones/$ZoneID/dns_records/$recordID"
$body = @{
type = $RecordType
name = $RecordName
content = $NewIP
ttl = 120
proxied = $false
} | ConvertTo-Json
try {
$updateResponse = Invoke-RestMethod -Uri $updateUrl -Headers $headers -Method PUT -Body $body
if ($updateResponse.success) {
Write-Host "Запись успешно обновлена в Cloudflare!"
return $true
} else {
Write-Error "Ошибка Cloudflare API: $($updateResponse.errors)"
return $false
}
}
catch {
Write-Error "Ошибка при обновлении записи: $_"
return $false
}
} else {
Write-Error "DNS запись не найдена в Cloudflare"
return $false
}
}
# Основная логика
Write-Host "Проверка обновления DynDNS Cloudflare..."
Write-Host "Запись: $RecordName"
Write-Host "Время: $(Get-Date)"
$externalIP = Get-ExternalIP
Write-Host "Внешний IP определен: $externalIP"
$result = Update-CloudflareDNS -ZoneID $ZoneID -ApiToken $ApiToken -RecordName $RecordName -RecordType $RecordType -NewIP $externalIP
if ($result) {
Write-Host "Скрипт выполнен успешно"
} else {
Write-Host "Скрипт завершился с ошибками"
exit 1
}
cloudflare_dyndns.vbs
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass -NonInteractive -File ""C:\Users\shs\Documents\cloudflare_dyndns.ps1""", 0, False
Автоматическое обновление домашнего IP-адреса каждые 15 минут
homeip_add_task.ps1
$TaskName = "Update Home IP Every 15 Minutes"
$ScriptPath = "C:\Users\shs\Documents\cloudflare_dyndns.vbs" # Укажите полный путь к вашему скрипту
$LogPath = "c:\temp\cloudflare_dyndns-log.txt" # Путь для лог-файла
# Создание действия с параметрами для скрытого выполнения
$Action = New-ScheduledTaskAction `
-Execute "wscript.exe" `
-Argument "$ScriptPath"
# Создание триггера (каждые 15 минут)
$Trigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 15)
# Настройки задачи - ВАЖНО: добавляем скрытое выполнение
$Settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 1) `
-Hidden # Это ключевой параметр!
# Регистрация задачи
Register-ScheduledTask `
-TaskName $TaskName `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-RunLevel Highest `
-Description "Автоматическое обновление домашнего IP-адреса Cloudflare DDNS"
Write-Host "Задача `"$TaskName`" успешно создана!" -ForegroundColor Green
Проверка локального IP и запись его на FTP
# Список сервисов для получения IP (в порядке приоритета)
$ipServices = @(
"http://ipinfo.io/ip",
"http://checkip.amazonaws.com",
"http://api.ipify.org"
)
# Получение IP с резервными сервисами
$externalIP = $null
$usedService = ""
foreach ($service in $ipServices) {
try {
Write-Host "Попытка получить IP с $service..." -ForegroundColor Yellow
$response = Invoke-RestMethod -Uri $service -TimeoutSec 10
$externalIP = $response.ToString().Trim()
# Проверка что получен валидный IP
if ($externalIP -match '^\d+\.\d+\.\d+\.\d+$') {
$usedService = $service
Write-Host "IP успешно получен с $usedService : $externalIP" -ForegroundColor Green
break
} else {
Write-Host "Неверный формат ответа: $externalIP" -ForegroundColor Red
$externalIP = $null
}
}
catch {
Write-Host "Ошибка при запросе к $service : $($_.Exception.Message)" -ForegroundColor Red
$externalIP = $null
}
}
if (-not $externalIP) {
Write-Host "Не удалось получить IP-адрес со всех сервисов" -ForegroundColor Red
exit 1
}
# Параметры FTP
$ftpServer = "ftp.amd123-ru.1gb.ru"
$ftpUser = "qItc+GdO3fJ3cBH6iAltziD6yoVoOMYV0o2XAHyZyZw=" # Ваш логин для FTP
$ftpPass = "wJfF51As17bMVtj8sdY9a4LEcjjoSmPP" # Ваш пароль для FTP
$remoteFile = "/home-ip.txt" # Файл на сервере
# Убедимся, что адрес FTP правильный
$ftpUri = "ftp://$ftpServer$remoteFile"
Write-Host "Попытка подключения к: $ftpUri"
# Создание временного файла
$tempFile = [System.IO.Path]::GetTempFileName()
$externalIP | Out-File -FilePath $tempFile -Encoding ASCII
try {
# Создание FTP-запроса
$ftpRequest = [System.Net.FtpWebRequest]::Create($ftpUri)
$ftpRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftpRequest.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
$ftpRequest.UseBinary = $true
$ftpRequest.KeepAlive = $false
$ftpRequest.UsePassive = $true # Добавляем пассивный режим
# Чтение файла и отправка на FTP
$fileContent = [System.IO.File]::ReadAllBytes($tempFile)
$ftpRequestStream = $ftpRequest.GetRequestStream()
$ftpRequestStream.Write($fileContent, 0, $fileContent.Length)
$ftpRequestStream.Close()
Write-Host "IP-адрес успешно загружен на FTP: $externalIP" -ForegroundColor Green
# Логирование успешной операции
$logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - IP $externalIP обновлен через $usedService"
$logEntry | Out-File "C:\temp\homeip-log.txt" -Append
}
catch {
Write-Host "Ошибка при загрузке на FTP: $($_.Exception.Message)" -ForegroundColor Red
# Дополнительная информация об ошибке
if ($_.Exception.InnerException) {
Write-Host "Внутренняя ошибка: $($_.Exception.InnerException.Message)" -ForegroundColor Yellow
}
# Логирование ошибки
$errorEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Ошибка FTP: $($_.Exception.Message)"
$errorEntry | Out-File "C:\temp\homeip-log.txt" -Append
}
finally {
# Удаление временного файла
if (Test-Path $tempFile) {
Remove-Item $tempFile -Force
}
}
Write-Host "Скрипт завершил выполнение" -ForegroundColor Cyan
homeip.vbs
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass -NonInteractive -File ""C:\Users\shs\Documents\homeip.ps1""", 0, False
cloudflare_dyndns.1760178311.txt.gz · Последнее изменение: (внешнее изменение)
