Skip to content

Users Service

The UserService searches and retrieves Skoob user profiles.

Example

from pyskoob import SkoobClient

with SkoobClient() as client:
    # TIP: use environment variables or a secrets manager instead of hard-coding credentials
    client.auth.login(email="you@example.com", password="secret")
    results = client.users.search("victor")
    for user in results.results:
        print(user.name, user.id)

Services for retrieving and manipulating Skoob user data.

AsyncUserService

Bases: _UserServiceMixin, AsyncAuthenticatedService

Asynchronous variant of :class:UserService.

Source code in pyskoob/users.py
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
class AsyncUserService(_UserServiceMixin, AsyncAuthenticatedService):  # pragma: no cover - thin async wrapper
    """Asynchronous variant of :class:`UserService`."""

    def __init__(self, client: AsyncHTTPClient, auth_service: AsyncAuthService):
        super().__init__(client, auth_service)

    async def get_by_id(self, user_id: int) -> User:
        """Asynchronous wrapper around :meth:`_get_by_id`."""

        return await self._get_by_id(user_id)

    async def get_relations(self, user_id: int, relation: UsersRelation, page: int = 1) -> Pagination[int]:
        """Asynchronous wrapper around :meth:`_get_relations`."""

        return await self._get_relations(user_id, relation, page)

    async def get_reviews(self, user_id: int, page: int = 1) -> Pagination[BookReview]:
        """Asynchronous wrapper around :meth:`_get_reviews`."""

        return await self._get_reviews(user_id, page)

    async def get_read_stats(self, user_id: int) -> UserReadStats:
        """Asynchronous wrapper around :meth:`_get_read_stats`."""

        return await self._get_read_stats(user_id)

    async def get_bookcase(self, user_id: int, bookcase_option: BookcaseOption, page: int = 1) -> Pagination[UserBook]:
        """Asynchronous wrapper around :meth:`_get_bookcase`."""

        return await self._get_bookcase(user_id, bookcase_option, page)

    async def search(
        self,
        query: str,
        gender: UserGender | None = None,
        state: BrazilianState | None = None,
        page: int = 1,
        limit: int = 100,
    ) -> Pagination[UserSearch]:
        """Asynchronous wrapper around :meth:`_search`."""

        return await self._search(query, gender, state, page, limit)

get_bookcase(user_id, bookcase_option, page=1) async

Asynchronous wrapper around :meth:_get_bookcase.

Source code in pyskoob/users.py
438
439
440
441
async def get_bookcase(self, user_id: int, bookcase_option: BookcaseOption, page: int = 1) -> Pagination[UserBook]:
    """Asynchronous wrapper around :meth:`_get_bookcase`."""

    return await self._get_bookcase(user_id, bookcase_option, page)

get_by_id(user_id) async

Asynchronous wrapper around :meth:_get_by_id.

Source code in pyskoob/users.py
418
419
420
421
async def get_by_id(self, user_id: int) -> User:
    """Asynchronous wrapper around :meth:`_get_by_id`."""

    return await self._get_by_id(user_id)

get_read_stats(user_id) async

Asynchronous wrapper around :meth:_get_read_stats.

Source code in pyskoob/users.py
433
434
435
436
async def get_read_stats(self, user_id: int) -> UserReadStats:
    """Asynchronous wrapper around :meth:`_get_read_stats`."""

    return await self._get_read_stats(user_id)

get_relations(user_id, relation, page=1) async

Asynchronous wrapper around :meth:_get_relations.

Source code in pyskoob/users.py
423
424
425
426
async def get_relations(self, user_id: int, relation: UsersRelation, page: int = 1) -> Pagination[int]:
    """Asynchronous wrapper around :meth:`_get_relations`."""

    return await self._get_relations(user_id, relation, page)

get_reviews(user_id, page=1) async

Asynchronous wrapper around :meth:_get_reviews.

Source code in pyskoob/users.py
428
429
430
431
async def get_reviews(self, user_id: int, page: int = 1) -> Pagination[BookReview]:
    """Asynchronous wrapper around :meth:`_get_reviews`."""

    return await self._get_reviews(user_id, page)

search(query, gender=None, state=None, page=1, limit=100) async

Asynchronous wrapper around :meth:_search.

Source code in pyskoob/users.py
443
444
445
446
447
448
449
450
451
452
453
async def search(
    self,
    query: str,
    gender: UserGender | None = None,
    state: BrazilianState | None = None,
    page: int = 1,
    limit: int = 100,
) -> Pagination[UserSearch]:
    """Asynchronous wrapper around :meth:`_search`."""

    return await self._search(query, gender, state, page, limit)

UserService

Bases: _UserServiceMixin, AuthenticatedService

Fetch user profiles, books and friends from Skoob.

Source code in pyskoob/users.py
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
class UserService(_UserServiceMixin, AuthenticatedService):
    """Fetch user profiles, books and friends from Skoob."""

    def __init__(self, client: SyncHTTPClient, auth_service: AuthService):
        """Initialize the service with dependencies."""

        super().__init__(client, auth_service)

    def get_by_id(self, user_id: int) -> User:
        """Synchronous wrapper around :meth:`_get_by_id`."""

        return run_sync(self._get_by_id(user_id))

    def get_relations(self, user_id: int, relation: UsersRelation, page: int = 1) -> Pagination[int]:
        """Synchronous wrapper around :meth:`_get_relations`."""

        return run_sync(self._get_relations(user_id, relation, page))

    def get_reviews(self, user_id: int, page: int = 1) -> Pagination[BookReview]:
        """Synchronous wrapper around :meth:`_get_reviews`."""

        return run_sync(self._get_reviews(user_id, page))

    def get_read_stats(self, user_id: int) -> UserReadStats:
        """Synchronous wrapper around :meth:`_get_read_stats`."""

        return run_sync(self._get_read_stats(user_id))

    def get_bookcase(self, user_id: int, bookcase_option: BookcaseOption, page: int = 1) -> Pagination[UserBook]:
        """Synchronous wrapper around :meth:`_get_bookcase`."""

        return run_sync(self._get_bookcase(user_id, bookcase_option, page))

    def search(
        self,
        query: str,
        gender: UserGender | None = None,
        state: BrazilianState | None = None,
        page: int = 1,
        limit: int = 100,
    ) -> Pagination[UserSearch]:
        """Synchronous wrapper around :meth:`_search`."""

        return run_sync(self._search(query, gender, state, page, limit))

__init__(client, auth_service)

Initialize the service with dependencies.

Source code in pyskoob/users.py
369
370
371
372
def __init__(self, client: SyncHTTPClient, auth_service: AuthService):
    """Initialize the service with dependencies."""

    super().__init__(client, auth_service)

get_bookcase(user_id, bookcase_option, page=1)

Synchronous wrapper around :meth:_get_bookcase.

Source code in pyskoob/users.py
394
395
396
397
def get_bookcase(self, user_id: int, bookcase_option: BookcaseOption, page: int = 1) -> Pagination[UserBook]:
    """Synchronous wrapper around :meth:`_get_bookcase`."""

    return run_sync(self._get_bookcase(user_id, bookcase_option, page))

get_by_id(user_id)

Synchronous wrapper around :meth:_get_by_id.

Source code in pyskoob/users.py
374
375
376
377
def get_by_id(self, user_id: int) -> User:
    """Synchronous wrapper around :meth:`_get_by_id`."""

    return run_sync(self._get_by_id(user_id))

get_read_stats(user_id)

Synchronous wrapper around :meth:_get_read_stats.

Source code in pyskoob/users.py
389
390
391
392
def get_read_stats(self, user_id: int) -> UserReadStats:
    """Synchronous wrapper around :meth:`_get_read_stats`."""

    return run_sync(self._get_read_stats(user_id))

get_relations(user_id, relation, page=1)

Synchronous wrapper around :meth:_get_relations.

Source code in pyskoob/users.py
379
380
381
382
def get_relations(self, user_id: int, relation: UsersRelation, page: int = 1) -> Pagination[int]:
    """Synchronous wrapper around :meth:`_get_relations`."""

    return run_sync(self._get_relations(user_id, relation, page))

get_reviews(user_id, page=1)

Synchronous wrapper around :meth:_get_reviews.

Source code in pyskoob/users.py
384
385
386
387
def get_reviews(self, user_id: int, page: int = 1) -> Pagination[BookReview]:
    """Synchronous wrapper around :meth:`_get_reviews`."""

    return run_sync(self._get_reviews(user_id, page))

search(query, gender=None, state=None, page=1, limit=100)

Synchronous wrapper around :meth:_search.

Source code in pyskoob/users.py
399
400
401
402
403
404
405
406
407
408
409
def search(
    self,
    query: str,
    gender: UserGender | None = None,
    state: BrazilianState | None = None,
    page: int = 1,
    limit: int = 100,
) -> Pagination[UserSearch]:
    """Synchronous wrapper around :meth:`_search`."""

    return run_sync(self._search(query, gender, state, page, limit))