Shiki4py
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ 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 Π·Π°ΠΏΡΠΎΡΠΎΠ²:
shiki4py v0.2.2 ~10.5 ΡΠ΅ΠΊΡΠ½Π΄
ΠΠΎΠ΄
```python from shiki4py import Clientclient = 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
ΡΠ°ΠΉΠ»