Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2017, 07:04
Интересующийся
Отправить личное сообщение для sivith Посмотреть профиль Найти все сообщения от sivith
 
Регистрация: 11.08.2017
Сообщений: 14

Скрипт рейтинга фильмов с 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();
});

Последний раз редактировалось sivith, 11.08.2017 в 07:53.
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2017, 09:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

sivith,
скорее всего скрипт устарел
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2017, 09:36
Интересующийся
Отправить личное сообщение для sivith Посмотреть профиль Найти все сообщения от sivith
 
Регистрация: 11.08.2017
Сообщений: 14

он работал до того момента пока Кинопоис не переехал на HTTPS. Возможно его переделать под новые реалии?
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2017, 11:19
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

значит найдите абсолютные ссылки в скрипте ведущие на "http://rating.kinopoisk.ru"
замените на
"https://rating.kinopoisk.ru"
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2017, 12:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от j0hnik
замените на
нужно что-то ещё
Ответить с цитированием
  #6 (permalink)  
Старый 11.08.2017, 12:39
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от рони Посмотреть сообщение
нужно что-то ещё
пробовали уже?
Ответить с цитированием
  #7 (permalink)  
Старый 11.08.2017, 13:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

j0hnik,
да ... нужно правильно составить запрос на яхо, если это возможно (например https://rating.kinopoisk.ru/45054.xml) ... http://query.yahooapis.com/ используется чтобы обойти кросдоменный запрос. яхо возвращает пустой результат.
Ответить с цитированием
  #8 (permalink)  
Старый 11.08.2017, 13:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

может этот сервис яхо закрыт?
Ответить с цитированием
  #9 (permalink)  
Старый 11.08.2017, 14:21
Интересующийся
Отправить личное сообщение для sivith Посмотреть профиль Найти все сообщения от sivith
 
Регистрация: 11.08.2017
Сообщений: 14

А есть что-то подобное ?
Ответить с цитированием
  #10 (permalink)  
Старый 11.08.2017, 14:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

sivith,
на кинопоиске есть своё api
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как скопировать скрипт с переадресующей страници ramisa Элементы интерфейса 9 09.07.2013 23:59
Скрипт в скрипт :) Sakyra Общие вопросы Javascript 6 22.05.2013 09:58
Не работает скрипт :( VladimirV Javascript под браузер 5 21.12.2010 14:26
А как зделать скрипт, чтобы например скрипт 1 заменялся скриптом 2? yura371 Общие вопросы Javascript 3 06.01.2009 22:40
добавление окошка в скрипт подсчета слов Гость Общие вопросы Javascript 10 11.03.2008 17:07