开发者

Twitter RSS feed, [domdocument.load]: failed to open stream:

开发者 https://www.devze.com 2022-12-30 17:01 出处:网络
i\'m using the following: <?php $doc = new DOMDocument(); $doc->load(\'http://twitter.com/statuses/user_timeline/XXXXXX.rss\');

i'm using the following:

<?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;
?>

to return the 4 most recent tweets from a given timeline (XXXXX is the relevant feed)

It seems to work fine but i've recently been getting the following error sporadically:

PHP error debug Error: DOMDocument::load(http://twitter.com/statuses/user_timeline/XXXXXX.rss) [domdocument.load]: failed to open stream: HTTP request failed! HTTP/1.1 502 Bad Gateway

I've read that the above code is dependant on Twitter beign available and I know it gets rather busy sometimes. Is there either a better way of receiving twits, or is there any kind of error trapping i could do to just to display "tweets are currently unavailable..." ind of messag开发者_运维技巧e rather than causing an error. I'm usnig ModX CMS so any parse error kills the site rather than just ouputs a warning.

thanks.


I know this is old, but I was just searching for the same solution for a nearly identical script for grabbing a twitter timeline. I ended up doing this, though I haven't been able to thoroughly test it.

I defined the twitter url as a variable ($feedURL), which I also used in $doc_load. Then, I wrapped everything except for the $feedURL into this conditional statement:

$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)";

So, it's just checking the headers of the the feed's page, and if its status is 200 (OK), then the rest of the script will execute. Otherwise, it'll echo a message of your choice.

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


ETA: Or even better, save a cached version of the feed (which will also ensure you don't go over your API limit of loads):

<?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 
?>

Then use $cache_file in your $doc->load($cache_file) statement instead of the actual feed url. (Adapted from here: http://snipplr.com/view/8156/twitter-cache/).

0

精彩评论

暂无评论...
验证码 换一张
取 消