Coder Social home page Coder Social logo

masterweber / kinopoisk-api-unofficial-client Goto Github PK

View Code? Open in Web Editor NEW
23.0 3.0 5.0 56 KB

Python-модуль для взаимодействия с неофициальным API КиноПоиска

License: MIT License

Python 100.00%
python api kinopoisk

kinopoisk-api-unofficial-client's Introduction

Kinopoisk API Unofficial client

Python-модуль для взаимодействия с неофициальным API КиноПоиска

GitHub repo size PyPI - Downloads GitHub Repo stars GitHub watchers GitHub last commit GitHub top language API Uptime

Установка

$ pip install kinopoisk-api-unofficial-client

Получение токена KinopoiskAPI

Для получения токена необходима регистрация на сайте kinopoiskapiunofficial.tech. После регистрации перейдите в настройки своего профиля и сохраните токен.

Регистрация

films

Набор методов для работы с данными о фильмах

Получить данные о фильме по kinopoisk id

Возвращает базовые данные о фильме. Поле last_sync показывает дату последнего обновления данных.

  • Эндпоинт: /api/v2.2/films/{id}
  • Метод: send_film_request(request: FilmRequest) -> FilmResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.film_request import FilmRequest

api_client = KinopoiskApiClient("<your_token>")
request = FilmRequest(507)
response = api_client.films.send_film_request(request)

Получить данные о сезонах для сериала по kinopoisk film id

Возвращает данные о сезонах для сериала.

  • Эндпоинт: /api/v2.2/films/{id}/seasons
  • Метод: send_seasons_request(request: SeasonsRequest) -> SeasonsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.seasons_request import SeasonsRequest

api_client = KinopoiskApiClient("<your_token>")
request = SeasonsRequest(685246)
response = api_client.films.send_seasons_request(request)

Получить данные о фактах и ошибках в фильме по kinopoisk film id

Возвращает список фактов и ошибок в фильме.

  • Эндпоинт: /api/v2.2/films/{id}/facts
  • Метод: send_facts_request(request: FactsRequest) -> FactsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.facts_request import FactsRequest

api_client = KinopoiskApiClient("<your_token>")
request = FactsRequest(685246)
response = api_client.films.send_facts_request(request)

Получить данные о прокате фильма по kinopoisk film id

Возвращает данные о прокате в разных странах.

  • Эндпоинт: /api/v2.2/films/{id}/distributions
  • Метод: send_distributions_request(request: DistributionsRequest) -> DistributionsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.distributions_request import DistributionsRequest

api_client = KinopoiskApiClient("<your_token>")
request = DistributionsRequest(507)
response = api_client.films.send_distributions_request(request)

Получить данные о бюджете и сборах фильма по kinopoisk film id

Возвращает данные о бюджете и сборах.

  • Эндпоинт: /api/v2.2/films/{id}/box_office
  • Метод: send_box_office_request(request: BoxOfficeRequest) -> BoxOfficeResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.box_office_request import BoxOfficeRequest

api_client = KinopoiskApiClient("<your_token>")
request = BoxOfficeRequest(507)
response = api_client.films.send_box_office_request(request)

Получить кадры из фильма по kinopoisk film id

Возвращает кадры из фильма.

  • Эндпоинт: /api/v2.1/films/{id}/frames
  • Метод: send_film_frame_request(request: FilmFrameRequest) -> FilmFrameResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.film_frame_request import FilmFrameRequest

api_client = KinopoiskApiClient("<your_token>")
request = FilmFrameRequest(507)
response = api_client.films.send_film_frame_request(request)

Получить изображения(кадры, постеры, фан-арты, обои и т.д.) связанные с фильмом по kinopoisk film id

Данный эндпоинт возвращает изображения связанные с фильмом с пагинацией. Каждая страница содержит не более чем 20 фильмов. Доступные изображения:

ImageType

  • STILL - кадры
  • SHOOTING - изображения со съемок
  • POSTER - постеры
  • FAN_ART - фан-арты
  • PROMO - промо
  • CONCEPT - концепт-арты
  • WALLPAPER - обои
  • COVER - обложки
  • SCREENSHOT - скриншоты
  • Эндпоинт: /api/v2.2/films/{id}/images
  • Метод: send_image_request(self, request: ImageRequest) -> ImageResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.image_request import ImageRequest

api_client = KinopoiskApiClient("<your_token>")
request = ImageRequest(507)
response = api_client.films.send_image_request(request)

Получить трейлеры, тизеры, видео для фильма по kinopoisk film id

Возвращает трейлеры, тизеры, видео для фильма по kinopoisk film id.

  • Эндпоинт: /api/v2.2/films/{id}/videos
  • Метод: send_film_video_request(request: FilmVideoRequest) -> FilmVideoResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.film_video_request import FilmVideoRequest

api_client = KinopoiskApiClient("<your_token>")
request = FilmVideoRequest(507)
response = api_client.films.send_film_video_request(request)

Получить сиквелы и приквелы для фильма по kinopoisk film id

Возвращает информацию о сиквелах и приквелах для фильма по kinopoisk film id.

  • Эндпоинт: /api/v2.1/films/{id}/sequels_and_prequels
  • Метод: send_film_sequels_and_prequels_request(request: FilmSequelsAndPrequelsRequest) -> FilmSequelsAndPrequelsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.film_sequels_and_prequels_request import FilmSequelsAndPrequelsRequest

api_client = KinopoiskApiClient("<your_token>")
request = FilmSequelsAndPrequelsRequest(507)
response = api_client.films.send_film_sequels_and_prequels_request(request)

Получить список фильмов по ключевым словам

  • Эндпоинт: /api/v2.1/films/search-by-keyword
  • Метод: send_search_by_keyword_request(request: SearchByKeywordRequest) -> SearchByKeywordResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.search_by_keyword_request import SearchByKeywordRequest

api_client = KinopoiskApiClient("<your_token>")
request = SearchByKeywordRequest("Рик и Морти")
response = api_client.films.send_search_by_keyword_request(request)

Получить id стран и жанров для использования в FilmSearchByFiltersRequest

Возвращает список id стран и жанров, которые могут быть использованы в поиске по фильтру.

  • Эндпоинт: /api/v2.1/films/filters
  • Метод: send_filters_request(request: FiltersRequest) -> FiltersResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.filters_request import FiltersRequest

api_client = KinopoiskApiClient("<your_token>")
request = FiltersRequest()
response = api_client.films.send_filters_request(request)

Получить список фильмов по различным фильтрам

Возвращает список фильмов с пагинацией. Каждая страница содержит не более чем 20 фильмов. Используй FiltersRequest чтобы получить id стран и жанров.

  • Эндпоинт: /api/v2.1/films/search-by-filters
  • Метод: send_film_search_by_filters_request(request: FilmSearchByFiltersRequest) -> FilmSearchByFiltersResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.model.filter_country import FilterCountry
from kinopoisk_unofficial.model.filter_order import FilterOrder
from kinopoisk_unofficial.request.films.film_search_by_filters_request import FilmSearchByFiltersRequest

api_client = KinopoiskApiClient("<your_token>")

request = FilmSearchByFiltersRequest()
request.year_from = 2021
request.rating_from = 5
request.order = FilterOrder.RATING
request.add_country(FilterCountry(1, 'США'))

response = api_client.films.send_film_search_by_filters_request(request)

Получить список фильмов из различных топов или коллекций

Возвращает список фильмов с пагинацией. Каждая страница содержит не более чем 20 фильмов. Например: https://www.kinopoisk.ru/top/lists/58/.

  • Эндпоинт: /api/v2.2/films/top
  • Метод: send_film_top_request(request: FilmTopRequest) -> FilmTopResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.film_top_request import FilmTopRequest
from kinopoisk_unofficial.model.dictonary.top_type import TopType

api_client = KinopoiskApiClient("<your_token>")
request = FilmTopRequest(TopType.TOP_250_BEST_FILMS)
response = api_client.films.send_film_top_request(request)

Получить список похожих фильмов по kinopoisk film id

Возвращает список похожих фильмов по kinopoisk film id

  • Эндпоинт: /api/v2.2/films/{id}/similars
  • Метод: send_related_film_request(request: RelatedFilmRequest) -> RelatedFilmResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.related_film_request import RelatedFilmRequest

api_client = KinopoiskApiClient("<your_token>")
request = RelatedFilmRequest(507)
response = api_client.films.send_related_film_request(request)

Получить список цифровых релизов

Возвращает список цифровых релизов. Например: https://www.kinopoisk.ru/comingsoon/digital/

  • Эндпоинт: /api/v2.1/films/releases
  • Метод: send_digital_release_request(request: DigitalReleaseRequest) -> DigitalReleaseResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.digital_release_request import DigitalReleaseRequest
from kinopoisk_unofficial.model.dictonary.month import Month

api_client = KinopoiskApiClient("<your_token>")
request = DigitalReleaseRequest(2021, Month.SEPTEMBER)
response = api_client.films.send_digital_release_request(request)

Получить график кинопремьер

Возвращает список кинопремьер. Например: https://www.kinopoisk.ru/premiere/

  • Эндпоинт: /api/v2.2/films/premieres
  • Метод: send_premiere_request(request: PremiereRequest) -> PremiereResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.model.dictonary.month import Month
from kinopoisk_unofficial.request.films.premiere_request import PremiereRequest

api_client = KinopoiskApiClient('<your_token>')

request = PremiereRequest(2021, Month.DECEMBER)
response = api_client.films.send_premiere_request(request)

reviews

Набор методов для работы с ревью о фильмах

Получить рецензии зрителей

Возвращает список рецензий с пагинацией. Каждая страница содержит не более чем 20 рецензий. Поле description содержит не полный текст рецензии. Полный текст может быть получен из ReviewDetailsRequest

  • Эндпоинт: /api/v1/reviews
  • Метод: send_reviews_request(request: ReviewsRequest) -> ReviewsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.reviews.reviews_request import ReviewsRequest

api_client = KinopoiskApiClient("<your_token>")
request = ReviewsRequest(507)
response = api_client.reviews.send_reviews_request(request)

Получить полную рецензию по kinopoisk review id

Возвращает полную информацию о рецензии.

  • Эндпоинт: /api/v1/reviews/details
  • Метод: send_review_details_request(request: ReviewDetailsRequest) -> ReviewDetailsResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.reviews.review_details_request import ReviewDetailsRequest

api_client = KinopoiskApiClient("<your_token>")
request = ReviewDetailsRequest(3000574)
response = api_client.reviews.send_review_details_request(request)

staff

Набор методов для работы с данными об актерах, режиссерах и т.д.

Получить данные об актерах, режиссерах и т.д. по kinopoisk film id

Возвращает данные об актерах, режиссерах и т.д. по kinopoisk film id

  • Эндпоинт: /api/v1/staff
  • Метод: send_staff_request(request: StaffRequest) -> StaffResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.staff.staff_request import StaffRequest

api_client = KinopoiskApiClient("<your_token>")
request = StaffRequest(507)
response = api_client.staff.send_staff_request(request)

Получить данные о конкретном человеке по kinopoisk person id

Возвращает данные о конкретном человеке по kinopoisk person id

  • Эндпоинт: /api/v1/staff/{id}
  • Метод: send_person_request(request: PersonRequest) -> PersonResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.staff.person_request import PersonRequest

api_client = KinopoiskApiClient("<your_token>")
request = PersonRequest(27977)
response = api_client.staff.send_person_request(request)

persons

Получить данные об актерах, режиссерах и т.д. по имени

Возвращает данные об актерах, режиссерах и т.д. по имени

Одна страница может содержать до 50 элементов в items

  • Эндпоинт: /api/v1/persons
  • Метод: send_person_by_name_request(request: PersonByNameRequest) -> PersonByNameResponse
from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.persons.person_by_name_request import PersonByNameRequest

api_client = KinopoiskApiClient("<your_token>")
request = PersonByNameRequest("Джеймс Кэмерон")
response = api_client.persons.send_person_by_name_request(request)

kinopoisk-api-unofficial-client's People

Contributors

fr00kt avatar masterweber avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

kinopoisk-api-unofficial-client's Issues

Добавьте ,пожалуйста, coverUrl в класс фильм и оберните все поля в "optional"

Я обернул все строки так, чтобы возможно было получать фильм без некоторых полей.

@dataclass
class Film:
    kinopoisk_id: Optional[int] = None
    imdb_id: Optional[str] = None
    name_ru: Optional[str] = None
    name_en: Optional[Union[str, None]] = None
    name_original: Optional[str] = None
    poster_url: Optional[str] = None
    poster_url_preview: Optional[str] = None
    reviews_count: Optional[int] = None
    rating_good_review: Optional[float] = None
    rating_good_review_vote_count: Optional[int] = None
    rating_kinopoisk: Optional[float] = None
    rating_kinopoisk_vote_count: Optional[int] = None
    rating_imdb: Optional[float] = None
    rating_imdb_vote_count: Optional[int] = None
    rating_film_critics: Optional[float] = None
    rating_film_critics_vote_count: Optional[int] = None
    rating_await:  Optional[Union[float, None]] = None
    rating_await_count: Optional[int] = None
    rating_rf_critics:  Optional[Union[float, None]] = None
    rating_rf_critics_vote_count: Optional[int] = None
    year: Optional[int] = None
    film_length: Optional[int] = None
    is_tickets_available: Optional[bool] = None
    production_status:  Optional[Union[ProductionStatus, None]] = None
    type: Optional[FilmType] = None
    has_imax: Optional[bool] = None
    has_3_d: Optional[bool] = None
    countries: Optional[List[Country]] = None
    genres:  Optional[List[Genre]] = None
    start_year:  Optional[Union[int, None]] = None
    end_year:  Optional[Union[int, None]] = None
    web_url: Optional[str] = None
    slogan: Optional[str] = None
    description: Optional[str] = None
    short_description: Optional[str] = None
    editor_annotation: Optional[str] = None
    rating_mpaa: Optional[str] = None
    rating_age_limits: Optional[str] = None
    last_sync: Optional[str] = None
    serial: Optional[bool] = None
    short_film: Optional[bool] = None
    completed: Optional[bool] = None
    coverUrl: Optional[str] = None

A request.

Hi! I didn't manage to find your contacts anywhere, so I only can write there. I can delete this issue later.
I am a sociology student, writing a graduate diploma thesis about cinema. I own statistical packages and plan to collect data from the sites kinopoisk, IMDb, rotten tomatoes, make descriptive statistics on them, twist a little data on python, build networks and conduct network analysis in R and Pajek. Parsing a kinopoisk is very difficult, but you know it yourself. Could you provide a csv copy of the database of films and actors of kinopoisk? I will be immensely grateful to you.... Maybe you have a sparse database of users and their reviews, ratings?
thank you in advance.

All the best,
Stepan.

[email protected]

Нерабочие примеры?

Я использовал следующий код (из README):

from kinopoisk_unofficial.kinopoisk_api_client import KinopoiskApiClient
from kinopoisk_unofficial.request.films.search_by_keyword_request import SearchByKeywordRequest

api_client = KinopoiskApiClient("token")
request = SearchByKeywordRequest("Kek")
response = api_client.films.send_search_by_keyword_request(request)

(Вместо "token" стоит токен)

Но я получил ошибку:

Traceback (most recent call last):
  File "/home/igors/Рабочий стол/archive/Main.py", line 6, in <module>
    response = api_client.films.send_search_by_keyword_request(request)
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/kinopoisk_unofficial/client/films_api_client.py", line 38, in send_search_by_keyword_request
    return self._send_request(request)
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/kinopoisk_unofficial/client/api_client.py", line 47, in _send_request
    return self.__deserialize_response(
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/kinopoisk_unofficial/client/api_client.py", line 57, in __deserialize_response
    return self.__serializer.deserialize(response_class, response_body)
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/apischema/utils.py", line 546, in wrapper
    return wrapped(*args, **kwargs)
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/apischema/deserialization/__init__.py", line 869, in deserialize
    return deserialization_method(
  File "/home/igors/Рабочий стол/archive/.venv/lib/python3.10/site-packages/apischema/deserialization/__init__.py", line 528, in method
    raise ValidationError(errors, field_errors)
apischema.validation.errors.ValidationError: ValidationError(messages=[], children={'keyword': ValidationError(messages=['missing property'], children={}), 'pagesCount': ValidationError(messages=['missing property'], children={}), 'searchFilmsCountResult': ValidationError(messages=['missing property'], children={})})

Как исправить?

Ошибка идентификационных номеров в запросе FiltersRequest

Здравствуйте!
Пользовался библиотекой kinopoisk_unofficial (python) и столкнулся с такой проблемой: при отправке запроса FiltersRequest, получаю соответствующий ответ, но при попытке отправить запрос FilmSearchByFiltersRequest c несколькими фильтрами из FiltersRequest, получаю неправильный ответ. Например, при request.countries = [FilterCountry(9, "Япония")] видно, что вместо Японии была найдена Германия. Можно сделать вывод, что запрос FiltersRequest возвращает неправильный ответ (id неправильные).
Прошу пояснить поведение FiltersRequest.
Пример кода прикреплен в файле test.py.

from kinopoisk_unofficial.request.films.filters_request import FiltersRequest
from kinopoisk_unofficial.request.films.film_search_by_filters_request import FilmSearchByFiltersRequest
from pprint import pprint

from api_client.api_client import api_client

req = FiltersRequest()
res = api_client.films.send_filters_request(req)
req = FilmSearchByFiltersRequest()
request = FilmSearchByFiltersRequest()
for item in res.countries:
    if item.country == "Япония":
        request.countries = [item]
        response = api_client.films.send_film_search_by_filters_request(request)
        print(item)
        pprint(response)
        break

Т.е., вместо фильтра Япония был применён фильтр Германия

Также обнаружил аналогичное неправильное поведение с фильтрами жанров

bad requests

    request = FilmSearchByFiltersRequest()
    request.year_from = 1000
    request.rating_from = 0
    request.order = FilterOrder.RATING
    data = await state.get_data()
    ids = data.get("id")
    zanrsss = data.get("zanr")
    request.add_genre(FilterGenre(ids,zanrsss))
    request.add_country(FilterCountry(ids, coun)) 
    response = api_client.films.send_film_search_by_filters_request(request)

При попытке выполнить поиск фильма с фильтрами выдает bad requests. Случается это только во второй раз (т.е первый раз бот ищет фильм, на второй выдает ошибку, после перезапуска опять в первый раз работает, а во второй уже нет)

Ошибка, когда встречаются пустые поля в карточке фильма

Добрый день!
В энтпоинте /api/v2.2/films/{id} когда когда в карточке фильма встречаются пустые поля, метод send_film_request вылетает.
Например:

  1. 1103803: imdbId = null, ошибка
    apischema.validation.errors.ValidationError: ValidationError(messages=[], children={'imdbId': ValidationError(messages=['expected type string, found null'], children={})})

  2. 41519: nameOriginal = null, ошибка
    apischema.validation.errors.ValidationError: ValidationError(messages=[], children={'nameOriginal': ValidationError(messages= ['expected type string, found null'], children={})})

Ломается client при добавлении нового поля в api

Добрый день. Похоже на то, что когда добавляется новое поле в респонсе от api, ваша либа начинает выдавать ошибки.
Сейчас добавлено новое поле logoUrl, аналогично #5
Если это так, немогли бы вы сделать так чтобы, когда появлялись новые поля в api они просто игнорились и ничего не ломалось?

Не работает метод send_search_by_keyword_request

Эндпоинт: /api/v2.1/films/search-by-keyword
Метод: send_search_by_keyword_request(request: SearchByKeywordRequest) -> SearchByKeywordResponse

Ошибки ValidationError. Пример с главной страницы не работает.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.