Бот для создания и ведения собственных стикерпаков в Telegram:
- static стикеры (изображения),
- video стикеры (видео/гиф),
- импорт стикера из другого пака с выбором эмодзи (авто/исходный),
- авто-эмодзи через Gemma 4 с пониманием текста и смысла мема,
- обработка без обрезки по умолчанию с необязательной кнопкой
обрезать до квадрата, - выбор эмодзи кнопкой или простым сообщением с нужным эмодзи,
- черновик пака до первого стикера,
- несколько паков + переключение активного,
- совместное редактирование пака (owner/editor) через инвайты.
- inline-поиск GIF через Klipy:
@otter_sticker_bot запрос.
- Python 3.12
- aiogram 3
- SQLite
- ffmpeg
- Pillow + pillow-heif
- Gemma 4 26B через Google Generative Language API для авто-эмодзи
Исследование замены CLIP на быстрое vision-распознавание и воспроизводимый
benchmark: docs/emoji-vision-research.md.
/start/newpack/packs/setactive [pack_id]/invite @username/members/kick [member_id]/video6 [on|off]/help/cancel
- If something is off, contact
@ve_lizardor open a pull request in the repository: https://github.com/VelizarSeleznev/Telegram-Sticker-Bot
- Скопируйте
.env.exampleв.envи заполните значения. - Запустите:
docker compose up -d --build
- Логи:
docker compose logs -f sticker-bot
BOT_TOKEN- токен бота от BotFatherDB_PATH- путь к SQLite (по умолчанию/data/bot.db)TEMP_DIR- временная папка для обработки медиаLOG_LEVEL-INFO|DEBUG|WARNMAX_CONCURRENT_JOBS- число параллельных конвертацийPOLLING_TIMEOUT- timeout long pollingGEMINI_API_KEY- обязательный Google AI API key для Gemma 4EMOJI_VISION_MODEL- vision-модель автоэмодзи, по умолчаниюgemma-4-26b-a4b-itEMOJI_VISION_TIMEOUT_SECONDS- максимальное ожидание Gemma, по умолчанию30EMOJI_VISION_MAX_OUTPUT_TOKENS- лимит JSON-ответа, по умолчанию192KLIPY_API_KEY- ключ Klipy API для inline-поиска GIFKLIPY_CLIENT_KEY- client key для Klipy, по умолчаниюotter_sticker_botKLIPY_LOCALE- локаль поиска Klipy, по умолчаниюru_RUKLIPY_COUNTRY- country hint для Klipy, по умолчаниюUSKLIPY_CONTENT_FILTER- фильтр контента Klipy, по умолчаниюmedium
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# заполните .env
python -m app.main- Изображения и импортируемые static-стикеры: длинная сторона масштабируется вверх или вниз до
512 px, затем результат центрируется на прозрачном холсте512x512и сохраняется вwebp;center cropдо квадрата доступен кнопкой на шаге выбора эмодзи для новых изображений. - Видео: по умолчанию
fit, авто-трим до3s, без аудио,VP9/webm; двухпроходный подбор битрейта сохраняет холст512x512и укладывает файл в256 КБ, затемffprobeпроверяет результат перед отправкой. - Experimental-режим
/video6 onсохраняется в профиле пользователя и обрабатывает следующие видео длительностью до6s, подменяя WebM Duration. Это неофициальный обход лимита Telegram;/video6 offвозвращает надежные3s. - После добавления бот отправляет готовый стикер в чат, если Telegram принимает локальный файл как sticker-preview.
- На шаге выбора эмодзи можно нажать предложенный вариант или просто отправить нужный эмодзи сообщением.
- Для video-стикера Gemma получает один контактный лист из трёх кадров. Если API недоступен или вернул не три валидных эмодзи, бот показывает нейтральные резервные варианты и не обращается к CLIP или другой модели.
- Если Telegram отклоняет формат для текущего пака: бот сообщает ошибку и просит сменить/создать пак.
В Docker Compose:
- состояние хранится в volume
bot_data(/data/bot.db), - для переноса на другой сервер достаточно перенести проект +
.env+ backup volume.
- GitHub Actions workflow
.github/workflows/deploy-seggver.ymlзапускается на self-hosted runnerseggver-sticker-bot. - Runtime-путь на сервере:
/home/egg/telegram-sticker-bot. - Deploy script:
scripts/deploy_seggver.sh; он синхронизирует checkout в runtime-путь, сохраняет серверный.env, пересобираетdocker composeи проверяет help-текст внутри контейнера.
- На старте бот проверяет
getMe()с повтором при transientTelegramNetworkError, чтобы краткие DNS/Telegram-сбои не валили контейнер.
- MVP работает только в личных чатах.
- Animated
.tgsв MVP не поддерживается. - Решения и ограничения media pipeline описаны в
docs/media-pipeline.md.