У самого такая проблема уже пару недель, только что доделал до конца все.
Выход – реверс-прокси.
Берём бесплатный хостинг с доменом третьего уровня, который не заблокирован в РФ (или другом ограниченном гео), и он будет полностью передавать все запросы на официальный 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 с именем вашего бота – всё ок. Быстрый вариант теста в один гет запрос.
Для СУЩЕСТВУЮЩЕГО проекта
- Выключить BAS, чтобы он не перезаписал измененным вами проект из оперативной памяти.
- Найдите в 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 тоже самое только на другом домене и нет чувства ужатости по кредитам в момент разработки.