1

Тема: Что можно получить из кода по кинопоиску?

Имеем код по каталогу кинопоиска - например

1232908

или

1332676

или 252089
Какую информацию можно получить?

1) Для сериала полная информация есть на странице

https://www.kinopoisk.ru/series/252089/

или для фильма

https://www.kinopoisk.ru/film/326/

, там json, который легко разбирается и все, что надо есть, но боюсь, если часто туда ломиться за информацией можно капчу словить.

2) И как отличить сериал это или фильм по коду?

3) Как получить трейлер? Они есть на кинопоиске, но номера не совпадают. Например для сериала с кодом 252089, трейлер имеет
код 164608

https://widgets.kinopoisk.ru/discovery/trailer/164608?onlyPlayer=1&autoplay=1&cover=1

с прямой ссылкой

https://strm.yandex.ru/vh-kp-converted/ott-content/579603247-432b3f2f8f28037ba70d132622d0afd5/master.m3u8


В файле

https://www.kinopoisk.ru/series/252089/

мы его видим без проблем, если бы не капча.

4) Постер фильма - проблем нет, получаем по id

 http://st.kp.yandex.net/images/film_iphone/iphone360_252089.jpg

, где 252089 это и есть id по kp

Возможно можно получить нужную информацию не напрямую с кинопоиска?
Буду благодарен за любые советы в этом направлении.

2 (2020.07.29 10:29:43 отредактировано Defrl)

Re: Что можно получить из кода по кинопоиску?

полный json только у фильма. у сериала там не вся инфа указана. если сравнивать с содержимым страницы

парсеры блокируются. заголовки, куки, пауза между запросами не помогают, если парсить хотя бы сотни фильмов в день

по айдишнику фильм от сериала не отличить. но если в ссылке указать /film/{id} вместо /series/{id}, то у сериала будет редирект на страницу /series/.
можно проверять только заголовок с редиректом, чтобы определить сериал

трейлер, скорее всего не привязан к фильму. остается только парсить со страницы фильма

у постеров сейчас новая ссылка на картинку. старая делает просто редирект. не факт, что она будет работать постоянно

видел несколько апи серивисов для кинопоиска - но там не вся информация, обновляются редко, некоторые уже закрылись

поэтому, если нужно получить данные с кинопоиска, лучше всего парсить самому через selenium и реальный браузер

Спасибо сказали: smsbox31

3

Re: Что можно получить из кода по кинопоиску?

Неофициальное апи для доступа к актуальной информации кинопоиска.

https://kinopoiskapiunofficial.tech/
Спасибо сказали: smsbox3, d1mas2

4 (2020.07.29 21:35:09 отредактировано smsbox3)

Re: Что можно получить из кода по кинопоиску?

pwsik пишет:

Неофициальное апи для доступа

Все хорошо, но есть ограничение  на запросы.

5 (2020.07.30 09:30:52 отредактировано bond)

Re: Что можно получить из кода по кинопоиску?

У меня как то так

Прикреплённые файлы сообщения

C3D0fGFPe7.png 12.71 kb, скачивалось 22 раза, начиная с 2020.07.30

6 (2020.07.30 10:52:46 отредактировано smsbox3)

Re: Что можно получить из кода по кинопоиску?

bond пишет:

У меня как то так

А можете попробовать сделать 15 запросов в секунду? Просто реальная нагрузка, когда не для себя делаешь, может в пиках быть и такой. У меня хостинг ограничение в 50 одновременных подключений делает, значит сервер легко может выдать 15 запросов в секунду от пользователей.
И еще, если вызвать https://kinopoiskapiunofficial.tech/doc … enapi.json то, там видим сообщения типа

 "429" : {
            "description" : "Too Many Requests. Limit 10 req/sec"
          }
"429" : {
            "description" : "Too Many Requests. Limit 0.5 req/sec"
          }

Разные, для разных разделов.

Re: Что можно получить из кода по кинопоиску?

На счет снятия ограничений пишите на почту support@kinopoiskapiunofficial.tech, думаю это решаемо

Спасибо сказали: smsbox31

8 (2020.08.05 09:00:25 отредактировано smsbox3)

Re: Что можно получить из кода по кинопоиску?

kinopoiskapiunofficial пишет:

На счет снятия ограничений

Спасибо за вашу работу, принял на заметку.

Для информации рейтиги можно с самого кинопоиска брать Например так 

https://rating.kinopoisk.ru/678552.xml 

В результате получаем

<rating>
<kp_rating num_vote="99200">6.556</kp_rating>
<imdb_rating num_vote="375080">6.8</imdb_rating>
</rating>

Функция на php для получения рейтинга

// описание функции
function get_rating( $id = null ) {
 $rating = [];
 if ( ! empty( $id ) ) {
 $xml   = simplexml_load_file( 'https://rating.kinopoisk.ru/' . $id . '.xml' );
 $names = ['kp_rating', 'imdb_rating'];
 foreach ( $names as $name ) {
 $new_name            = str_replace( '_rating', '', $name );
 $rating[ $new_name ] = dom_import_simplexml( $xml->$name )->nodeValue;
 }
 }
 
 return $rating;
}
 
// вызов функции
$rating = get_rating(347);
 
// выводим рейтинг КиноПоиск
echo $rating['kp'];
Спасибо сказали: joy.jordison1

9 (2020.08.31 18:32:37 отредактировано joy.jordison)

Re: Что можно получить из кода по кинопоиску?

<?php

Class Kinopoisk
{
  private $KP_APIURL = 'https://ext.kinopoisk.ru/ios/5.0.0/';
  private $KP_SECRET = 'IDATevHDS7';

  private $methods = array(
    'getBestFilms' => 'getBestFilmsList',
    /* Информация фильмов */
    'getGallery' => 'getGallery',
    'getWall' => 'getWall',
    'getStaff' => 'getStaffList',
    'getFilm' => 'getKPFilmDetailView',
    'getSimilar' => 'getKPFilmsList',
    /* Жанры */
    'getGenres' => 'getKPGenresView',
    'getTopGenre' => 'getKPTopGenre',
    /* Отзывы */
    'getReviews' => 'getKPReviews',
    'getReviewDetail' => 'getKPReviewDetail',
    /* Новости */
    'getNews' => 'getKPNewsView',
    'getNewsDetail' => 'getKPNewsDetail',
    /* Скоро в прокате */
    'getSoonFilms' => 'getKPSoonFilms',
    'getSoonDVD' => 'getKPSoonDVD',
    'getDatesForSoonFilms' => 'getDatesForSoonFilms',
    'getDatesForSoonDVD' => 'getDatesForSoonDVD',
    /* Кинотеатры */
    'getTodayFilms' => 'getKPTodayFilms',
    'getCinemas' => 'getKPCinemas',
    'getCinemaDetail' => 'getKPCinemaDetailView',
    'getSeance' => 'getSeance',
    'getDatesForDetailCinema' => 'getDatesForDetailCinema',
    'getDatesForSeance' => 'getDatesForSeance',
    /* ТОП */
    'getTop' => 'getKPTop',
    /* Персоны */
    'getPeople' => 'getKPPeopleDetailView',
    'getPeopleView' => 'getKPPeopleView',
    /* Поиск */
    'searchGlobal' => 'getKPGlobalSearch',
    'searchFilms' => 'getKPSearchInFilms',
    'searchPeople' => 'getKPSearchInPeople',
    'searchCinemas' => 'getKPSearchInCinemas',
    'searchNavigator' => 'navigator',
    'navigatorFilters' => 'navigatorFilters',
    /* Гео */
    'getCountryList' => 'getKPCountryView',
    'getCityList' => 'getKPAllCitiesView',
    'getPopularIndex' => 'getPopularIndex',
    /* Проверить */
    'getSpot' => 'getSpotlightView',
    'getKPLiveSearch' => 'getKPLiveSearch',
    'getBornIn' => 'getBornIn',
    'getRated' => 'getRatedFilms',
    'getAwards' => 'getKPAwards',
    'getSeries' => 'getKPSeriesList',
  );

  public function __construct(){

    $this->customFunctions = array(
      'getPopularIndex'
    );

    $this->customOptions = array(
      'getFilm' => function($options){
        if(!isset($options['keyword'])){
          $options['still_limit'] = '5';
        }
        if(!isset($options['keyword'])){
          $options['cityID'] = '1';
        }
        return $options;
      },
      'getPeople' => function($options){
        if(!isset($options['keyword'])){
          $options['still_limit'] = '10';
        }
        if(!isset($options['keyword'])){
          $options['cityID'] = '1';
        }
        return $options;
      },
      'getSimilar' => function($options){
        if(isset($options['type'])) return $options;
        return array('type' => 'kp_similar_films');
      },
      'searchGlobal' => function($options){
        if(isset($options['keyword'])){
          $options['keyword'] = str_replace('+', ' плюс ', $options['keyword']);
          $options['keyword'] = str_replace(' ', '.', $options['keyword']);
        }
        return $options;
      },
      'searchFilms' => function($options){
        if(isset($options['keyword'])){
          $options['keyword'] = str_replace('+', ' плюс ', $options['keyword']);
          $options['keyword'] = str_replace(' ', '.', $options['keyword']);
        }
        return $options;
      },
      'searchPeople' => function($options){
        if(isset($options['keyword'])){
          $options['keyword'] = str_replace('+', ' плюс ', $options['keyword']);
          $options['keyword'] = str_replace(' ', '.', $options['keyword']);
        }
        return $options;
      },
      'searchCinemas' => function($options){
        if(isset($options['keyword'])){
          $options['keyword'] = str_replace('+', ' плюс ', $options['keyword']);
          $options['keyword'] = str_replace(' ', '.', $options['keyword']);
        }
        return $options;
      },
      'searchNavigator' => function($options){
        if(!isset($options['genre_or'])){
          $options['genre_or'] = '0';
        }
        if(!isset($options['country_or'])){
          $options['country_or'] = '0';
        }
        if(!isset($options['page'])){
          $options['page'] = '1';
        }
        if(!isset($options['order'])){
          $options['order'] = 'rating';
        }

        return $options;
      },
    );
  }

  public function getPopularIndex($options){
    $top = array();
    for($i = 1; $i <= 5; $i++){
      $pageTop = $this->callMethod('getKPTop', [
        'type' => 'kp_item_top_popular_films',
        'page' => $i
        ]);
      $pageTop = json_decode($pageTop)->data->items;

      $top = array_merge($top, $pageTop['data']['items']);
    }

    $place = false;
    $foundFilm = false;

    foreach($top as $i => $film){
      if($options['filmID'] == $film['id']){
        $place = $i + 1;
        $foundFilm = $film;
      }
    }

    if($place){
      $foundFilm['place'] = $place;
      return $foundFilm;
    }
    return 'null';
  }

  public function call($method, $options = array())
  {
    if(empty($this->methods[$method])) return false;

    if(!empty($this->customOptions[$method])){
      $options = array_merge($options, $this->customOptions[$method]($options));
    }

    foreach($this->methods as $method_name => $method_original) {
      if ($method == $method_name) $method = $method_original;
    }

    if (in_array($method, $this->customFunctions)) {
      $result = $this->{$method}($options);
    }
    else {
      $result = json_decode($this->callMethod($method, $options))->data;
    }

    if ($result == '[key:false]') {
      return false;
    }

    return $result;
  }

  public function callMethod($method, $options)
  {

    $action = $method;
    $query = http_build_query($options);
    $timestamp = time() * 1000;
    if (!empty($query)) {
       $action.= '?' . $query;
    }
    $signature = md5($action . $timestamp . $this->KP_SECRET);
    $url = $this->KP_APIURL . $action;

    $randomIP = rand(0,255).'.'.rand(0,255).'.'.rand(0,255).'.'.rand(0,255);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 6);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'REMOTE_ADDR: ' . $randomIP,
      'HTTP_X_FORWARDED_FOR: ' . $randomIP,
      'device: android',
      'Accept: application/json',
      'Android-Api-Version: 22',
      'countryID: 2',
      'ClientId: 55decdcf6d4cd1bcaa1b3856',
      'clientDate: ' . date('H:i m.d.Y'),
      'cityID: 1',
      'Image-Scale: 3',
      'Cache-Control: max-stale=0',
      'User-Agent: Android client (4.4 / api22),ru.kinopoisk/4.2.1 (52)',
      'X-TIMESTAMP: ' . $timestamp,
      'X-SIGNATURE: ' . $signature
    ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $out = curl_exec($ch);
    curl_close($ch);
    return $out;
  }
}
$id = 666;
$kp = new Kinopoisk;
print_r($kp->call('getReviews', [
    'filmID' => $id
  ]));

print_r($kp->call('getStaff', [
    'filmID' => $id
  ]));

print_r($kp->call('getFilm', [
              'filmID' => $id
            ]));

print_r($kp->call('getGallery', [
              'filmID' => $id
            ]));

print_r($kp->call('getSimilar', [ 
    'filmID' => $id,
    'type'    => 'kp_related_films'//    kp_sequels_and_prequels_films, kp_related_films, kp_similar_films
  ]));

print_r($kp->call('getPeople', [
    'peopleID' => 51921
  ]));

print_r($kp->call('getSeries', [
    'serialID' => 243595,
    'season' => 1
  ]));

так повеселее будет  :)

Спасибо сказали: smsbox3, na-socke.tk, bond3

10

Re: Что можно получить из кода по кинопоиску?

А кто-то разобрался как можно получить список обложек к примеру? Заранее спасибо.

11

Re: Что можно получить из кода по кинопоиску?

na-socke.tk пишет:

А кто-то разобрался как можно получить список обложек к примеру? Заранее спасибо.

в моем коде можно получить кадры и постеры, но в масиве с постерами могут находиться обложки. то есть так отдает кп, но этот код еще не доработан и возможно как руки дойдут перепешу полностью.