Как стать автором
Обновить

Популярное: RSS сайта + статистика Facebook

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

Не думая долго я написал скрипт, который парсит RSS с сайта и сортирует статьи так, что самые популярные оказываются выше остальных.



И эти 50 строк кода очень упростили мне жизнь — теперь я только выбираю нужный мне сайт (адрес его RSS трансляции) и запускаю скрипт.
Код и комментарии по реализации под катом.

  1. <?php
  2. $url = 'http://www.vedomosti.ru/newspaper/out/rss.xml';
  3. $FBstat = 'http://api.facebook.com/restserver.php?method=links.getStats&urls=';
  4. $linkFB = '';
  5.  
  6. // парсим rss с сайта
  7. $rss = simplexml_load_file($url);
  8. $i = 0;
  9. foreach ($rss->channel->item as $item) {
  10. $linkFB = $linkFB . $item->link . ',';
  11. $FB[$i]['title'] = '<a href="'.$item->link.'">'.$item->title.'</a>';
  12. $FB[$i]['description'] = $item->description;
  13. $FB[$i]['pubDate'] = $item->pubDate;
  14. $i++;
  15. }
  16.  
  17. // получаем статистику по ссылкам
  18. $rssFB = simplexml_load_file($FBstat . $linkFB);
  19. $i = 0;
  20. foreach ($rssFB->link_stat as $item) {
  21. $FB[$i]['shareFB'] = $item->share_count;
  22. $FB[$i]['likeFB'] = $item->like_count;
  23. $i++;
  24. }
  25.  
  26. // сортировка по убыванию share + like
  27. function cmp($a, $b) {
  28. $x1 = $a["shareFB"] + $a["likeFB"];
  29. $x2 = $b["shareFB"] + $b["likeFB"];
  30. return $x2 - $x1;
  31. }
  32.  
  33. usort($FB, "cmp");
  34.  
  35. // вывод статистики
  36. echo '<h1>Ведомости.RU</h1>';
  37.  
  38. reset($FB);
  39. foreach($FB as $abc) {
  40. $stat = 'Shares: '.$abc['shareFB'].' Likes: '.$abc['likeFB'];
  41. if ($abc['shareFB'] != 0 || $abc['likeFB'] != 0) {
  42. $stat = '<b>'.$stat.'</b>';
  43. }
  44. echo '<div style="width:400px; margin-top:10px; border:1px dashed #98bf21;">';
  45. echo '<span style="display:block; font-size:1.2em;">'.$abc['title'].'</span>';
  46. echo '<span style="display:block;">'.$stat . ' ' . $abc['pubDate'].'</span>';
  47. echo '<div style="display:inline-block;">'.$abc['description'].'</div>';
  48. echo '</div>';
  49. }
  50. ?>

Комментарии
Не думаю что код нужно подробно разбирать, но замечу что самая простая реализация обладает следующими минусами:
  1. Нужно обязательно проверить какой именно URL «шарят» на сайте и сравнить его с получаемый в XML. Важен даже регистр, то есть для Facebook ?DocID= и ?docid= будут разными URL'ами.

  2. Очень часто количество item в RSS ограничено, поэтому если периодически не сохранять в БД все данные — вы получите только статистику по текущим данным из RSS.

  3. Для оптимизации времени статистика по всем ссылкам запрашивается за один запрос. Существует возможность выйти за количество допустимых символов в URL. Более правильный способ — группировать их и проверять длину (только не запрашивайте по каждому URL отдельно — Facebook не так быстро работает).
Для примера я писал стили прямо в коде, понимаю что это плохо. Зато радует то, что Facebook через API отдает данные в UTF-8 и SimpleXML в PHP тоже.

Проверить как работает скрипт можно тут.

А если честно, то мне больше нравятся возможности работы API Facebook через Javascript. Но вот получить внешний XML и разобрать его, для меня оказалось более сложной задачей, чем реализация на стороне сервера. Если подскажете как получить и разобрать данные внешнего XML через Javascript — буду очень признателен.
Теги:
Хабы:
+11
Комментарии 10
Комментарии Комментарии 10

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн