Package: shikithon
[!CAUTION]Состояние библиотеки:прекращена поддержка библиотекиВ связи с моим полным переходом на веб-разработку и TypeScript вместо Python, поддерживать эту библиотеку больше нет возможности. Если что-то необходимо исправить -> Just make a forkShikithonОчередной враппер для Shikimori API, написанный на Python[!TIP]
Начиная с версии 2.0.0, библиотека поддерживает асинхронные запросы, отдельные пути к ресурсам API и многое другое(Инструкция по миграции с версии 1.x.x)ОписаниеДанный враппер предоставляет абстракцию, которая позволяет удобнее работать с методами API и их ответамиДля каждого эндпоинта API существует свой объект с методами, и все данные, возвращаемые API Shikimori, валидируются и парсятся в модели, со всеми необходимыми полями,
а также дополнительными, которые могут вернуть некоторые методы API(Например /users/whoami и /users/:id/info возвращают разные поля).
Это позволяет не задумываться об обработке очередного ответа от сервера и сосредоточиться над реализацией своей идеиТакже благодаря множеству проверок при взаимодействии с запросами, библиотека старается добиться максимально
безопасной работы с API: все ошибки API, переданных параметров, данных и т.д. обратываются, логируются и
пользователю возвращаются значения по умолчанию[!NOTE]
Данная библиотека начинает свою поддержку с Python 3.8.10.Установкаpipinstallshikithon# или используя PoetrypoetryaddshikithonПример использованияimportasynciofromtypingimportDictfromjsonimportloadsfromshikithonimportShikimoriAPI,JSONStore# При необходимости, можно также# экспортировать енамы для использования в методахfromshikithon.enumsimportAnimeOrder,MangaKind,...# Можно установить данные конфигурации в кодеconfig={"app_name":"...","client_id":"...","client_secret":"...","auth_code":"...",# Необязательно"access_token":"...","refresh_token":"..."}# Или же прочитать его из внешнего файлаwithopen("config.json","r",encoding="utf-8")asconfig_file:config_2:Dict[str,str]=loads(config_file.read())# Инициализируем API объект с необходимыми опциями# В данном примере используется JSONStore и отключено логированиеapi=ShikimoriAPI(app_name=config['app_name'],store=JSONStore())asyncdefmain():# Используем объект без авторизацииasyncwithapi:lycoris=awaitapi.animes.get(50709)print(lycoris)# >> id=50709 name='Lycoris Recoil' russian='Ликорис Рикоил' ...# Важно отметить, что внутри нельзя вкладывать async with api.auth(...)# Используем объект с авторизацией# Вариант 1asyncwithapi.auth(client_id=config["client_id"],client_secret=config["client_secret"],auth_code=config["auth_code"],):print(awaitapi.users.current())# >> id=723052, nickname='SecondThundeR', ...# Вариант 2# Создаем новый объект API# (По умолчанию используется NullStore в качестве хранилища)api_2=ShikimoriAPI(app_name="...")# В данном случае app_name в __init__ не будет перезаписан,# а токен будет обновлен при ошибке 401api_auth_maker=api_2.auth(app_name=config['app_name'],client_id=config['client_id'],client_secret=config['client_secret'],access_token=config['access_token'],refresh_token=config['refresh_token'])# Далее созданный объект можно использовать сколько угодно разasyncwithapi_auth_maker:...asyncio.run(main())Выполнение нескольких запросов одновременно с помощью методаmultiple_requests:# В этом примере используется распаковка, но можно также получать весь массив с данными ответов# в одной переменнной (chainsaw, lycoris_anime, ... -> data = await ...)fromshikithonimportShikimoriAPI,JSONStoreconfig=...api=ShikimoriAPI(app_name=config['app_name'],store=JSONStore(),logging=False)asyncdefmain():asyncwithapi:chainsaw,lycoris_chisato,lycoris_ranobe=awaitapi.multiple_requests([api.animes.get_all(search="Бензопила"),api.characters.search("Тисато Нисикиги"),api.ranobes.get_all(search="Ликорис"),])print(chainsaw)print(lycoris_chisato[:1])print(lycoris_ranobe)# [AnimeInfo(id=44511, name='Chainsaw Man', russian='Человек-бензопила', ...]# [CharacterInfo(id=204621, name='Chisato Nishikigi', russian='Тисато Нисикиги', ...]# [RanobeInfo(id=151431, name='Lycoris Recoil: Ordinary Days', russian='Ликорис Рикоил: Повседневность', ...]Также, если хочется узнать как использовать встроенные хранилища конфигов или хочется создать свой,
посмотритеэтот гайдПара уточнений по использованиюВозможно вам придется импортировать модели для ручной аннотации возвращаемых моделей в PyCharm(в нем немного некорретно работает наследование типа от функции)При отсутствии каких-либо полей в данных конфигурации, библиотека выдает исключениеЕсли вы хотите использовать логгирование библиотеки, передайте флагlogging=Trueв объект API:api = ShikimoriAPI(app_name="...", logging=True)Получение данных для конфигурацииДля начала вам необходимо создать новое OAuth-приложениездесь.
После этого, сохранитеapp_name,client_id,client_secret, а так жеredirect_uri, если вы его менялиПозже,на данной страницевыберите свое приложение, необходимые разрешения
и получите код авторизации и сохраните его.(Если необходимо, то можно также получить токены авторизации, пройдя следующий этап после получения кода авторизации)Список измененийВсе изменения перечислены настранице релизовПомощь проектуХотите внести вклад или оставить репорт о баге? Великолепно!Для таких случаев, стоит почитатьCONTRIBUTING.mdЗависимости проектаДанный проект использует семь библиотек:aiohttpдля асинхронных запросов к API(Лицензия)pydanticдля валидации данных JSON и преобразования в модели(Лицензия)pyrate-limiterдля огранчений количества запросов к API(Лицензия)backoffдля повторения запросов при их ограничении(Лицензия)loguruдля удобного логгирования(Лицензия)validatorsдля проверки строк на наличие ссылки в ней(Лицензия)typing-extensionsдля корректной типизации декораторов(Лицензия)Также, данный проект использует две библиотеки в качестве зависимостей для разработки:pre-commitдля автоматизации форматирования и проверки кода(Лицензия)mypyдля проверки типов(Лицензия)Лицензия проектаДанный проект имеет MIT лицензию.
Ознакомиться с ее содержанием можноздесьПроект использует логотип сайтаShikimoriдля логотипа в этом README.md.
Все права принадлежат правообладателям и используются по принципуfair useБлагодарностиshiki4py- взяты некоторые идеи по рефакторингу и добавлению поддержки асинхронных запросов(Лицензия)