No description
Find a file
2026-02-26 14:55:35 +03:00
deploy/systemd first commit 2026-02-26 14:55:35 +03:00
.env.example first commit 2026-02-26 14:55:35 +03:00
.gitignore first commit 2026-02-26 14:55:35 +03:00
bot.py first commit 2026-02-26 14:55:35 +03:00
docker-compose.yml first commit 2026-02-26 14:55:35 +03:00
README.md first commit 2026-02-26 14:55:35 +03:00
requirements.txt first commit 2026-02-26 14:55:35 +03:00
yt-dlp_linux first commit 2026-02-26 14:55:35 +03:00

Telegram bot (yt-dlp)

Бот работает через long polling, поэтому публичный URL и webhook не нужны.

Что умеет

  • Доступ только для заранее заданных Telegram user ID (ALLOWED_USER_IDS).
  • При ссылке на YouTube:
    • показывает кнопки с вариантами качества видео,
    • показывает варианты аудио (mp3),
    • скачивает через yt-dlp и отправляет файл.
  • При ссылке на x.com / twitter.com:
    • отправляет текст твита,
    • пытается скачать и отправить все медиа из твита через yt-dlp.

Установка

  1. Создайте venv и установите зависимости:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
  1. Подготовьте .env:
cp .env.example .env
# заполните BOT_TOKEN и ALLOWED_USER_IDS
  1. Убедитесь, что yt-dlp исполняемый:
chmod +x yt-dlp_linux
  1. Запустите:
python3 bot.py

Важно

  • Для Telegram-бота режим "без публичного адреса" решается polling-режимом (getUpdates).
  • Для некоторых твитов X/Twitter может понадобиться авторизация/cookies у yt-dlp.
  • В обычном Bot API есть ограничение на загрузку файлов ботом (обычно около 50 MB), поэтому MAX_UPLOAD_MB=49 стоит безопасно.

Как отправлять большие файлы (без userbot)

Рекомендуемый путь: запустить официальный telegram-bot-api локально и направить туда бота.

  1. В .env укажите:
TELEGRAM_API_ID=<твой api_id с my.telegram.org>
TELEGRAM_API_HASH=<твой api_hash с my.telegram.org>
TELEGRAM_LOCAL_PORT=8081
TELEGRAM_BASE_URL=http://127.0.0.1:8081/bot
TELEGRAM_BASE_FILE_URL=http://127.0.0.1:8081/file/bot
MAX_UPLOAD_MB=1900
AUTO_START_LOCAL_BOT_API=1
  1. Установите Docker + Docker Compose.
  2. Запустите бота как обычно:
python3 bot.py

bot.py автоматически выполнит docker compose up -d telegram-bot-api и подождет готовности локального Bot API.

После этого бот продолжит работать через polling, а лимит отправки станет существенно выше (до ~2 GB на файл).

  1. При необходимости контейнер можно поднять вручную:
docker compose up -d telegram-bot-api

Если контейнер раньше падал с ошибкой про /tmp/telegram-bot-api, перезапустите его с пересозданием:

docker compose down
docker compose up -d --force-recreate telegram-bot-api

Если 8081 уже занят, смените порт:

TELEGRAM_LOCAL_PORT=8082
TELEGRAM_BASE_URL=http://127.0.0.1:8082/bot
TELEGRAM_BASE_FILE_URL=http://127.0.0.1:8082/file/bot

Почему не userbot

Сделать "бота как клиент Telegram" (MTProto/userbot) можно, но это уже не Bot API, сложнее в эксплуатации и обычно менее безопасно для основного аккаунта. Для твоего кейса локальный Bot API сервер обычно достаточно и проще.

Таймауты при отправке больших файлов

Если файл уходит в чат, но в логах появляется telegram.error.TimedOut, увеличьте таймауты в .env:

MEDIA_SEND_CONNECT_TIMEOUT=30
MEDIA_SEND_READ_TIMEOUT=600
MEDIA_SEND_WRITE_TIMEOUT=600
MEDIA_SEND_POOL_TIMEOUT=30

Автозапуск через systemd (через 1 минуту после загрузки)

В репозитории есть готовые юниты:

  • deploy/systemd/downloader-bot.service
  • deploy/systemd/downloader-bot.timer

Установка user-юнитов:

mkdir -p ~/.config/systemd/user
cp deploy/systemd/downloader-bot.service ~/.config/systemd/user/
cp deploy/systemd/downloader-bot.timer ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now downloader-bot.timer

Проверка:

systemctl --user status downloader-bot.timer
systemctl --user status downloader-bot.service
journalctl --user -u downloader-bot.service -f

Чтобы user-сервис запускался без входа в сессию:

sudo loginctl enable-linger $USER