Home Library - Telegram-бот для учета домашней библиотеки.
Обычный сценарий работы с ботом выглядит так:
- Вы фотографируете штрихкод на задней стороне книги.
- Бот распознает ISBN по фотографии.
- Затем он проверяет, есть ли эта книга уже в каталоге домашней библиотеки.
- Если книга уже есть, бот показывает ее карточку и дает перейти к редактированию.
- Если книги еще нет, бот ищет информацию о ней по ISBN во внешних источниках: Лабиринт, Piter, Google Books и DuckDuckGo.
- Когда данные найдены, бот предлагает добавить книгу в каталог домашней библиотеки.
- После добавления можно указать или изменить статус, оценку, комментарий, темы и местоположение книги (например: дома, на даче, у мамы, дал Саше).
Что можно делать в боте:
- отправьте
/start, чтобы увидеть краткую справку - отправьте
/search <запрос>или просто текстовое сообщение, чтобы найти книгу в каталоге - отправьте фото штрихкода, если хотите найти и добавить книгу по ISBN
- используйте кнопки в боте, чтобы менять статус, оценку, комментарий, темы и местоположение
- если вы админ, используйте
/add_access_to_libraryдля выдачи Telegram-доступа членам семьи - если вы админ, используйте
/export <json|xlsx|csv|yaml|db>для выгрузки каталога
Дополнительно бот умеет:
- вести отдельные статусы, оценки и комментарии для разных пользователей библиотеки
- показывать статистику по каталогу
- добавлять новых пользователей библиотеки
Требуется Python 3.13.
python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txtСоздайте файл .env в корне проекта и запишите в него следующее:
LIBRARY_BOT_TOKEN=<токен от BotFather>
# Один из двух вариантов ниже обязателен для самого первого запуска:
LIBRARY_BOT_ADMIN_USERNAME=<username админа без @ или с @>
# LIBRARY_BOT_ADMIN_TELEGRAM_USER_ID=<числовой Telegram user ID>Запустите бота:
python -m home_libraryЕсли library.db еще нет, приложение само создаст ее из example_library.xlsx.
LIBRARY_BOT_TOKENобязателен всегда. Получить токен можно у @BotFather.- На самом первом запуске нужен
LIBRARY_BOT_ADMIN_USERNAMEилиLIBRARY_BOT_ADMIN_TELEGRAM_USER_ID. - Надежнее использовать
LIBRARY_BOT_ADMIN_TELEGRAM_USER_ID: он не зависит от смены username (в сети есть инфа как узнать свой telegram user_id). - Первым в бота должен написать именно этот Telegram-аккаунт.
- После первого входа бот сохраняет admin
telegram_user_idвusers.db. - После этого обычные перезапуски уже не зависят от
LIBRARY_BOT_ADMIN_USERNAME, покаusers.dbне потеряна.
Вместо .env можно использовать обычные переменные окружения:
export LIBRARY_BOT_TOKEN="<токен от BotFather>"
export LIBRARY_BOT_ADMIN_USERNAME="<username админа>"
python -m home_library- Бот всегда работает только по списку доступа.
- Админ настраивается при первом запуске и потом определяется по сохраненному
telegram_user_id. - Только админ может использовать
/add_library_member,/add_access_to_library,/remove_access_to_libraryи/export. - Пользователь библиотеки и Telegram-доступ - это разные сущности.
- Пользователи библиотеки живут в
library.dbи используются для статусов, оценок и комментариев. - Telegram-доступ живет в
users.dbи определяет только то, кто вообще может войти в бота. - Выдача Telegram-доступа двухшаговая:
- Админ открывает
/add_access_to_library. - Админ вручную вводит
@username. Администратору стоит сразу написать новому пользователю в личку и отправить ник бота. - Бот ждет первое сообщение именно от этого Telegram-аккаунта.
- После первого сообщения бот сохраняет
telegram_user_idвusers.db.
- При редактировании статуса, оценки или комментария бот сначала спрашивает, за какого пользователя библиотеки сохранить изменение.
/remove_access_to_libraryпозволяет администратору удалить Telegram-доступ выбранного аккаунта и при желании сразу удалить выбранного члена библиотеки вместе со всеми его данными.
Пример добавления нового человека:
- Админ делает
/add_library_member Ваня. - Админ делает
/add_access_to_libraryи вводит@vanya. - Админ пишет Ване в личку и скидывает ник Telegram-бота, после чего Ваня пишет боту первое сообщение.
- После этого Ваня может искать книги и через
Редактироватьвыбирать, за кого поставить статус, оценку или комментарий.
По умолчанию бот может стартовать с пустой базой каталога.
Если у вас уже есть оцифрованный список книг или вам удобнее сначала заполнить каталог руками, подготовьте example_library.xlsx заранее и импортируйте его до первого запуска бота.
python init_db.py
python -m home_libraryВажно:
python init_db.pyвсегда пересоздаетlibrary.dbзаново- существующие данные каталога в
library.dbбудут заменены содержимым Excel users.dbпри этом не изменяется
- Оставьте первую строку с названиями колонок.
- Одна строка ниже - одна книга.
- Минимально обязательные поля:
author,title. - Остальные поля можно оставлять пустыми и заполнять позже.
Основные колонки:
| Колонка | Описание |
|---|---|
id |
Порядковый номер |
author |
Автор книги |
title |
Название книги |
topics |
Темы или жанры |
publisher |
Издательство |
link |
Ссылка на книгу или магазин |
livelib_url |
Ссылка на страницу в LiveLib |
location |
Где сейчас книга |
post_links |
Полезные ссылки по книге |
isbn |
ISBN для поиска метаданных |
Пользовательские данные задаются отдельными колонками для каждого человека:
статус <имя>илиstatus_<имя>оценка <имя>илиrating_<имя>комментарий <имя>илиcomment_<имя>
Пример:
| id | author | title | topics | isbn | статус Анна | оценка Анна |
|----|----------------|------------------------|-----------|---------------|-------------|-------------|
| 1 | Рик Дюффер | Спиноза и попкорн | философия | 9785001695882 | прочитана | 5 |
| 2 | Филипп Гузенюк | Счастье в деятельности | бизнес | 9785001955580 | | |
Не стоит:
- удалять заголовки колонок из первой строки
- объединять ячейки
- оставлять пустые строки внутри таблицы
- произвольно ломать формат пользовательских колонок
/searchи обычное текстовое сообщение ищут только по уже сохраненным книгам в каталоге домашней библиотеки- внешний поиск используется только в сценарии добавления книги по фото штрихкода
- экспорт
/export dbотдает толькоlibrary.db;users.dbв экспорт не входит
example_library.xlsx- демонстрационный Excel-файл для настройки каталогаlibrary.db- локальная база каталога книгusers.db- локальная база Telegram-привязок, admin state и списка доступа
В library.db основными таблицами являются:
booksusersuser_book_data
users.db хранит отдельно:
- Telegram username и user id админа
- Telegram username и user id допущенных пользователей
- pending-доступы, ожидающие первое сообщение
library.db удобно смотреть через SQLite-клиент вроде DBeaver или DB Browser for SQLite.
| Команда | Описание |
|---|---|
/start |
Краткая справка |
/search <запрос> |
Поиск книги в локальном каталоге |
/stats |
Статистика каталога |
/users |
Список пользователей библиотеки |
/add_library_member <имя> |
Добавить пользователя библиотеки, только для админа |
/add_access_to_library |
Выдать Telegram-доступ, только для админа |
/remove_access_to_library |
Удалить Telegram-доступ и при желании пользователя библиотеки, только для админа |
| `/export <json | xlsx |
/cancel |
Отменить редактирование |
Для разработки установите зависимости через requirements-dev.txt, затем запускайте проверки:
python -m ruff check .
python -m ruff format --check .
python -m mypy
python -m pytest tests -vЕсть и более короткий прогон:
python -m pytest tests -qПримеры точечного запуска:
python -m pytest tests/test_home_library_db.py::TestUsers -v
python -m pytest tests/test_home_library_providers.py::TestFetchFromGoogleBooks::test_success -vВ GitHub Actions настроен прогон, который запускает ruff, mypy и pytest.
home_library/
domain/ # модели предметной области
services/ # сервисы статистики и экспорта
storage/ # SQLite, схемы и Excel bootstrap
providers/ # barcode и внешние книжные провайдеры
interfaces/
telegram/
handlers/ # main.py, commands.py, callbacks.py, access.py
Основной entrypoint:
python -m home_library- Проверьте, что активировано
venv:source venv/bin/activate. - Проверьте, что зависимости установлены:
python -m pip install -r requirements-dev.txt. - Убедитесь, что задан
LIBRARY_BOT_TOKEN. - Если это первый запуск или потерян
users.db, проверьтеLIBRARY_BOT_ADMIN_USERNAMEилиLIBRARY_BOT_ADMIN_TELEGRAM_USER_ID. - Убедитесь, что рядом лежит
example_library.xlsx. - Если
library.dbотсутствует или повреждена, пересоздайте ее:python init_db.py. - Если сломались Telegram-привязки или список доступа, удалите
users.db, заново задайте admin-переменную и пройдите первичную настройку админа. - Для проверки кода запустите
python -m pytest tests -q.
- реализация TUI
- vk бот