- Python 100%
| deploy/systemd | ||
| .env.example | ||
| .gitignore | ||
| bot.py | ||
| docker-compose.yml | ||
| README.md | ||
| requirements.txt | ||
| yt-dlp_linux | ||
Telegram bot (yt-dlp)
Бот работает через long polling, поэтому публичный URL и webhook не нужны.
Что умеет
- Доступ только для заранее заданных Telegram user ID (
ALLOWED_USER_IDS). - При ссылке на YouTube:
- показывает кнопки с вариантами качества видео,
- показывает варианты аудио (mp3),
- скачивает через
yt-dlpи отправляет файл.
- При ссылке на
x.com/twitter.com:- отправляет текст твита,
- пытается скачать и отправить все медиа из твита через
yt-dlp.
Установка
- Создайте venv и установите зависимости:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
- Подготовьте
.env:
cp .env.example .env
# заполните BOT_TOKEN и ALLOWED_USER_IDS
- Убедитесь, что
yt-dlpисполняемый:
chmod +x yt-dlp_linux
- Запустите:
python3 bot.py
Важно
- Для Telegram-бота режим "без публичного адреса" решается polling-режимом (
getUpdates). - Для некоторых твитов X/Twitter может понадобиться авторизация/cookies у
yt-dlp. - В обычном Bot API есть ограничение на загрузку файлов ботом (обычно около 50 MB), поэтому
MAX_UPLOAD_MB=49стоит безопасно.
Как отправлять большие файлы (без userbot)
Рекомендуемый путь: запустить официальный telegram-bot-api локально и направить туда бота.
- В
.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
- Установите Docker + Docker Compose.
- Запустите бота как обычно:
python3 bot.py
bot.py автоматически выполнит docker compose up -d telegram-bot-api и подождет готовности локального Bot API.
После этого бот продолжит работать через polling, а лимит отправки станет существенно выше (до ~2 GB на файл).
- При необходимости контейнер можно поднять вручную:
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.servicedeploy/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