views:

194

answers:

1

hi

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"&gt;@' . $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 message rather than causing an error. I'm usnig ModX CMS so any parse error kills the site rather than just ouputs a warning.

thanks.

A: 

Hi, 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/).

Kerri