Информер курса валют своими руками

Сделать информер курса валют для своего сайта - очень элементарная задача. Между тем, некоторым вебмастерам она кажется слишком трудоемкой и они ограничиваются поиском готовых информеров на финансовых порталах. Такие информеры валют, естественно, красочные и информативные, но в 99.9% случаев они содержат ссылку на сайт-источник. Как быть, если вы не хотите на своем сайте вместе с информером курса валют размещать посторонних ссылок, логотипов или торговых марок? Правильно: сделать свой информер! Этим и займемся!

Парсим данные для информера курса валют

Как всегда, ограничиваемся самым простым кодом и ищем самый простой путь. Пример самого элементарного парсера информации с других сайтов я приводил в статье "Парсим контент к себе на сайт". Этот код и будем использовать для своих целей (в данной статье он будет немного модифицирован для большей функциональности). Для начала нам нужно найти сайт-донор. Такой сайт должен удовлетворять некоторым требованиям, в частности:

  • Сайт ежедневно должен обновлять информацию о курсах валют;
  • Такая информация должна размещаться на постоянном адресе сайта (статичный урл);
  • Такую информацию можно видеть в исходном коде страницы (режим html).

Таких сайтов в интернете не так и мало, Гугль в помощь. В нашем примере (мы будем делать информер курса валют от Национального Банка Украины - НБУ), мы ограничимся облегченной wap версией сайта одного из мобильных операторов Украины, а именно - http://xwap.com.ua/srv/curr/index.php?mu=xhtml&s=djuice&l=ua&a=1. Открыв ссылку в браузере, мы увидим, что курс валют от НБУ на текущее число отображается в самом верху странички. Итак, принимаемся парсить эти строчки:

<?php

$content = file_get_contents('http://xwap.com.ua/srv/curr/index.php?mu=xhtml&s=djuice&l=ua&a=1'); //страница донор

// Определяем позицию строки, до которой нужно все отрезать (используем функцию strpos()).
$pos = strpos($content, '&lt;</a>&nbsp;');

/*Отрезаем все, что идет до нужной нам позиции (функция substr в данном случае принимает два параметра: строка для обработки и //номер позиции. Функция вернет строку, НАЧИНАЯ с указанной позиции) */
$content = substr($content, $pos);

// Точно таким же образом находим позицию второй строки
$pos = strpos($content, '<p><b>ГОТІВКОВИЙ:</b></p>');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

// Чистим мусор
$content = str_replace('&lt;</a>&nbsp;','', $content);
$content = str_replace('<br/>',' | ', $content);
$content = str_replace('<p>',' ', $content);
$content = str_replace('</p>',' ', $content);

echo $content; //выводим результат
?>

Если этот код поместить в файл, скажем под именем nbu.php и запустить его на своем сайте http://ваш сайт.ру/nbu.php то в окне браузера мы получим строчку, вида (что является курсом валют от НБУ на указанную дату):

 01.08.2014 НБУ: USD: 12.0972 | EUR: 16.2115 | RUR: 0.3386 | GBP: 20.4768 | JPY: 0.0118

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

Кэшируем и подключаем информер курса валют на сайте WordPress

Поскольку увлекаюсь WordPress, в своем примере приведу порядок вывода информера на этой платформе. В принципе, в коде ничего сложного нет, его можете аналогичным способом подключить где угодно, где работает php. Но прежде всего, мы должны кэшировать спарсенные данные. И это очень существенный момент!

Каждый раз обращаясь к странице http://ваш сайт.ру/nbu.php скрипт обращается к удаленному сайту. Таким образом, если 1000 людей откроют Ваш сайт (на котором будет выводится информер с курсом валют), это создаст 1000 запросов к сайту донору. Донору это не понравится и ваш ip сайта могут заблокировать и скрипт с вашего сайта не сможет больше получать данные. Поэтому и придумали такую вещь как "кэширование".

Кэширование - это сохранение некоторой переменной PHP в кэше с последующим её извлечение оттуда. Это простой и эффективный способ повысить производительность веб-приложения.

Как это будет работать в нашем случае? Скрипт получит данные с удаленного сайта и сохранит их в файл на нашем сайте. Данные в этом файле будут хранится некоторое время и через определенный период обновляться. Таким образом, данные о курсе валют пользователь сайта будет получать из этого временного файла на нашем сайте, а не напрямую от сайта-донора. То есть, наш скрипт будет обращаться за информацией к удаленному сайту, скажем, 1-2 раза в сутки, что исключает блокировку или подозрения в каких-либо махинациях с нашей стороны.

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

<?php
$cache_lifetime = 3600; //в секундах, 3600=1 час
$cache_file = "cache/kurs.html"; // в папке cache будет создаваться временный файл kurs.html
$cache_content = false;

if ( file_exists($cache_file) ) {
$cache_modified = time() - @filemtime($cache_file);
if ( $cache_modified < $cache_lifetime ) {
$cache_content = file_get_contents($cache_file);
}
}

$content = file_get_contents('http://xwap.com.ua/srv/curr/index.php?mu=xhtml&s=djuice&l=ua&a=1'); //страница донор

// Определяем позицию строки, до которой нужно все отрезать (используем функцию strpos()).
$pos = strpos($content, '&lt;</a>&nbsp;');

/*Отрезаем все, что идет до нужной нам позиции (функция substr в данном случае принимает два параметра: строка для обработки и //номер позиции. Функция вернет строку, НАЧИНАЯ с указанной позиции) */
$content = substr($content, $pos);

// Точно таким же образом находим позицию второй строки
$pos = strpos($content, '<p><b>ГОТІВКОВИЙ:</b></p>');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

// Чистим мусор
$content = str_replace('&lt;</a>&nbsp;','', $content);
$content = str_replace('<br/>',' | ', $content);
$content = str_replace('<p>',' ', $content);
$content = str_replace('</p>',' ', $content);


if ( $cache_content === false ) {
ob_start();
$cache_content = $content;
ob_end_clean();
$fp = @fopen($cache_file, "w");
if ( $fp ) {
@fwrite($fp, $cache_content);
@fclose($fp);
}
}

echo $cache_content;
?>

Обратите внимание на первые строчки: это параметры времени кэширования и путь к временному файлу. Собственно и все настройки работы скрипта кэширования. Не забываем сохранить код в файле под именем nbu.php.

Выводим информер курса валют в шаблоне WordPress

Скрипт полностью готов! Подключить его на сайте очень просто.

1. Создаем в корне сайта папку cache (права доступа - 755);

2. Открываем папку с названием используемого на сайте шаблона WordPress и копируем туда файл nbu.php

2. В той же папке прописываем строчку кода в той части шаблона, в которой хотим выводить данные. Зачастую это будет шапка (верхняя часть сайта), поэтому открываем header.php и в нужном месте вставляем:

<b>курс валют</b> на <?php include( TEMPLATEPATH . '/nbu.php' ); ?></p>

Открываем сайт в браузере, проверяем работу нашего информера курса валют:

Информер курса валют от НБУ
Пример работы информера курса валют от НБУ

Если у Вас не получилось или что-то не получается, описывайте свою проблему в комментариях!

 

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 голоса, рейтинг: 4,86 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

Наверняка у Вас есть вопросы, просьбы или пожелания. Не стесняйтесь спросить, я отвечаю всегда быстро...

26 комментарий

  1. Влад says:

    И еще вопрос.
    Спарсил курс и изменение в процентах (знак процента убрал str_replace). Судя по всему, значение изменения выдается в типе string.
    var_dump выдает примерно string(39) " +0,34 "
    Теперь мне бы хотелось в завимости от знака изменения придавать ему стиль. Но я никак не могу преобразовать это строковое значение в числовое, чтобы использовать if/else.
    (int)$a, intval($a), settype($a, 'integer') и просто умножение на 1/прибавление 0 - ничего не помогает.
    В var_dump($a) выдается типа int(0)
    Подскажите, пожалуйста, как сделать такое преобразование?

    1. Влад says:

      Разобрался, проблема была в другом: надо было заменить "," на ".".

  2. Влад says:

    Вячеслав, благодарю за код!
    Подскажите, пожалуйста, если необходимо из одного и того же источника спарсить 2 участка текста.

    Объявляю $content = file_get_contents (источник)
    Далее $pos1 = ...
    $content1 = substr($content, $pos)
    Точно также:
    $content2 = substr($content, $pos)
    и тп.

    Получаю два учатка текста $content1 и $content2.
    Вопрос: как в этом случае быть с кэшем?

    1. Вячеслав Скоблей says:

      Кеш никак не относится к вашему коду. Он кеширует все, что вы в него положите!

      1. Влад says:

        Вячеслав, в Вашем примере получалось одно значение $content и Вы направляли его в кэш:

        if ( $cache_content === false ) {
        ob_start();
        $cache_content = $content;
        ob_end_clean();
        $fp = @fopen($cache_file, "w");
        if ( $fp ) {
        @fwrite($fp, $cache_content);
        @fclose($fp);
        }
        }
        
        echo $cache_content;

        А у меня в коде получается $content1 и $content2. Как их одновременно в кэш убрать? Чтобы можно было вытаскивать пораздельности.

        1. Вячеслав Скоблей says:

          Можно объединить:
          $content = $content1+$content2;
          Для последующей работы их нужно будет снова распарсить.

          1. Влад says:

            Понял, в принципе примерно так и сделал. Благодарю!

  3. Макс says:

    Ну что тут скажешь, красавчик!!!!
    Очень помог, спасибо.

  4. Maksim says:

    Здравствуйте!
    Есть сайт-пул. Для него нужно вывести курсы криптовалют используя Public API
    Вот это - https://www.cryptopia.co.nz/Forum/Thread/255
    Собственно, как это сделать, что нужно?

    1. Вячеслав Скоблей says:

      Если Вас интересует криптовалюта, попробуйте такой вариант
      https://seo-zona.ru/informer-kursa-kriptovalyut-2017-06-28.html

  5. Виталий says:

    Russian Currency - лучший плагин вывода курсов, так как выводит и официальный и биржевой курс, плюс умеет кэшировать данные.

  6. андрей says:

    Подскажите пожалуйста можно ли применять эту технологию для редактора сайтов системы jimdo.com и как тогда это вставлять в сайт через вставку виджет/html или через загрузку файлов?

  7. очень благодарен за данный код и за помощь в исправлении ошибок, а статья о кешировании вместе с кодом очень полезна http://seo-zona.ru/informer-kursa-valyut-svoimi-rukami-2014-08-03.html, результат кода с кешированием http://buda-koshelevo.net/afisha-kinoteatra-kryinitsa/ автору огромное спасибо!

  8. Владимир says:

    Еще раз здравствуйте, с тем информером разобрался, теперь хотел сделать еще один, но столкнулся с проблемой кодировки, страница донора идет в кодировке windows-1251, а у меня сайт на utf-8 и когда я вставляю в часть страницы (не путем iframe)? а путем {include file="http://site.ru/mod.php"} то сайт в нормальной кодировке, а вставляемая информация в неправильной windows-1251.
    Вопрос, можно ли как то заставить кэшироваться передаваемой информации не в windows-1251, а в utf-8?

    1. Владимир says:

      Все, спасибо!
      Разобрался как сделать
      Доавил

      $cache_content = iconv('cp1251', 'utf-8', $cache_content);
  9. Владимир says:

    Спасибо! Помогла перекодировка. Правда Когда на сервере открываю файл то он как раз на оборот типа: ОТІВКОВИЙ

    У меня теперь еще один вопрос, я хочу сделать ограничение по GBP:, что бы курс заканчивался после рубля. меняю в коде вместо "ГОТІВКОВИЙ:" наменил на "GBP:" но так ничего не меняется.
    И еще как мне менять стиль? то есть заменить шрифт цвет и т.д., я вывожу код в шапку через

    Ну я так понял если на на css он не реагирует ?
    Еще раз очень благодарен за помощь!

    1. Вячеслав says:

      > У меня теперь еще один вопрос, я хочу сделать ограничение по GBP:, что бы курс заканчивался после рубля. меняю в коде вместо «ГОТІВКОВИЙ:» наменил на «GBP:» но так ничего не меняется.

      Дело в том, что используется кэширование. Если хотите видеть результат внесенных в код изменений, каждый раз удаляйте файл - cache/kurs.html

      >И еще как мне менять стиль? то есть заменить шрифт цвет и т.д.,

      Очень просто, можно обволонкуть контент в какой-нибудь < div>

      echo "< div class=\"moy\">";
      echo $ cache_content;
      echo "< /div>";

      или в разделе "Чистка мусора":

      $content = str_replace('что заменить','на что заменить', $content);

      Например:

      $content = str_replace('USD','< font color="red" face="Arial">USD< /font>', $content);

      и т.д.

      1. Владимир says:

        Менял часть кода :

        $cache_lifetime = 3600; на $cache_lifetime = 3;

        После чего перестал вообща работать, все вернул назад, и уже с десяток раз пробовал пересохранить в UTF-8
        все равно белый экран, что может быть?

        1. Вячеслав says:

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

      2. Вячеслав says:

        Код прекрасно работает (тот что в архиве). Повторюсь: для того чтобы видеть изменения в коде, ВЫ ДОЛЖНЫ УДАЛЯТЬ ЗАКЭШИРОВАННЫЙ ФАЙЛ cache/kurs.html (каждый раз когда хотите видеть результат работы скрипта, а не смотреть кэш)

        1. Владимир says:

          Спасибо, я действительно раз удалил кэш, а потом тотал командер отображал пустую папку, только разъеденение показало что на самом деле там был файл кэша.
          Сейчас пробую варианты со стилями,
          "Очень просто, можно обволонкуть контент в какой-нибудь

          echo "";
          echo $ cache_content;
          echo "";

          или в разделе «Чистка мусора»:

          $content = str_replace('что заменить','на что заменить', $content);

          Например:

          $content = str_replace('USD','USD', $content);

          "

          Оба Варианта отображаются на странице как текст то есть выглядит вот так и на странице
          Курс НБУ: USD: 12.9518 EUR: 16.7104 RUR: 0.3498

          Почему то код стиля принемает за текст

          Ну влюбом случае спасибо огромнейшее за помощь!

          1. Вячеслав says:

            Всегда пожалуйста Владимир!
            Если вы хотите подключить файл стилей в html коде, то сделайте это вверху кода до < ?php а если вы вписываете его где-нибудь в середине кода, то только через конструкцию: echo 'тут html код'; Основное вы уже осилили! Остались мелочи! Удачи!

  10. Владимир says:

    Что-то ничего не выходит, по адресу http://a-news.com.ua/nbu.php просто белый экран. Что сделал не так?
    Заранее благодарен!

    1. Вячеслав says:

      Здравствуйте Владимир. Белый экран - это признак нарушения синтаксиса кода. Проверьте, все ли скобки на своих местах? Комментарии из кода желательно вырезать, поскольку они могут создать такие проблемы.

      Также, если подключали кэширование, попробуйте для папки cache права доступа - 777

      1. Владимир says:

        Доброго времени суток!
        Очень благодарен что вы отреагировали на мой вопрос.
        Удалил коменты внутри кода. Сделал права для папки cache 777. Вот код ошибок (вроде бы нет):

        <?php
        $cache_lifetime = 3600; 
        $cache_file = "cache/kurs.html";
        $cache_content = false;
        
        if ( file_exists($cache_file) ) {
        $cache_modified = time() - @filemtime($cache_file);
        if ( $cache_modified < $cache_lifetime ) {
        $cache_content = file_get_contents($cache_file);
        }
        }
        
        $content = file_get_contents('http://xwap.com.ua/srv/curr/index.php?mu=xhtml&s=djuice&l=ua&a=1'); 
        $pos = strpos($content, '< ');
        
        
        $content = substr($content, $pos);
        
        $pos = strpos($content, 'ГОТІВКОВИЙ:');
        
        
        $content = substr($content, 0, $pos);
        
        $content = str_replace('< ','', $content);
        $content = str_replace('',' | ', $content);
        $content = str_replace('',' ', $content);
        $content = str_replace('',' ', $content);
        
        if ( $cache_content === false ) {
        ob_start();
        $cache_content = $content;
        ob_end_clean();
        $fp = @fopen($cache_file, "w");
        if ( $fp ) {
        @fwrite($fp, $cache_content);
        @fclose($fp);
        }
        }
        
        echo $cache_content;
        ?>

        Вот сам файлик: https://yadi.sk/d/uanv6J6ibQ99H

        P.S. не может же не работать из-за того что это не вордпресс, а dle?
        Еще раз благодарю за уделенное мне время.

        1. Вячеслав says:

          Сохранил файл с yadi.sk, запустил, все работает. Почему у вас не работает - кажется понимаю. Сохраните файл nbu.php в кодировке UTF-8 (без BOM). Откройте, убедитесь, что слово "ГОТІВКОВИЙ" читается правильно.
          Запустите на сервере. Enjoy!

Добавить комментарий

Ваш адрес email не будет опубликован.