HTML from RSS

Скрипт вывода новостей наших партнёров на главной из их rss.

За основу был взят скрипт который работал на api yahoo,
но для надёжности и под нужды был переделан.
Так же на нашем сервере разместили аналог yahoo rss to json конвертера:

<?php
header("Content-type:application/json; charset=utf-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
if (isset ($_GET['feedurl']))
{
	$urlfeed=filter_var($_GET['feedurl'], FILTER_SANITIZE_URL);
	$fileContents= file_get_contents($urlfeed);
    $simpleXml = simplexml_load_string($fileContents,'SimpleXMLElement', LIBXML_NOCDATA);
    if ($simpleXml === false)
    {
    	echo "$fileContents\n";
     	echo "Failed loading XML: ";
            foreach(libxml_get_errors() as $error)
            {
            echo "
", $error->message;
            }
    }
    else{echo json_encode($simpleXml);}
}
else {echo 'false'.$_GET['feedurl'];}
?>

Для успешной загрузки с поддомена была добавлена строка в .htaccess

Header add Access-Control-Allow-Origin "*"

Код на javascript с использованием JQuery:

/*********************************************************************
 by Malicious Fox 2016 for artv-news.ru
 *  modifed from :
 * #### jQuery htmlfromrss.js V.0.001 ####
 * Coded by Ican Bachors 2016.
 * http://ibacor.com/labs/htmlfromrssjs
 *********************************************************************/
jQuery(function($) {
 $.fn.htmlfromrss = function(f) {
    $(this).each(function(i, a) {
        $(this).html('<div class="htmlfromrss"><ul id="htmlfromrss' + i + '"></ul></div>');
        rsstohtml($(this).data('htmlfromrss'), i)
    });

     function relative_time(x) {
        if (!x) {
            return
        }
        var a = x;
        a = $.trim(a);
        a = a.replace(/\.\d\d\d+/, "");
        a = a.replace(/-/, "/").replace(/-/, "/");
        a = a.replace(/T/, " ").replace(/Z/, " UTC");
        a = a.replace(/([\+\-]\d\d)\:?(\d\d)/, " $1$2");
        var b = new Date(a);
        var c = (arguments.length > 1) ? arguments[1] : new Date();
        var d = parseInt((c.getTime() - b) / 1000);
        d = (d < 2) ? 2 : d;
        var r = '';
        if (d < 60) {
            r = 'Только что'
        } else if (d < 120) {
            r = 'Минуту назад'
        } else if (d < (45 * 60)) {
            r = (parseInt(d / 60, 10)).toString() + ' мин. назад'
        } else if (d < (2 * 60 * 60)) {
            r = 'Час назад'
        } else if (d < (24 * 60 * 60)) {
            r = '' + (parseInt(d / 3600, 10)).toString() + ' ч. назад'
        } else if (d < (48 * 60 * 60)) {
            r = 'День назад'
        } else {
            r = (parseInt(d / 86400, 10)).toString() + ' д. назад'
        }
        return (r.match('NaN') ? x : r)
    }
    function checkonnull(p) {
     if(p != undefined && p != null && p != ''){return true;}
    }
    function rsstohtml(d, i) {
        $.ajax({
            url: 'https://api.artv-news.ru/rssjson.php?feedurl='+encodeURIComponent(d),
            crossDomain: true,
            dataType: 'json',
            beforeSend: function() {
            $('.htmlfromrss ul#htmlfromrss' + i).hide();}
        }).done(function(c) {
        	$('.htmlfromrss ul#htmlfromrss' + i).show();
            var ist=c.channel.title;
            var istlink=c.channel.link.replace("#/$#", "" );
            var s = "";
            defaultimg='//api.artv-news.ru/src/images/rss_circle.png';
            $.each(c.channel.item, function(e, a) {
                if (e < f) {
                    var b = relative_time(a.pubDate),
                        desk = a.description;
                        if(checkonnull(a.enclosure)== true)
                        {
                            if(checkonnull(a.enclosure["@attributes"].url)== true && a.enclosure["@attributes"].type == 'image/jpeg')
                        {
    img='<img src="//ir0.mobify.com/75/99/'+a.enclosure["@attributes"].url+'" width="75" height="75" alt="'+a.title+'" border="0" onerror="this.onerror=null; this.src=\''+defaultimg+'\'">';}
                        }
                        else
                        {
    img='<img src="'+defaultimg+'" width="75" height="75" alt="'+a.title+'" border="0" >';
                        }

                    s += '<li class="partnrss"><a href="' + a.link + '" target="_BLANK" rel="nofollow"><span class="partntitlerss">' + a.title + '</span>';
                    s += (img != null && img != undefined ? '<span class="partnimgrss"> ' + img + '</span>' : '');
                    s += (b != null && b != undefined ? '<span class="partndaterss">' + b + '</span>' : '');
                    s += (desk != null && desk != undefined ? '<span class="partnpostrss">' + desk.replace(/<.*?>/g, "").substr(0,150) + ' ...</span>' : '');
                    s += (ist != null && ist != undefined ? '<span class="partnistrss">Источник: ' + ist + '</span></a></li>' : '');
                }
            });
            $('.htmlfromrss ul#htmlfromrss' + i).html(s)
        })
    }
}
});

Подключается у нас так:

<script src="https://api.artv-news.ru/src/js/rssfromjson.js"></script>
<div class="row">
 <div class="rssv" data-htmlfromrss="http://адресс ленты партнёра"></div>
</div>
<div class="row">
 <div class="rssv" data-htmlfromrss="http://адресс ленты другого партнёра"></div>
</div>
<script>jQuery(document).ready(function(){jQuery(".rssv").htmlfromrss(limit = 1);});</script>

Параметр limit задаёт колличество загружаемых новостей.



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

Войти с помощью: