Инструменты пользователя

Инструменты сайта


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.txt · Последнее изменение: 127.0.0.1

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki