Обычно у меня не хватает времени для того, чтобы читать все новые статьи на сайтах, которые мне интересны. И, открывая Google Reader, я просматриваю пару последних записей RSS и просто нажимаю «отметить все как прочитанные».
Не эффективно, правда? Поэтому я решил сделать для себя естественный фильтр популярности контента: количество залайкавших его человек (аудитория Facebook более релевантна моим интересам).
Не думая долго я написал скрипт, который парсит RSS с сайта и сортирует статьи так, что самые популярные оказываются выше остальных.

И эти 50 строк кода очень упростили мне жизнь — теперь я только выбираю нужный мне сайт (адрес его RSS трансляции) и запускаю скрипт.
Код и комментарии по реализации под катом.
Комментарии
Не думаю что код нужно подробно разбирать, но замечу что самая простая реализация обладает следующими минусами:
Проверить как работает скрипт можно тут.
А если честно, то мне больше нравятся возможности работы API Facebook через Javascript. Но вот получить внешний XML и разобрать его, для меня оказалось более сложной задачей, чем реализация на стороне сервера. Если подскажете как получить и разобрать данные внешнего XML через Javascript — буду очень признателен.
Не эффективно, правда? Поэтому я решил сделать для себя естественный фильтр популярности контента: количество залайкавших его человек (аудитория Facebook более релевантна моим интересам).
Не думая долго я написал скрипт, который парсит RSS с сайта и сортирует статьи так, что самые популярные оказываются выше остальных.

И эти 50 строк кода очень упростили мне жизнь — теперь я только выбираю нужный мне сайт (адрес его RSS трансляции) и запускаю скрипт.
Код и комментарии по реализации под катом.
- <?php
- $url = 'http://www.vedomosti.ru/newspaper/out/rss.xml';
- $FBstat = 'http://api.facebook.com/restserver.php?method=links.getStats&urls=';
- $linkFB = '';
-
- // парсим rss с сайта
- $rss = simplexml_load_file($url);
- $i = 0;
- foreach ($rss->channel->item as $item) {
- $linkFB = $linkFB . $item->link . ',';
- $FB[$i]['title'] = '<a href="'.$item->link.'">'.$item->title.'</a>';
- $FB[$i]['description'] = $item->description;
- $FB[$i]['pubDate'] = $item->pubDate;
- $i++;
- }
-
- // получаем статистику по ссылкам
- $rssFB = simplexml_load_file($FBstat . $linkFB);
- $i = 0;
- foreach ($rssFB->link_stat as $item) {
- $FB[$i]['shareFB'] = $item->share_count;
- $FB[$i]['likeFB'] = $item->like_count;
- $i++;
- }
-
- // сортировка по убыванию share + like
- function cmp($a, $b) {
- $x1 = $a["shareFB"] + $a["likeFB"];
- $x2 = $b["shareFB"] + $b["likeFB"];
- return $x2 - $x1;
- }
-
- usort($FB, "cmp");
-
- // вывод статистики
- echo '<h1>Ведомости.RU</h1>';
-
- reset($FB);
- foreach($FB as $abc) {
- $stat = 'Shares: '.$abc['shareFB'].' Likes: '.$abc['likeFB'];
- if ($abc['shareFB'] != 0 || $abc['likeFB'] != 0) {
- $stat = '<b>'.$stat.'</b>';
- }
- echo '<div style="width:400px; margin-top:10px; border:1px dashed #98bf21;">';
- echo '<span style="display:block; font-size:1.2em;">'.$abc['title'].'</span>';
- echo '<span style="display:block;">'.$stat . ' ' . $abc['pubDate'].'</span>';
- echo '<div style="display:inline-block;">'.$abc['description'].'</div>';
- echo '</div>';
- }
- ?>
Комментарии
Не думаю что код нужно подробно разбирать, но замечу что самая простая реализация обладает следующими минусами:
- Нужно обязательно проверить какой именно URL «шарят» на сайте и сравнить его с получаемый в XML. Важен даже регистр, то есть для Facebook ?DocID= и ?docid= будут разными URL'ами.
- Очень часто количество item в RSS ограничено, поэтому если периодически не сохранять в БД все данные — вы получите только статистику по текущим данным из RSS.
- Для оптимизации времени статистика по всем ссылкам запрашивается за один запрос. Существует возможность выйти за количество допустимых символов в URL. Более правильный способ — группировать их и проверять длину (только не запрашивайте по каждому URL отдельно — Facebook не так быстро работает).
Проверить как работает скрипт можно тут.
А если честно, то мне больше нравятся возможности работы API Facebook через Javascript. Но вот получить внешний XML и разобрать его, для меня оказалось более сложной задачей, чем реализация на стороне сервера. Если подскажете как получить и разобрать данные внешнего XML через Javascript — буду очень признателен.