Telegram-бот на Bun + TypeScript, который принимает ссылку на твит и пользовательский текст, скачивает все вложенные медиа из Twitter/X и публикует их в заданный Telegram-канал с подписью и ссылкой на исходный пост.
- Bun 1.1 или новее
- Доступ к Twitter/X API (OAuth 1.0a) и рабочий HTTPS-прокси
- Токен Telegram-бота и идентификатор целевого канала
Оформите файл .env на основе примера ниже:
TELEGRAM_BOT_TOKEN=""
TELEGRAM_TARGET_CHANNEL_ID=""
TWITTER_CONSUMER_KEY=""
TWITTER_CONSUMER_SECRET=""
TWITTER_ACCESS_TOKEN=""
TWITTER_ACCESS_SECRET=""
TWITTER_PROXY_URL="https://user:password@proxy-host:port"
TEMP_DIR=".tmp"TEMP_DIR можно опустить — по умолчанию временные файлы сохраняются в каталоге .tmp в корне проекта.
bun install
bun run devКоманда bun run dev загружает переменные окружения, инициализирует бота GramMMY и запускает обработчик команды /post.
Для статического анализа типов выполните:
bun x tsc --noEmit-
Установите Bun на сервере и убедитесь, что доступ к Twitter/X проходит через настроенный HTTPS-прокси.
-
Склонируйте репозиторий и установите зависимости:
bun install --production. -
Заполните
.envактуальными значениями (бот, канал, ключи Twitter, URL прокси и временной каталог при необходимости). -
Запустите проверку типов:
bun x tsc --noEmit. -
Запускайте бота командой
bun start(она эквивалентнаbun run src/app/main.ts). -
Для непрерывной работы заверните запуск в менеджер процессов (например,
systemd,pm2,supervisor). Пример unit-файла systemd:[Unit] Description=animemov-bot After=network.target [Service] WorkingDirectory=/opt/animemov-bot EnvironmentFile=/opt/animemov-bot/.env ExecStart=/usr/local/bin/bun start Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
-
Следите за логами приложения:
journalctl -u animemov-bot -fили встроенный выводbun start.
Для запуска в Docker контейнере:
# Сборка образа с версией из GitVersion
docker build -t animemov-bot .
# Или сборка с передачей версии через build arg
docker build --build-arg VERSION=$(dotnet /root/.dotnet/tools/dotnet-gitversion /output json | jq -r '.SemVer') -t animemov-bot .
# Запуск с рестартом при сбоях
docker run -d --name animemov-bot --restart unless-stopped --env-file .env animemov-bot
# Просмотр логов
docker logs -f animemov-bot
# Остановка и удаление контейнера
docker stop animemov-bot && docker rm animemov-botПараметр --restart unless-stopped обеспечивает автоматический перезапуск контейнера при сбоях или перезагрузке системы.
Проект использует GitVersion для автоматического создания версий на основе git-истории:
- main/master ветки: создают релизные версии (например,
1.0.0) - develop ветка: создает alpha-версии (например,
1.1.0-alpha.1) - feature ветки: создают feature-версии (например,
1.1.0-feature-branch.1) - hotfix ветки: создают hotfix-версии (например,
1.0.1-hotfix-branch.1)
Версия автоматически генерируется при сборке Docker-образа и доступна через переменную окружения APP_VERSION.
Проект использует GitHub Actions для автоматической сборки и публикации:
- При push в main/master/develop: сборка и публикация Docker образа
- При создании тега v*: сборка релизной версии
- При pull request: проверка кода и сборка тестового образа
Образы автоматически публикуются в GitHub Container Registry (ghcr.io):
# Использование автоматически собранного образа
docker pull ghcr.io/stdray/animemov-bot:latest
docker run -d --name animemov-bot --restart unless-stopped --env-file .env ghcr.io/stdray/animemov-bot:latestlatest- последняя версия из main/master веткиdevelop- версия из develop веткиv1.0.0- конкретная релизная версия1.0.0- семантическая версия1.0- мажорная версия
- Автоматическое сканирование уязвимостей с помощью Trivy
- Проверка типов TypeScript
- Проверка сборки проекта
Учтите, что Twitter/X накладывает строгие rate limit — при коде ответа 429 бот уведомит инициатора о необходимости повторить запрос позже.