Как сейчас отправлять уведомления на Телеграм telegram???

Поддержка
  • Мой скрипт при отправке уведомления в Телеграм стал выдавать сообщение Thread ended with message "Failed to get page https://api.telegram.org/bot1280...
    Уведомления отправляю стандартным модулем Telegram v.1
    Предполагаю что это связано с блокировками Телеграма в России (март 2026 года)
    Кто знает как решить проблему??? Прокси на HTTP - клиента??

  • @andreyx said in Как сейчас отправлять уведомления на Телеграм telegram???:

    Мой скрипт при отправке уведомления в Телеграм стал выдавать сообщение Thread ended with message "Failed to get page https://api.telegram.org/bot1280...
    Уведомления отправляю стандартным модулем Telegram v.1
    Предполагаю что это связано с блокировками Телеграма в России (март 2026 года)
    Кто знает как решить проблему??? Прокси на HTTP - клиента??

    https://community.bablosoft.com/topic/30055/установить-прокси-для-любого-кубика/7?_=1773995164930

  • У самого такая проблема уже пару недель, только что доделал до конца все.

    Выход – реверс-прокси.
    Берём бесплатный хостинг с доменом третьего уровня, который не заблокирован в РФ (или другом ограниченном гео), и он будет полностью передавать все запросы на официальный API Telegram.
    После этого в коде Telegram-моделей БАСв и в xml-проекте меняем официальный URL на новый прокси-домен.


    Что пробовал из бесплатных хостингов

    ИИ рекомендовал pythonanywhere и cloudflare pages – сделал, но коннект к ним тоже не проходит.

    Больше всего бесплатных доменов третьего уровня – на PHP-хостингах. До них пока не добрался, хватило Netlify и Vercel. В конце заметки дам ссылку на прокси на верселе.

    Что с Vercel и Netlify

    • Сервисы сами навайбкодят вам прокси-приложение по вашему запросу.
    • Вроде безлимит по времени жизни поддомена бесплатно пока проект не удален.
    • У Netlify считаются запросы к вашему сервису: бесплатно 125к в месяц.
    • Ещё пишут, что проекты на бесплатных тарифах засыпают через 15–30 минут неактивности. Клод код сказал что разница из неглубокого сна это плюсом пара секунд.
    • В вайбкоде v0.app pекомендую Pro-модель.
      Младшие модели пишут заметно хуже и медленнее.

    Как бороться со сном: поставить бесплатный крон-джоб на 15 минут на сайте cron-job.org.
    Правда, он без ВПН вроде не работает. Хотя может и не нужно, если он просыпается за пару секунд.


    Что отбраковал

    ИИ от Replit – опубликованный проект бесплатно живет 30 дней, потом надо переопубликовывать. Неудобно.


    Как проверить, работает ли твой новый URL

    Запрос /getMe после /бот123:токен/. Пример:
    https://ваш_проект.netlify.app/bot999999999:AAAA....ts/getMe

    Если ответ в json с именем вашего бота – всё ок. Быстрый вариант теста в один гет запрос.


    Для СУЩЕСТВУЮЩЕГО проекта

    1. Выключить BAS, чтобы он не перезаписал измененным вами проект из оперативной памяти.
    2. Найдите в XML-файле проекта строку, которая содержит https://api.telegram.org/bot.
      Обычно она начинается так:
    _url_temp = "https://api.telegram.org/bot"+ "
    

    Замените домен для каждого вызова отправки сообщения на рабочий прокси-URL. Сколько телеграм блоков в проекте - столько раз и заменить.


    Изменение в модуле телеграм для создания НОВЫХ рабочих блоков

    Файл:
    C:\Users\admin\AppData\Roaming\BrowserAutomationStudio\apps\29.3.1\modules\Telegram\send_message_code.js

    29-я строчка.
    Заменяем "api.telegram.org" на "ваш_проект.netlify.app".

    Версия 29.3.1 и имя пользователя у каждого свои – сами понимаете.


    PowerShell-скрипт для автоматизации

    Я сделал скрипт, который сам заменяет в крайней версии БАСа нужный URL.
    Можно задать новый домен прямо в скрипте и запускать по клику на файл или в терминале через флаг --new_url.

    replace_telegram_domain.ps1 - может стоило файлом прикрепить?

    <#
    .SYNOPSIS
    Скрипт замены URL Telegram API на пользовательский домен или восстановления из резервной копии.
    
    .DESCRIPTION
    Скрипт находит последнюю версию BrowserAutomationStudio, создаёт резервную копию файла send_message_code.js,
    заменяет в нём "api.telegram.org/bot" на "<ваш_домен>/bot" и сохраняет изменения.
    Режим --recover восстанавливает исходный файл из резервной копии.
    
    .PARAMETER new_url
    Новый домен (или полный URL). Будет извлечён домен третьего уровня (без протокола и пути).
    Примеры: --new_url https://myproject.vercel.app , --new_url myproject.vercel.app
    
    .PARAMETER recover
    Восстановить оригинальный файл из send_message_code.js.bak.
    
    .EXAMPLE
    .\replace_telegram_domain.ps1 -new_url "https://myproject.vercel.app"
    Заменяет api.telegram.org/bot на myproject.vercel.app/bot в актуальном файле.
    
    .EXAMPLE
    .\replace_telegram_domain.ps1 -recover
    Восстанавливает оригинальный файл из резервной копии (если она существует и содержит корректную строку).
    #>
    
    param(
        [string]$new_url,
        [switch]$recover
    )
    
    # ============================================================
    # ВСТРОЕННЫЙ ДОМЕН (если указан, используется при отсутствии -new_url)
    # ============================================================
    $default_new_url = ""   # <-- сюда можно прописать домен, например "myproxy.example.com"
    
    # Функция для получения чистого домена из URL
    function Get-CleanDomain {
        param([string]$url)
        $url = $url.Trim()
        if ($url -notmatch '^https?://') {
            $url = "http://$url"
        }
        try {
            $uri = [System.Uri]::new($url)
            $hostname = $uri.Host
            return $hostname
        }
        catch {
            Write-Error "Не удалось распознать домен из '$url'."
            exit 1
        }
    }
    
    # Функция ожидания нажатия клавиши перед выходом
    function WaitForExit {
        Write-Host "`nНажмите любую клавишу для выхода..."
        $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
        exit
    }
    
    # Функция восстановления из резервной копии
    function Invoke-Recover {
        Write-Host "=== РЕЖИМ ВОССТАНОВЛЕНИЯ ==="
    
        # Определяем пользователя и путь
        $username = $env:USERNAME
        if (-not $username) {
            Write-Error "Не удалось определить имя пользователя."
            WaitForExit
        }
        $appsPath = "C:\Users\$username\AppData\Roaming\BrowserAutomationStudio\apps"
        if (-not (Test-Path $appsPath)) {
            Write-Error "Папка с версиями не найдена: $appsPath"
            WaitForExit
        }
    
        # Поиск последней версии
        $versionFolders = Get-ChildItem -Path $appsPath -Directory | Where-Object { $_.Name -match '^\d+(\.\d+){1,2}$' }
        if ($versionFolders.Count -eq 0) {
            Write-Error "Не найдено ни одной папки версии в $appsPath"
            WaitForExit
        }
        $latestVersion = $versionFolders | Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1
        $latestVersionPath = $latestVersion.FullName
        Write-Host "Найдена последняя версия: $($latestVersion.Name)"
    
        $targetFile = Join-Path -Path $latestVersionPath -ChildPath "modules\Telegram\send_message_code.js"
        $backupFile = $targetFile -replace '\.js$', '.js.bak'
    
        if (-not (Test-Path $backupFile)) {
            Write-Error "Резервная копия не найдена: $backupFile"
            WaitForExit
        }
        Write-Host "Найдена резервная копия: $backupFile"
    
        # Проверяем, что в бэкапе есть оригинальная строка
        $backupContent = Get-Content -Path $backupFile -Raw -ErrorAction Stop
        $searchPattern = "api.telegram.org/bot"
        if ($backupContent -notmatch $searchPattern) {
            Write-Error "В резервной копии отсутствует строка '$searchPattern'. Восстановление отменено (возможно, бэкап повреждён)."
            WaitForExit
        }
        Write-Host "Проверка пройдена: в бэкапе найдено '$searchPattern'"
    
        # Переименовываем текущий файл (если существует) в .old
        if (Test-Path $targetFile) {
            $oldFile = $targetFile -replace '\.js$', '.js.old'
            if (Test-Path $oldFile) {
                Remove-Item -Path $oldFile -Force
                Write-Host "Удалён старый .old файл"
            }
            Rename-Item -Path $targetFile -NewName (Split-Path $oldFile -Leaf) -Force
            Write-Host "Текущий файл переименован в $oldFile"
        }
    
        # Восстанавливаем из бэкапа
        Copy-Item -Path $backupFile -Destination $targetFile -Force
        Write-Host "Файл восстановлен из резервной копии: $targetFile"
    
        # Удаляем бэкап (можно закомментировать, если хотите оставить)
        Remove-Item -Path $backupFile -Force
        Write-Host "Резервная копия удалена."
    
        Write-Host "Восстановление успешно завершено!"
        WaitForExit
    }
    
    # ========== ОСНОВНАЯ ЛОГИКА ==========
    
    # Если указан ключ -recover, выполняем восстановление и выходим
    if ($recover) {
        Invoke-Recover
        exit
    }
    
    # Определяем итоговый URL для замены
    $final_url = ""
    if ($new_url) {
        $final_url = $new_url
        Write-Host "Используется домен из параметра -new_url: $final_url"
    }
    elseif ($default_new_url) {
        $final_url = $default_new_url
        Write-Host "Используется домен из встроенной переменной `$default_new_url: $final_url"
    }
    else {
        Write-Error "Ошибка: не указан -new_url и переменная `$default_new_url пуста. Укажите домен через --new_url ваш_домен.xyz или впишите его в скрипт."
        WaitForExit
    }
    
    # 1. Получаем имя текущего пользователя
    $username = $env:USERNAME
    if (-not $username) {
        Write-Error "Не удалось определить имя пользователя."
        WaitForExit
    }
    
    # 2. Базовый путь к папке apps
    $appsPath = "C:\Users\$username\AppData\Roaming\BrowserAutomationStudio\apps"
    if (-not (Test-Path $appsPath)) {
        Write-Error "Папка с версиями не найдена: $appsPath"
        WaitForExit
    }
    
    # 3. Находим все подпапки, которые выглядят как версии
    $versionFolders = Get-ChildItem -Path $appsPath -Directory | Where-Object { $_.Name -match '^\d+(\.\d+){1,2}$' }
    if ($versionFolders.Count -eq 0) {
        Write-Error "Не найдено ни одной папки версии в $appsPath"
        WaitForExit
    }
    $latestVersion = $versionFolders | Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1
    $latestVersionPath = $latestVersion.FullName
    Write-Host "Найдена последняя версия: $($latestVersion.Name)"
    
    # 4. Путь к целевому файлу
    $targetFile = Join-Path -Path $latestVersionPath -ChildPath "modules\Telegram\send_message_code.js"
    if (-not (Test-Path $targetFile)) {
        Write-Error "Файл не найден: $targetFile"
        WaitForExit
    }
    Write-Host "Целевой файл: $targetFile"
    
    # 5. Проверяем наличие строки "api.telegram.org/bot" в файле
    $searchPattern = "api.telegram.org/bot"
    $content = Get-Content -Path $targetFile -Raw -ErrorAction Stop
    if ($content -notmatch $searchPattern) {
        Write-Error "В файле не найдено вхождение '$searchPattern'. Замена не требуется (возможно, уже заменён или повреждён)."
        WaitForExit
    }
    Write-Host "Найдено вхождение '$searchPattern', продолжаем..."
    
    # 6. Создаём резервную копию (переименовываем в .bak)
    $backupFile = $targetFile -replace '\.js$', '.js.bak'
    if (Test-Path $backupFile) {
        Write-Host "Старый бэкап уже существует: $backupFile. Удаляем..."
        Remove-Item -Path $backupFile -Force
    }
    Rename-Item -Path $targetFile -NewName (Split-Path $backupFile -Leaf) -Force
    Write-Host "Создан бэкап: $backupFile"
    
    # 7. Обрабатываем новый домен из параметра --new_url или из переменной
    $cleanDomain = Get-CleanDomain -url $final_url
    if (-not $cleanDomain) {
        Write-Error "Не удалось получить домен из значения --new_url"
        WaitForExit
    }
    Write-Host "Новый домен: $cleanDomain"
    
    # 8. Заменяем все вхождения
    $newContent = $content -replace [regex]::Escape($searchPattern), "$cleanDomain/bot"
    
    # 9. Записываем обратно в исходный файл
    Set-Content -Path $targetFile -Value $newContent -NoNewline
    Write-Host "Готово! Файл обновлён. Исходная строка '$searchPattern' заменена на '$cleanDomain/bot'"
    
    WaitForExit
    

    Вот пример того, что v0.app вам «навайбкодит»:
    https://v0-telegram-proxy-api.vercel.app/

    В netlify тоже самое только на другом домене и нет чувства ужатости по кредитам в момент разработки.