Twitter RSS feed,[domdocument.load]:无法打开流:

时间:2010-05-19 14:58:52

标签: dom rss twitter document

我正在使用以下内容:

<?php
$doc = new DOMDocument();
$doc->load('http://twitter.com/statuses/user_timeline/XXXXXX.rss');
$arrFeeds = array();

foreach ($doc->getElementsByTagName('item') as $node) {
    $itemRSS = array ( 
        'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
        'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
        'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
        'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
    );
    array_push($arrFeeds, $itemRSS);
}

for($i=0;$i<=3;$i++) {
    $tweet=substr($arrFeeds[$i]['title'],17); 
    $tweetDate=strtotime($arrFeeds[$i]['date']);
    $newDate=date('G:ia l F Y ',$tweetDate);
    if($i==0) { $b='style="border:none;"'; }
    $tweetsBox.='<div class="tweetbox" ' . $b . '>
    <div class="tweet"><p>' . $tweet . '</p>
    <div class="tweetdate"><a href="http://twitter.com/XXXXXX">@' . $newDate .'</a></div>
    </div>
    </div>';
} 

return $tweetsBox;
?>

从给定的时间轴返回4条最新的推文(XXXXX是相关的Feed)

它似乎工作正常,但我最近偶尔得到以下错误:

PHP错误调试   错误:DOMDocument :: load(http://twitter.com/statuses/user_timeline/XXXXXX.rss)[domdocument.load]:无法打开流:HTTP请求失败! HTTP / 1.1 502 Bad Gateway

我已经读过上面的代码依赖于Twitter beign可用,我知道它有时会变得很忙。是否有更好的接收twits的方法,或者是否有任何类型的错误捕获我只能显示“推文当前不可用...”消息而不是导致错误。我是usnig ModX CMS,因此任何解析错误都会导致网站失败,而不仅仅是输出警告。

感谢。

1 个答案:

答案 0 :(得分:0)

我知道这已经过时了,但我只是在寻找一个几乎相同的脚本来获取推特时间线的相同解决方案。我最终做到了这一点,虽然我还没能对它进行彻底的测试。

我将twitter url定义为变量($ feedURL),我也在$ doc_load中使用了它。然后,我将除$ feedURL之外的所有东西都包装到这个条件语句中:

$feedURL = "http://twitter.com/statuses/user_timeline/XXXXXXXX.rss"
$headers = @get_headers($feedURL);
if (preg_match("/200/", $headers[0])){
   //the rest of you original code in here
}
else echo "Can't connect user-friendly message (or a fake tweet)";

所以,它只是检查feed页面的标题,如果它的状态是200(OK),那么脚本的其余部分将执行。否则,它会回显您选择的消息。

(参考:http://www.phptalk.com/forum/topic/3940-how-to-check-if-an-external-url-is-valid-andor-get-file-size/


ETA:甚至更好,保存Feed的缓存版本(这也将确保您不会超出API的加载限制):

<?php
$cache_file = dirname(__FILE__).'/cache/twitter_cache.rss';
    // Start with the cache 
if(file_exists($cache_file)){
    $mtime = (strtotime("now") - filemtime($cache_file));
    if($mtime > 600) {
        $cache_rss = file_get_contents('http://twitter.com/statuses/user_timeline/75168146.rss');
        $cache_static = fopen($cache_file, 'wb');
        fwrite($cache_static, $cache_rss);
        fclose($cache_static);      
    }
    echo "<!-- twitter cache generated ".date('Y-m-d h:i:s', filemtime($cache_file))." -->";
}
else {
    $cache_rss = file_get_contents('http://twitter.com/statuses/user_timeline/75168146.rss');
    $cache_static = fopen($cache_file, 'wb');
    fwrite($cache_static, $cache_rss);
    fclose($cache_static);      
}
//End of caching 
?>

然后在$doc->load($cache_file)语句中使用$ cache_file而不是实际的Feed网址。 (改编自:http://snipplr.com/view/8156/twitter-cache/)。