📚 Yandex Bookmate API v2.0
Неофициальный Python API для Яндекс.Книг с нативной аутентификацией Bookmate
⚠️ Версия 2.0 — несовместима с v0.1.x
Это полностью переписанная версия библиотеки. Если вы использовали версию
0.1.2и ниже, ознакомьтесь с руководством по миграции.
Что нового в v2.0
- Клиент-серверная архитектура — единый
YandexBookClientвместо статических методов на моделях - OAuth-авторизация — приватные методы (библиотека, полки, профиль) через Яндекс OAuth-токен
- 20+ приватных методов — управление библиотекой, полками, достижениями, уведомлениями и др.
- GraphQL-поддержка — поиск, подписки, статистика чтения через GraphQL endpoint
- Async-версия — полноценный асинхронный клиент на aiohttp (
pip install yandex-book-api[async]) - Dataclass-модели вместо Pydantic — легковеснее, без внешних зависимостей для моделей
- Кастомные исключения —
UnauthorizedError,NotFoundError,BadRequestErrorи др. - Тесты — pytest-покрытие основных моделей
Миграция с v0.1.x на v2.0
Ключевые отличия
| v0.1.x | v2.0 | |
|---|---|---|
| Архитектура | Статические методы на моделях (User.get()) |
Единый клиент YandexBookClient |
| Модели | Pydantic BaseModel |
Dataclass через @model декоратор |
| Зависимости | pydantic>=2.0, requests |
Только requests (pydantic убран) |
| Python | >=3.8 |
>=3.9 |
| Авторизация | Нет | OAuth-токен Яндекса |
| Async | Нет | aiohttp (опционально) |
| Ошибки | requests.HTTPError |
ApiError, UnauthorizedError, NotFoundError… |
Примеры миграции
Было (v0.1.x):
from yandex_book import User, Book
user = User.get("b1234567890")
books = User.list_books(user.id)
book = Book.get("mqK3FFjg")
book.download_cover(size="small", dest="cover.jpg")
Стало (v2.0):
from yandex_book import YandexBookClient
# Без токена — только публичные методы
client = YandexBookClient()
user = client.get_user("b1234567890")
books = client.get_user_books(user.id_)
# С токеном — все методы
client = YandexBookClient('y0_AgAAAA...')
book = client.get_book("mqK3FFjg")
client.download_file(book.cover.small, "cover.jpg")
# Приватные методы (требуют токен)
my_library = client.get_my_library()
client.add_book("mqK3FFjg")
Содержание
Установка
Установите библиотеку через pip:
pip install yandex-book-api
Если вы хотите использовать асинхронный клиент (на базе aiohttp), установите его с дополнительными зависимостями:
pip install yandex-book-api[async]
Для локальной разработки (в режиме редактирования):
pip install -e .
Получение токена
Нужен токен Яндекса формат: y0_AgAAAA...
Через OAuth:
Запустите из корня проекта:
python3 get_token.py
Скрипт откроет страницу входа в обычном браузере. На macOS он будет ждать завершения входа и автоматически прочитает URL возврата из активной вкладки Safari. Если система запросит доступ, разрешите Terminal управлять Safari. Если автоматическое чтение не сработает или используется Windows/Linux, скрипт попросит вставить полную ссылку из адресной строки браузера.
Вручную через браузер:
Откройте эту ссылку в браузере и войдите в аккаунт:
https://oauth.yandex.ru/authorize?response_type=token&client_id=4483e97bab6e486a9822973109a14d05
После входа скопируйте access_token из URL возврата. Он находится после # и начинается с y0_. Если в адресной строке нет access_token и отображается только ошибка открытия Букмейта, используйте скрипт выше.
Токен используйте как аргумент YandexBookClient(token). Не публикуйте и не сохраняйте его в Git.
Публичные методы (без авторизации)
User.get()
Получить информацию о пользователе.
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: User объект с полями:
| Поле | Тип | Описание |
|---|---|---|
id |
int |
Числовой ID |
login |
str |
Логин пользователя |
name |
str? |
Полное имя |
avatar |
Avatar? |
Аватар |
library_cards_count |
int? |
Кол-во книг в библиотеке |
followers_count |
int? |
Кол-во подписчиков |
followings_count |
int? |
Кол-во подписок |
bookshelves_count |
int? |
Кол-во полок |
about |
str? |
О себе |
facebook, twitter, vk, site |
str? |
Соцсети/сайт |
User.list_books()
Получить публичные книги пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: List[Book] с полями:
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
Уникальный ID книги |
title |
str? |
Название |
annotation |
str? |
Аннотация |
cover |
Image? |
Обложка (small, large, placeholder) |
authors_objects |
List[Person]? |
Авторы |
User.list_audiobooks()
Получить публичные аудиокниги пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: List[Audiobook] (наследует Book + дополнительные поля):
| Поле | Тип | Описание |
|---|---|---|
duration |
int? |
Длительность в секундах |
language |
str? |
Язык |
narrators |
List[Person]? |
Чтецы/рассказчики |
listeners_count |
int? |
Кол-во слушателей |
age_restriction |
str? |
Возрастное ограничение |
User.list_quotes()
Получить цитаты пользователя (публично).
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: List[Quote] с полями:
| Поле | Тип | Описание |
|---|---|---|
content |
str |
Текст цитаты |
book |
Book |
Книга, откуда цитата |
created_at |
int |
Timestamp создания |
likes_count |
int |
Кол-во лайков |
comments_count |
int |
Кол-во комментариев |
User.list_bookshelves()
Получить полки пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: List[Bookshelf]
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
ID полки |
title |
str |
Название |
annotation |
str? |
Описание |
books_count |
int? |
Кол-во книг |
followers_count |
int? |
Подписчиков |
User.list_impressions()
Получить рецензии пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| user_id | int|str |
ID пользователя |
Возвращает: List[Impression]
| Поле | Тип | Описание |
|---|---|---|
content |
str? |
Текст рецензии |
book |
Book? |
Книга |
likes_count |
int? |
Лайки |
comments_count |
int? |
Комментарии |
Book.get()
Получить информацию о книге.
| Параметр | Тип | Описание |
|---|---|---|
| book_id | str |
UUID книги |
Возвращает: Book объект
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
Уникальный ID |
title |
str? |
Название |
annotation |
str? |
Описание |
cover |
Image? |
Обложка |
authors_objects |
List[Person]? |
Авторы |
Book.impressions()
Получить рецензии на книгу.
| Параметр | Тип | Описание |
|---|---|---|
| book_id | str |
UUID книги |
Возвращает: List[Impression]
Приватные методы (с авторизацией)
Client(auth_token)
Инициализировать авторизованный клиент.
| Параметр | Тип | Описание |
|---|---|---|
| auth_token | str |
Ваш Auth-Token |
client.test_token()
Проверить валидность токена.
| Параметры | Нет |
| Возвращает | bool - True если токен работает |
client.get_profile()
Получить свой профиль.
| Параметры | Нет |
| Возвращает | Dict с ключом user содержащим профиль |
Поля user:
| Поле | Тип | Описание |
|---|---|---|
id |
int |
Числовой ID |
login |
str |
Ваш логин |
name |
str? |
Имя |
email |
str? |
|
library_cards_count |
int? |
Кол-во книг |
followers_count |
int? |
Подписчиков |
following_count |
int? |
Подписок |
client.get_my_library()
Получить мою приватную библиотеку.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
| limit | int |
50 | Кол-во книг (макс 100) |
| offset | int |
0 | Смещение для пагинации |
Возвращает: Dict с ключом data содержащим список карточек:
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
UUID карточки библиотеки |
book |
Book |
Объект книги (title, annotation, cover и т.д.) |
progress |
int |
Прогресс чтения (0-100%) |
state |
str |
Статус: pending, reading, finished |
started_at |
int? |
Timestamp начала |
finished_at |
int? |
Timestamp завершения |
client.add_book()
Добавить книгу в мою библиотеку.
| Параметр | Тип | Описание |
|---|---|---|
| book_id | str |
UUID книги |
Возвращает: Dict с полями:
| Поле | Тип | Описание |
|---|---|---|
status |
str |
success или error |
book_id |
str |
UUID добавленной книги |
book_title |
str? |
Название книги |
library_card_uuid |
str? |
UUID карточки в библиотеке |
error |
str? |
Сообщение ошибки если есть |
client.remove_book()
Удалить книгу из моей библиотеки.
| Параметр | Тип | Описание |
|---|---|---|
| library_card_uuid | str |
UUID карточки (из get_my_library) |
Возвращает: Dict с полями:
| Поле | Тип | Описание |
|---|---|---|
status |
str |
success или error |
message |
str? |
Описание результата |
error |
str? |
Сообщение ошибки если есть |
client.get_my_bookshelves()
Получить мои книжные полки.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
| page | int |
1 | Номер страницы |
| per_page | int |
20 | Кол-во полок на странице |
Возвращает: Dict с ключом data содержащим список полок:
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
UUID полки |
title |
str |
Название полки |
annotation |
str? |
Описание |
books_count |
int? |
Кол-во книг на полке |
followers_count |
int? |
Подписчиков |
client.get_notifications_status()
Получить статус уведомлений.
| Параметры | Нет |
| Возвращает | Dict с информацией о новых уведомлениях |
client.get_reading_achievements()
Получить достижения за год.
| Параметр | Тип | Описание |
|---|---|---|
| year | int? |
Год для статистики (по умолчанию текущий) |
Возвращает: Dict с полями:
| Поле | Тип | Описание |
|---|---|---|
finished_books_count |
int |
Книг прочитано |
pages |
int |
Всего страниц |
seconds |
int |
Всего секунд чтения |
year |
int |
Год |
reading_challenge |
Dict? |
Информация о челлендже |
client.get_popular_searches()
Получить популярные поиски.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
| language | str |
ru |
Код языка |
| page | int |
1 | Номер страницы |
Возвращает: Dict с ключом data содержащим список популярных запросов
client.get_emotions()
Получить доступные эмоции для рецензий.
| Параметры | Нет |
| Возвращает | Dict с ключом data содержащим список эмоций |
client.get_access_levels()
Получить уровни доступа к контенту.
| Параметры | Нет |
| Возвращает | Dict с информацией об уровнях доступа |
client.get_counters()
Получить счётчики профиля.
| Параметры | Нет |
| Возвращает | Dict со счётчиками (сообщения, уведомления и т.д.) |
client.get_context()
Получить контекст приложения.
| Параметры | Нет |
| Возвращает | Dict с контекстной информацией приложения |
client.get_privacy_settings()
Получить настройки приватности.
| Параметры | Нет |
| Возвращает | Dict с настройками приватности профиля |
client.get_sync_state()
Получить состояние синхронизации.
| Параметры | Нет |
| Возвращает | Dict с состоянием синхронизации данных |
client.get_metadata_secret()
Получить секретные метаданные.
| Параметры | Нет |
| Возвращает | Dict с защищёнными метаданными профиля |
client.get_user_json()
Получить полные данные пользователя.
| Параметры | Нет |
| Возвращает | Dict с полным JSON объектом пользователя |
client.get_push_notification_restrictions()
Получить ограничения для push уведомлений.
| Параметры | Нет |
| Возвращает | Dict с настройками ограничений для push уведомлений |
client.get_features()
Получить информацию о функциях.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
| feature_names | List[str]? |
Стандартные | Список названий функций для проверки |
Возвращает: Dict с информацией о доступности функций
client.get_series_following()
Получить серии, на которые я подписан.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
| user_id | str? |
Не требуется | ID пользователя (если None - свои серии) |
| page | int |
1 | Номер страницы |
| per_page | int |
20 | Кол-во серий на странице |
Возвращает: Dict с ключом series содержащим список серий:
| Поле | Тип | Описание |
|---|---|---|
uuid |
str |
Уникальный ID серии |
title |
str |
Название серии |
description |
str? |
Описание серии |
books_count |
int? |
Кол-во книг в серии |
Таблица всех REST методов Client
Всего 21 метод (+ новый get_series_following):
| № | Метод | Параметры | Назначение |
|---|---|---|---|
| 1 | test_token() |
— | Проверка валидности токена |
| 2 | get_profile() |
— | Получить свой профиль |
| 3 | get_my_library() |
limit, offset | Получить мою библиотеку |
| 4 | add_book() |
book_id | Добавить книгу в библиотеку |
| 5 | remove_book() |
library_card_uuid | Удалить книгу из библиотеки |
| 6 | get_my_bookshelves() |
page, per_page | Получить мои полки |
| 7 | get_notifications_status() |
— | Статус уведомлений |
| 8 | get_reading_achievements() |
year | Достижения за год |
| 9 | get_popular_searches() |
language, page | Популярные поиски |
| 10 | get_emotions() |
— | Доступные эмоции |
| 11 | get_access_levels() |
— | Уровни доступа |
| 12 | get_counters() |
— | Счётчики профиля |
| 13 | get_context() |
— | Контекст приложения |
| 14 | get_privacy_settings() |
— | Настройки приватности |
| 15 | get_sync_state() |
— | Состояние синхронизации |
| 16 | get_metadata_secret() |
— | Секретные метаданные |
| 17 | get_user_json() |
— | Полные данные пользователя |
| 18 | get_push_notification_restrictions() |
— | Ограничения push уведомлений |
| 19 | get_features() |
feature_names | Информация о функциях |
| 20 | get_series_following() |
user_id, page, per_page | Серии подписок |
Модели данных
Image / Avatar
| Поле | Тип | Описание |
|---|---|---|
small |
str? |
URL миниатюры |
large |
str? |
URL большого изображения |
placeholder |
str? |
Base64 заглушка |
ratio |
float? |
Соотношение сторон |
background_color_hex |
str? |
Цвет фона (HEX) |
Person
| Поле | Тип | Описание |
|---|---|---|
name |
str |
Имя (автор, иллюстратор, чтец) |
locale |
str? |
Локаль (ru, en и т.д.) |
uuid |
str? |
Уникальный ID |
works_count |
int? |
Кол-во работ |
image |
Image? |
Профильное изображение |
Label
| Поле | Тип | Описание |
|---|---|---|
title |
str |
Название метки |
kind |
str |
Тип метки |
Примеры
Публичные методы (без токена)
from yandex_book import YandexBookClient
client = YandexBookClient()
# Получить пользователя
user = client.get_user("b1234567890")
print(user.name, user.login)
# Книги пользователя
books = client.get_user_books(user.id_)
for book in books[:3]:
print(book.display_title)
# Информация о книге
book = client.get_book("mqK3FFjg")
print(book.title, book.annotation)
Приватные методы (с токеном)
from yandex_book import YandexBookClient
client = YandexBookClient('y0_AgAAAA...')
# Проверить токен
if client.test_token():
print("Токен валиден!")
# Профиль
me = client.get_profile()
print(me.name, me.login)
# Библиотека
library = client.get_my_library(limit=10)
for card in library:
print(card.book.display_title, card.state)
# Добавить / удалить книгу
client.add_book("mqK3FFjg")
# Поиск через GraphQL
results = client.search("Мастер и Маргарита")
Async-версия
import asyncio
from yandex_book import YandexBookClientAsync
async def main():
client = YandexBookClientAsync('y0_AgAAAA...')
me = await client.get_profile()
books = await client.get_user_books(me.id_)
print(f"{me.name}: {len(books)} книг")
await client._request.close()
asyncio.run(main())
Обработка ошибок
from yandex_book import YandexBookClient, NotFoundError, UnauthorizedError
client = YandexBookClient('y0_AgAAAA...')
try:
user = client.get_user("nonexistent")
except NotFoundError:
print("Пользователь не найден")
except UnauthorizedError:
print("Неверный токен")
Лицензия
MIT
Metadata
Release files for yandex-book-api 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yandex_book_api-2.0.1.tar.gz | 38.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yandex_book_api-2.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 81.1 kB
Release files / yandex_book_api-2.0.1.tar.gz
| Download URL | yandex_book_api-2.0.1.tar.gz |
|---|---|
| Size | 38.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
31ba9852bfae69e17f47ea49940a2ed0ec5b955ca60530e202921364f42bdf1c
|
|
BLAKE2b-256 checksum How to use checksums |
28a8b7b3e33c7929dba92ba80db71a5e436e043b0100b23004bc8858dd5463c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Release files / yandex_book_api-2.0.1-py3-none-any.whl
| Download URL | yandex_book_api-2.0.1-py3-none-any.whl |
|---|---|
| Size | 42.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c2201f91b6dc024e62858eaaa7382ef4b939c816f64d34af76e2848c26948b3f
|
|
BLAKE2b-256 checksum How to use checksums |
818e28bf40c72b790c5991c1b714e68389f0ada5ba28f18407317f9f70c020d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|