====== Автоматическое обновление домашнего 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