Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Скрипт рейтинга фильмов с kinopoisk (https://javascript.ru/forum/dom-window/70109-skript-rejjtinga-filmov-s-kinopoisk.html)

sivith 11.08.2017 07:04

Скрипт рейтинга фильмов с kinopoisk
 
подскажите почему не работает захват рейтинга вот скрипт

(function($) {
  /**
     * Установки по умолчанию
     *
     * @type {Object}
     */
  var settings = {
    movie: false,
    url: "http://rating.kinopoisk.ru",
    range: 10,
    fix: 1,
    order: ["kinopoisk", "imdb"],
    kinopoisk_template:
      "<div>" +
        '<span class="kp_description">Рейтинг <a href="http://kinopoisk.ru" target="new">Кинопоиска</a>:</span>' +
        '<span class="kp_rating" title="Проголосовало $vote">$rating</span>' +
        '<span class="kp_stars">$stars</span></div>',
    imdb_template:
      "<div>" +
        '<span class="kp_description">Рейтинг <a href="http://imdb.com" target="new">IMDB</a>:</span>' +
        '<span class="kp_rating" title="Проголосовало $vote">$rating</span>' +
        '<span class="kp_stars">$stars</span></div>',
    cache_time: 86400000,
    no_data: "Нет данных",
    show_zero_rating: true
  };

  /**
     * Методы плагина
     *
     * @type {Object}
     */
  var methods = {
    /**
         * Инициализация плагина
         *
         * @param options {String[]} Массив с параметрами плагина
         *
         * @return {*}
         */
    init: function(options) {
      return this.each(function() {
        var $this = $(this);
        // Атрибуты data перекрывают settings, а options перекрывает data
        var params = $.extend({}, settings, $this.data(), options);
        // Если вместо идентификатора передали ссылку
        for (var i in params) {
          if (i == "movie") {
            var movie = params[i].toString().split("/");
            if (movie.length > 1) {
              params[i] = movie[4];
            } else {
              params[i] = movie[0];
            }
          }
        }
        $this.data({ params: params }); // Записываем параметры элемента
        $this.kinopoisk("getRating");
      });
    },
    /**
         * Получение рейтинга с сайта kinopoisk.ru
         *
         * @return {*}
         */
    getRating: function() {
      var el = $(this);
      var params = el.data("params");
      if (!params.movie) {
        throw "Не указан идентификатор фильма на кинопоиске (data-movie).";
      }
      // Проверяем кеш
      var movie_xml = methods._getCache(el, params.movie);
      if (movie_xml) {
        return methods._showRating(el, movie_xml);
      } else {
        $.ajax({
          type: "GET",
          url:
            "http://query.yahooapis.com/v1/public/yql?q=" +
              encodeURIComponent(
                'select * from xml where url="' +
                  params.url +
                  "/" +
                  params.movie +
                  '.xml"'
              ) +
              "&format=xml&callback=?",
          dataType: "json",
          success: function(data) {
            movie_xml = methods._setCache(el, params.movie, data.results[0]); // Кешируем данные
            return methods._showRating(el, movie_xml);
          },
          error: function(data) {
            console.log(data);
            $.error(data.responseText);
          }
        });
      }
    },
    /**
         * Получение значения из кеша.
         *
         * @param el    {Object}  jQuery объект текущего элемента
         * @param movie {Integer} Идентификатор фильма
         *
         * @return {*}
         * @private
         */
    _getCache: function(el, movie) {
      var params = el.data("params");
      var timestamp = new Date().getTime();
      var cache = localStorage.getItem("movie_" + movie);
      if (!cache) {
        return false;
      } else {
        var xml_doc = $.parseXML(cache);
        var $xml = $(xml_doc);
        if (timestamp - $xml.find("cache_time").text() > params.cache_time) {
          // Если кеш истёк, чистим его
          localStorage.removeItem("movie_" + movie);
          return false;
        }
      }
      return cache;
    },
    /**
         * Установка кеша
         *
         * @param el    {Object}  Объект jQuery
         * @param movie {Integer} Идентификатор фильма
         * @param data  {String}  XML с ответом сервера kinopoisk
         *
         * @return {String}
         * @private
         */
    _setCache: function(el, movie, data) {
      var params = el.data("params");
      var timestamp = new Date().getTime();
      var cache = localStorage.getItem("movie_" + movie);
      var movie_xml =
        "<result>" +
        data +
        "<cache_time>" +
        timestamp +
        "</cache_time></result>";
      if (!cache) {
        localStorage.setItem("movie_" + movie, movie_xml);
      } else {
        var xml_doc = $.parseXML(cache);
        var $xml = $(xml_doc);
        if (timestamp - $xml.find("cache_time").text() > params.cache_time) {
          // Если разница во времени более суток, то обновляем кеш
          localStorage.setItem("movie_" + movie, movie_xml);
        } else {
          movie_xml = cache;
        }
      }
      return movie_xml;
    },
    /**
         * Показ рейтинга
         *
         * @param el {Object}   jQuery объект
         * @param data {String} XML с ответом сервера kinopoisk
         *
         * @private
         */
    _showRating: function(el, data) {
      var params = el.data("params");
      if (!data) {
        throw 'Проверьте правильность url "' + params.url + '"';
      }
      var xml_doc = $.parseXML(data);
      var $xml = $(xml_doc);
      var $kp_rating = $xml.find("kp_rating");
      var $imdb_rating = $xml.find("imdb_rating");
      // Если был указан левый movie_id
      if ($kp_rating.text() == 0 && $kp_rating.attr("num_vote") == 0) {
        if (!params.no_data) {
          return el;
        } else {
          return el.html(
            '<span class="kp_container">' + params.no_data + "</span>"
          );
        }
      }
      // Округление рейтинга
      $kp_rating.text(methods.__roundRating($kp_rating, params.fix));
      $imdb_rating.text(methods.__roundRating($imdb_rating, params.fix));
      // Получение звёзд
      $kp_rating.stars = methods._getStar($kp_rating.text(), params.range);
      $imdb_rating.stars = methods._getStar($imdb_rating.text(), params.range);
      var kp_tpl = methods._getTemplate(params.kinopoisk_template, $kp_rating);
      var imdb_tpl = methods._getTemplate(params.imdb_template, $imdb_rating);
      if (params.show_zero_rating == false) {
        if ($kp_rating.text() == 0) {
          kp_tpl = "";
        }
        if ($imdb_rating.text() == 0) {
          imdb_tpl = "";
        }
      }
      var ratings = {
        kinopoisk: kp_tpl,
        imdb: imdb_tpl
      };
      var text = "";
      for (var i in params.order)
        if (params.order.hasOwnProperty(i)) {
          if (typeof ratings[params.order[i]] != "undefined") {
            text += ratings[params.order[i]];
          }
        }
      return el
        .hide()
        .html('<span class="kp_container">' + text + "</span>")
        .fadeIn();
    },
    /**
         * Округление рейтинга
         *
         * @param rating {Object} Объект рейтинга
         * @param fix    {int}    Количество знаков после запятой
         * @private
         */
    __roundRating: function(rating, fix) {
      return (
        Math.round(parseFloat(rating.text()) * Math.pow(10, fix)) /
        Math.pow(10, fix)
      );
    },
    /**
         * Шаблон отображения
         *
         * @param template  {String} Шаблон
         * @param $rating   {Object} Объект рейтинга
         *
         * @return {String}
         * @private
         */
    _getTemplate: function(template, $rating) {
      return template
        .replace("$rating", $rating.text())
        .replace("$vote", $rating.attr("num_vote"))
        .replace("$stars", $rating.stars);
    },
    /**
         * Отображение звёзд
         *
         * @param rating {FLoat}   Рейтинг
         * @param range  {Integer} Диапазон звёздности
         *
         * @return {String}
         * @private
         */
    _getStar: function(rating, range) {
      var star = "";
      var round_rating = Math.round(rating * range / 10);
      for (var i = 1; i <= range; i++) {
        if (i <= round_rating) {
          star += "<span>★</span>";
        } else {
          star += "<span>☆</span>";
        }
      }
      return star;
    }
  };

  $.fn.kinopoisk = function(method) {
    try {
      if (methods[method]) {
        if (method.charAt(0) == "_") {
          throw "Нельзя вызывать приватный метод";
        }
        return methods[method].apply(
          this,
          Array.prototype.slice.call(arguments, 1)
        );
      } else if (typeof method === "object" || !method) {
        return methods.init.apply(this, arguments);
      } else {
        throw "Метод " + method + " не найден";
      }
    } catch (e) {
      $.error(e);
    }
  };
})(jQuery);

$(document).ready(function() {
  $(".kinopoisk").kinopoisk();
});

рони 11.08.2017 09:07

sivith,
скорее всего скрипт устарел

sivith 11.08.2017 09:36

он работал до того момента пока Кинопоис не переехал на HTTPS. Возможно его переделать под новые реалии?

j0hnik 11.08.2017 11:19

значит найдите абсолютные ссылки в скрипте ведущие на "http://rating.kinopoisk.ru"
замените на
"https://rating.kinopoisk.ru"

рони 11.08.2017 12:35

Цитата:

Сообщение от j0hnik
замените на

нужно что-то ещё

j0hnik 11.08.2017 12:39

Цитата:

Сообщение от рони (Сообщение 461347)
нужно что-то ещё

пробовали уже?

рони 11.08.2017 13:08

j0hnik,
да ... нужно правильно составить запрос на яхо, если это возможно (например https://rating.kinopoisk.ru/45054.xml) ... http://query.yahooapis.com/ используется чтобы обойти кросдоменный запрос. яхо возвращает пустой результат.

рони 11.08.2017 13:36

:-? может этот сервис яхо закрыт?

sivith 11.08.2017 14:21

А есть что-то подобное ?

рони 11.08.2017 14:48

sivith,
на кинопоиске есть своё api

sivith 11.08.2017 15:27

Так а теперь для человека который вообще не понимает в этом. Что нужно сделать с этим кодом что бы он заработал?

рони 11.08.2017 15:46

sivith,
1. получить личный token
2. переделать/сделать плагин ???

sivith 11.08.2017 16:34

если не сложно то можно переделать плагин а как получить token я не допёр

рони 11.08.2017 16:39

Цитата:

Сообщение от sivith
как получить token

пройти регистрацию
http://getmovie.cc/register/

sivith 11.08.2017 16:42

все токен есть, Скрипт брался тут https://github.com/dyadyavasya/kinopoisk

рони 11.08.2017 17:12

sivith,
как вы его получили, напишите пожалуйста?

sivith 11.08.2017 17:32

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

рони 11.08.2017 18:22

sivith,
Цитата:

Сообщение от рони
пройти регистрацию
http://getmovie.cc/register/

зайти в настройки - ввести домен - обновить данные - получить токен

sivith 12.08.2017 04:24

вот токин eb0ad184baaedcb3f6b5703b06a6a039

рони 12.08.2017 08:35

Rise,
Цитата:

за неимением гербовой пишем на простой
:)
https://github.com/dyadyavasya/kinop...nopoisk.js#L91
заменить на
$.ajax(
                    {
                        type: 'GET',
                        url: 'http://getmovie.cc/api/kinopoisk.json?id='+params.movie+'&token=eb0ad184baaedcb3f6b5703b06a6a039',
                        dataType: 'json',
                        success: function(data) {
                            var rating = data.rating;
                            data = "<kp_rating num_vote='"+(rating["kp_rating_num"]||0)+"'>"+(rating["kp_rating"]||0)+"</kp_rating><imdb_rating num_vote='"+(rating["imdb_num"]||0)+"'>"+(rating["imdb"]||0)+"</imdb_rating>";
                            movie_xml = methods._setCache(el, params.movie, data); // Кешируем данные
                            return methods._showRating(el, movie_xml);
                        },
                        error: function(data) {
                            console.log(data);
                            $.error(data.responseText);
                        }
                    }
                );

sivith 12.08.2017 10:30

Спасибо, но не работает ((((

рони 12.08.2017 10:36

Цитата:

Сообщение от sivith
не работает ((((




http://plnkr.co/edit/K0wjsLY28IP8S1w89Dkh?p=preview

sivith 12.08.2017 10:46

https://ibb.co/mXGnzv
https://ibb.co/kgO0Kv

sivith 12.08.2017 11:02

я ещё посмотрел и работает, но очень странно где есть где нет рейтинга где написано нет данных

рони 12.08.2017 11:08

sivith,
обнуляйте localStorage в ваших браузерах.
смотрите пример пост 23

рони 12.08.2017 11:21

sivith,
или отключите кеширование на какое-то время.
https://github.com/dyadyavasya/kinop...nopoisk.js#L87
добавить красное.
var movie_xml = methods._getCache(el, params.movie); movie_xml = false

sivith 12.08.2017 11:21

на новых релизах 2017 года почти на всех нет данных
https://ibb.co/kwf0ma

рони 12.08.2017 12:09

sivith,
пока ничем более помочь не могу

sivith 12.08.2017 12:21

спасибо большое очень благодарен

protti 16.08.2017 20:21

Вложений: 1
Цитата:

Сообщение от рони (Сообщение 461466)
sivith,
пока ничем более помочь не могу

PageSpeed Insights ругается, скриншот прикрепил. Не подскажешь как решить это?

рони 16.08.2017 20:42

protti,
делайте запросы через свой сервер на http://rating.kinopoisk.ru , это лучшее решение --- PageSpeed, не обращать внимания, или распределить запросы по времени, чтоб не все рейтинги хором качать, и возможно вы использовали версию без кеширования. (с кешем скачивает только раз в сутки). все версии выше не доделаны, использование на ваш риск.


Часовой пояс GMT +3, время: 19:36.