两个远程调用其他网站的RSS信息的方法

3月15号发了一篇文章《通过RSS将wordpress的最新文章调用到其他网站》,一位朋友问我,RSS远程调用的时候如何取得feed源站点的文章全文,又如何控制feed的输出数量。关于这两个问题我做一下解答。

第一,全文输出得看feed源了,若对方提供全文输出,则用一段php代码是可以实现远程的RSS全文显示的。

代码如下:

<?php

$RSSURL = "http://feeds2.feedburner.com/redlogpress";

$buff = "";
$fp = fopen($RSSURL,"r");
while ( !feof($fp) ) {
    $buff .= fgets($fp,4096);
}
fclose($fp);

$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser,$buff,$values,$idx);
xml_parser_free($parser);
$channel_title = $values[2]["value"];
echo <<<__HTML__
<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=UTF-8'>
<title>$channel_title</title>
<link rel='stylesheet' type='text/css' id='css' href='http://www.redren.net/themes/reddigi2/style.css'>
</head>
<body>

<table border='0'>
<tr>
<td>
<img src='http://www.redren.net/themes/reddigi2/images/logo.jpg'>
</td>
<td>
$channel_title
$channel_lastBuildDate<br>
</td>
</tr>
__HTML__;

$in_item = 0;
foreach ($values as $value) {
    $tag  = $value["tag"];
    $type = $value["type"];
    $value = $value["value"];

    $tag = strtolower($tag);
    if ($tag == "item" && $type == "open") {
        $in_item = 1;
    } else if ($tag == "item" && $type == "close") {
        echo <<<EOM
<tr>
  <td colspan='2' class='header'width='400'>
    <a href="$link">$title</a>
  </td>
</tr>
<tr>
  <td colspan='2' width='400'align='right'>
    $pubDate
  </td>
</tr>
<tr>
  <td colspan='2' width='400'>
    $description
  </td>
</tr>
<tr>
  <td>
    &nbsp;
  </td>
</tr>
EOM;
        $in_item = 0;
    }
    if ($in_item) {
        switch ($tag) {
            case "title":
                $title = $value;
                break;
            case "link":
                $link = $value;
                break;
            case "pubDate":
                $pubDate = $value;
                break;
            case "description":
                $description = $value;
                break;
        }
    }
}

echo <<< __HTMLEND__
</table>
</body>
</html>
__HTMLEND__;

?>

这段代码靠一个css文件控制其输出格式,具体请仔细参阅代码。

第二,控制feed的输出条数,我提供另一种RSS读取的php代码,本例将RSS读取类先给封装一次,然后用传统的模板格式将其显示出来。

封装的RSS类,文件名设定为 rss.class.php,代码如下:

<?php
class ReadRSS{
    var $url;
    var $content;
    var $values;
    function ReadRSS($url){
        $this->url=$url;
    }
    function ReadFile(){
        $fp = fopen($this->url,"r");
        while ( !feof($fp) ) {
            $this->content .= fgets($fp,4096);
        }
        fclose($fp);
    }
    function ReadXML(){
        $parser = xml_parser_create();//建立xml解析器
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);//忽略由空白字符组成的值
        xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,'UTF-8');
//设置编码,目前只支持ISO-8859-1、US-ASCII 和 UTF-8,也可以不设置,与目标编码一致
        xml_parse_into_struct($parser,$this->content,$this->values);
        xml_parser_free($parser);
    }
    function RSS($n=10){
        $this->ReadFile();
        $this->ReadXML();
        $in_item = 0;
        $i=0;
        $read=array();
        foreach ($this->values as $value) {
            $tag = $value["tag"];
            $type = $value["type"];
            $value = $value["value"];
            $tag = strtolower($tag);
            if ($tag == "item" && $type == "open") {
                $in_item = 1;
            } else if ($tag == "item" && $type == "close"){
                $read[$i]['link']=$link;
                $read[$i]['title']=$title;
                if ($pubDate) {
                    $read[$i]['pubDate']=$pubDate;
                }
                $read[$i]['description']=$description;
                $in_item = 0;
                   $i++;
                if ($i>=$n) {
                    break;
                }
            }
            if ($in_item) {
                switch ($tag) {
                    case "title":
                        $title = $value;
                        break;
                    case "link":
                        $link = $value;
                        break;
                    case "pubDate":
                        $pubDate = $value;
                        break;
                    case "description":
                        $description = $value;
                        break;
                }
            }
        }
        return $read;
    }
}
?>

模板代码如下:

<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=UTF-8'>
    <title>红人网事</title>
</head>
<body>
<?php
include_once('rssclass/rss.class.php');
$url="http://blog.redren.net/feed/";
$rss=new ReadRSS($url);
$values=$rss->RSS(10);
# 10 可以改成别的数字,比如5,这是读取feed的条数
foreach ($values as $value) {
    echo "<div><a href={$value['link']}>{$value['title']}</a></div>";
}
?>
</body>
</html>

这个模板调用了刚才建立的位于 rssclass 这个文件夹下的 rss.class.php RSS类。

如果你还希望个更简单的方法取得远程RSS信息,并且不在意SEO的效果的话,这里还有一篇通过 Google Ajax API 获取远程Feed信息的几个实例。《利用 Google Ajax API 的几个实例

3 thoughts on “两个远程调用其他网站的RSS信息的方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注