Asynchronous client for api Shikimori written in Python 3.7 with asyncio and aiohttp.


Keywords
api-client, aiohttp, asyncio, shikimori, anime, python
License
MIT
Install
pip install shiki4py==2.2.0

Documentation

Shiki4py

PyPi Package Version Supported python versions

Асинхронный ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для взаимодСйствия с api Shikimori, написанный Π½Π° Python 3.7 c использованиСм asyncio ΠΈ aiohttp.

ВСрсии shiki4py v0.2.2 ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ синхронными, Π½ΠΎ начиная с v2.0.0 этот ΠΏΠ°ΠΊΠ΅Ρ‚ стал асинхронным. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ shiki4py >= v2.0.0!

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ shiki4py v0.2.2 ΠΈ v2.0.0 ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ 25 запросов:

Image shiki4py sync vs async

shiki4py v0.2.2 ~10.5 сСкунд

Код ```python from shiki4py import Client

client = Client("APP_NAME", "CLIENT_ID", "CLIENT_SECRET") for i in range(25): client.get(f"/users/{i}/info")

</details>

shiki4py v2.0.0 ~5.07 сСкунд
<details>
<summary>Код</summary>
```python
from shiki4py import Shikimori
import asyncio


async def main():
    async with Shikimori("APP_NAME", "CLIENT_ID", "CLIENT_SECRET") as api:
        await asyncio.gather(*[api.request(f"/api/users/{i}/info") for i in range(25)])


asyncio.run(main())

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° api v1 ΠΈ v2
  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ 5rps ΠΈ 90rpm
  • OAuth2 авторизация
  • ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ срока дСйствия Ρ‚ΠΎΠΊΠ΅Π½Π°
  • Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² .env Ρ„Π°ΠΉΠ»Π΅
  • Ѐункция бСзопасного создания ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²

Установка

pip install shiki4py

ИспользованиС

Быстрый старт

from shiki4py import Shikimori
import asyncio
import logging


logging.basicConfig(level=logging.INFO)


async def main():
    # ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π±Π΅Π· Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
    async with Shikimori("APP_NAME") as api:
        clubs = await api.request("/api/clubs", params={
            "search": "Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ² Конан"
        })
        print(clubs)

    # ΠšΠ»ΠΈΠ΅Π½Ρ‚ с Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ
    # ΠœΠ΅Ρ‚ΠΎΠ΄ open() ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±Π΅Π· Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
    api = await Shikimori("APP_NAME", "CLIENT_ID", "CLIENT_SECRET").open()
    # ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ запросы
    # await api.request(...)
    # ...
    await api.close()


asyncio.run(main())

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сохраняСт Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ .env, Π½ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ хранСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ унаслСдовав Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

from shiki4py import Shikimori
from shiki4py.store import BaseTokenStore
from shiki4py.store.memory import MemoryTokenStore


class MyTokenStore(BaseTokenStore):
    ...


api = Shikimori('APP_NAME',
                'CLIENT_ID',
                'CLIENT_SECRET',
                # store=MyTokenStore()
                store=MemoryTokenStore())
await api.open()

Зависимости

  • aiohttp - для асинхронных HTTP запросов
  • PyrateLimiter - для ограничСния частоты запросов
  • python-dotenv - для сохранСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² .env Ρ„Π°ΠΉΠ»