RSS-канал Twitter, [domdocument.load]: не удалось открыть поток: - PullRequest
1 голос
/ 19 мая 2010

Я использую следующее:

<?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 - соответствующий канал)

Кажется, он работает нормально, но недавно я периодически получал следующую ошибку:

PHP ошибка отладки Ошибка: DOMDocument :: load (http://twitter.com/statuses/user_timeline/XXXXXX.rss) [domdocument.load]: не удалось открыть поток: ошибка HTTP-запроса! HTTP / 1.1 502 Bad Gateway

Я читал, что приведенный выше код зависит от доступности beign, и я знаю, что иногда он бывает довольно занят. Есть ли лучший способ получения твитов, или есть какой-либо вид перехвата ошибок, который я мог бы сделать, чтобы просто отобразить «твиты в настоящее время недоступны ...» в виде сообщения, а не вызвать ошибку. Я использую ModX CMS, поэтому любая ошибка синтаксического анализа убивает сайт, а не просто выводит предупреждение.

спасибо.

1 Ответ

0 голосов
/ 15 июня 2010

Я знаю, что это старое, но я просто искал то же решение для почти идентичного скрипта для захвата временной шкалы в твиттере. Я закончил тем, что делал это, хотя я не был в состоянии полностью проверить это.

Я определил URL-адрес twitter как переменную ($ 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)";

Итак, он просто проверяет заголовки страницы канала, и если его статус равен 200 (ОК), то остальная часть сценария будет выполнена. В противном случае оно будет отображать сообщение по вашему выбору.

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


ETA: или, что еще лучше, сохраните кэшированную версию канала (что также гарантирует, что вы не превысите свой предел загрузки 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 
?>

Затем используйте $ cache_file в вашем выражении $doc->load($cache_file) вместо фактического URL фида. (Адаптировано отсюда: http://snipplr.com/view/8156/twitter-cache/).

...