- Скачивает видео по ссылке с популярных платформ через
yt-dlp. - Работает в
inline-режиме (можно отправлять ссылку прямо из поля ввода). - Поддерживает работу в группах.
- Грузит видео в фоне и отправляет результат по готовности.
- Использует очередь и ограничения на пользователя.
- Хранит статистику в SQLite и автоматически мигрирует старый
user_stats.json. - Поддерживает админ-команды и базовую статистику.
pip install -r requirements.txtСкопируйте .env.example в .env и заполните нужные значения:
BOT_TOKEN=ваш_токен_бота
ADMIN_IDS=123456789
VIP_USERS=Для отправки файлов больше стандартного лимита Bot API поднимите локальный
telegram-bot-api и укажите его адрес. TELEGRAM_API_ID и
TELEGRAM_API_HASH создаются на https://my.telegram.org/apps.
BOT_API_BASE_URL=http://127.0.0.1:8081
BOT_API_IS_LOCAL=true
MAX_FILE_SIZE=2097152000
SEND_AS_DOC_LIMIT=2097152000
TELEGRAM_API_ID=ваш_api_id
TELEGRAM_API_HASH=ваш_api_hashЗапуск локального Bot API через Docker:
docker compose up -d telegram-bot-api
docker compose logs -f telegram-bot-apiПосле этого запускайте бота обычной командой:
python main.pyDocker не обязателен для работы бота. Но для отправки файлов больше облачного
лимита Telegram нужен локальный telegram-bot-api. Если на сервере нет
локального telegram-bot-api, оставьте BOT_API_BASE_URL пустым или удалите
эту переменную из .env.
Минимальный .env для Python-only запуска:
BOT_TOKEN=ваш_токен_бота
ADMIN_IDS=123456789
VIP_USERS=
MAX_FILE_SIZE=52428800
SEND_AS_DOC_LIMIT=52428800Команда для вкладки Service на alwaysdata:
bash -c 'export PATH=$HOME/.local/bin:$HOME/ffmpeg/ffmpeg-7.0.2-amd64-static:$PATH && cd /home/renothing/ReSave && python main.py'В таком режиме бот работает через облачный Telegram Bot API. Это полностью
Python-запуск, но отправка файлов ограничена примерно 50 MB. Собственный
FastAPI/Flask API можно добавить для внешних запросов к вашему сервису, но он
не заменит локальный telegram-bot-api и не снимет лимит Telegram на загрузку
больших файлов.
Чтобы отправлять файлы до 2000 MB без Docker, установите бинарник
telegram-bot-api в домашнюю директорию, например в
$HOME/.local/bin/telegram-bot-api, и запускайте его вместе с ботом одним
Service-процессом.
Собрать Linux-бинарник на Mac можно через Docker:
bash scripts/build_telegram_bot_api_linux_amd64.shГотовый файл появится здесь:
dist/telegram-bot-api-linux-amd64Загрузите его на сервер:
scp dist/telegram-bot-api-linux-amd64 renothing@ssh-renothing.alwaysdata.net:/home/renothing/.local/bin/telegram-bot-api
ssh renothing@ssh-renothing.alwaysdata.net 'chmod +x /home/renothing/.local/bin/telegram-bot-api'В .env нужны:
BOT_TOKEN=ваш_токен_бота
ADMIN_IDS=123456789
VIP_USERS=
TELEGRAM_API_ID=ваш_api_id
TELEGRAM_API_HASH=ваш_api_hash
MAX_FILE_SIZE=2097152000
SEND_AS_DOC_LIMIT=2097152000
MAX_CONCURRENT_DOWNLOADS=1
MAX_DOWNLOADS_PER_USER=1
INLINE_DOWNLOAD_ENABLED=falseКоманда для вкладки Service:
bash /home/renothing/ReSave/scripts/run_alwaysdata_local_bot_api.shПо умолчанию скрипт ожидает бинарник здесь:
/home/renothing/.local/bin/telegram-bot-apiЕсли путь другой, задайте его перед запуском:
bash -c 'export BOT_API_BIN=$HOME/telegram-bot-api/bin/telegram-bot-api && bash /home/renothing/ReSave/scripts/run_alwaysdata_local_bot_api.sh'Скрипт поднимает Bot API на 127.0.0.1:8081, поэтому он доступен только боту
внутри этого же Service-процесса. Это безопаснее, чем открывать порт сервиса
наружу.
Если нужны авторизованные источники, добавьте cookies в cookies.txt.
python main.pyОсновные параметры находятся в config.py:
| Параметр | Назначение |
|---|---|
BOT_TOKEN |
Токен Telegram-бота (читается из .env) |
ADMIN_IDS, VIP_USERS |
ID админов и VIP-пользователей |
TEMP_DIR |
Временная директория для загрузок |
STATS_DB_PATH |
SQLite-файл со статистикой |
MAX_CONCURRENT_DOWNLOADS |
Лимит одновременных загрузок |
MAX_DOWNLOADS_PER_USER |
Лимит активных загрузок на пользователя |
MAX_FILE_SIZE, SEND_AS_DOC_LIMIT |
Ограничения по размеру и порог отправки как документа |
BOT_API_BASE_URL, BOT_API_IS_LOCAL |
Адрес локального Bot API для отправки файлов до 2000 MB |
MAX_VIDEO_DURATION_FREE, MAX_VIDEO_DURATION_PREMIUM |
Лимит длительности для free/premium |
MAX_PLAYLIST_ITEMS_FREE, MAX_PLAYLIST_ITEMS_PREMIUM |
Лимит элементов плейлиста для free/premium |
LOG_LEVEL |
Уровень логирования (INFO, DEBUG, ...) |
main.py- точка входа.src/- основная логика приложения.tests/- автоматические тесты.temp_downloads/- временные загруженные файлы.cookies.txt- cookies дляyt-dlp.database.db- SQLite-база со статистикой.bot.log- локальные логи.
python -m unittest discover -s tests -vВ репозитории также настроен GitHub Actions workflow CI, который компилирует исходники и запускает тесты на каждый push и pull request.
sudo systemctl start resave
sudo systemctl status resaveПолезные команды:
sudo systemctl restart resave
journalctl -u resave -f
sudo systemctl enable resave- Если
ffmpegне установлен, часть медиавозможностей может быть недоступна. - Бот больше не устанавливает зависимости на лету: перед запуском нужно явно выполнить
pip install -r requirements.txt. - Обычные плейлисты ставятся в очередь автоматически в среднем качестве, если пользователь укладывается в лимиты.
