RSS Feed

Все моды, созданные нашим сообществом для phpBB 2.0.x, будут анонсированы тут. Вся техническая поддержка по этим модам оказывается в этом форуме.

RSS Feed

Сообщение MOD Manager 09.01.2005 21:11

Название мода: RSS Feed
Автор: Егор Наклоняев
Описание мода: Позволяет получать последние сообщение с форума в формате XML. Поддерживаются форматы RSS 2.0 и Atom 0.3.
Версия мода: 2.2.4
Совместимая версия phpBB: 2.0.х
Cложность установки: Легко
Время, необходимое для установки: ~ 3 минуты

Скачать: rssfeed_2.2.4.zip
Размер файла: 24 kb
Последний раз редактировалось MOD Manager 17.01.2005 20:56, всего редактировалось 2 раз(а).
Аватара пользователя
MOD Manager
Робот
 
Сообщения: 31
Зарегистрирован: 13.03.2004 22:18


Сообщение Егор Наклоняев 10.01.2005 19:36

ИНФОРМАЦИЯ К РАЗМЫШЛЕНИЮ

Более подобробно о данном моде, здесь:
http://naklon.info/rss/about.htm

P.S. Тем кто поставил себе на форум RSS, возможно имеет смысл зарегистрироваться в сервисе Яндекса:
http://blogs.yandex.ru/add.xml
Последний раз редактировалось Егор Наклоняев 13.01.2005 18:15, всего редактировалось 1 раз.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 11.01.2005 3:53

МАЛЕНЬКИЕ ХИТРОСТИ.

В RSS мною с особым цинизмом не был включен логотип сайта. Но это легко поправить:
1) Откройте шаблон rss_body.tpl
2) Найдите
<!-- BEGIN post_item -->
3) Перед этим вставьте строки:
Код: Выделить всё
<image>
  <url>{BOARD_URL}templates/subSilver/images/logo_phpBB_med.gif</url>
  <title>{BOARD_TITLE}</title>
  <link>{BOARD_URL}</link>
  <width>122</width>
  <height>56</height>
</image>


Это добавит модную картинку
Изображение
которая установлена по умолчанию на всех форумах.
Если у Вас есть собственная картинка, просто пропишите URL картинки между тегами <url> и поставьте её размеры width и height
Напоминаю, что соглаcно стандарту, максимальная ширина картинки 144 пикселя и высота 400 пикселей, а если тэги width и height не указаны, размер полагается 88х31.

ВАЖНО: После исправления шаблонов, проверяйте их, пожалуйста, самостоятельно на правильность выдаваемого результата с помощью валидатора: http://feedvalidator.org/

Подробнее о стандарте RSS
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 11.01.2005 10:45

МАЛЕНЬКИЕ ХИТРОСТИ-2

Один из способов бороться с гражданами, настроившими свои агрегаторы на ежеминутные обновления данных с Вашего RSS:
1) Откройте rss.php
2) Найдите
//
// END Includes of phpBB scripts
//
3) После него добавьте:
Код: Выделить всё
if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'])) if((time()-strtotime($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']))<300)
{
    header("HTTP/1.1 304 Not Modified");
    exit;
}

Где 300 - время в секундах (т.е. 5 минут)
В результате, если у гражданина, по уверению его броузера или агрегатора, имеет место быть достаточно свежая версия RSS, то пусть он ей и радуется. Нечего базу данных лишний раз дёргать.
ВАЖНО: IMHO, более 5 минут лишать человека свежих новостей не следует.

Более пароноидальные идеи реализуются стандартными модами ограничения количества сессий с одного IP, поскольку для каждого подключения используется новая сессия
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 11.01.2005 18:16

Альтернативный вариант того же самого, но более хитрый. Используется идея, что если новых сообщений не возникло, то значит и не стоит проверять, редактировал ли кто-либо сообщения или нет.
Код: Выделить всё
if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']))
{
    $deadline=strtotime($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']);
   if((time()-$deadline)<300)
   {
       header("HTTP/1.1 304 Not Modified");
       exit;
   }
   $sql= "SELECT MAX(post_time) as pt FROM ". POSTS_TABLE;
   if ( !($result = $db->sql_query($sql)) )
      {
         message_die(GENERAL_ERROR, 'Error in obtaining post data', '', __LINE__, __FILE__, $sql);
      }
   if( $row = $db->sql_fetchrow($result) )
    {
        if($row['pt']<=$deadline)
        {
           header("HTTP/1.1 304 Not Modified");
          exit;
        }
    }
}


Хитрость заключается в том, что данный SQL запрос является очень шустрым и практически не влияет на общее время выполнение скрипта, в то время как основной запрос использует, практически, перебор значений.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Wizzz_art 12.01.2005 11:06

Все прекрасно кроме одного: если в теме сообщения есть незакрытые кавычки, то получаем ошибку:
A semi colon character was expected. Error processing resource 'http://forum.kolomna.ru/rss.php'. Line 151, Position 84

<title>Ищу человека :: Исчу дедушку и бабушку фамилии &quot;Архипов&quot; или &quot</title>
-------...

Пример: http://forum.kolomna.ru/rss.php
Wizzz_art
phpBB 1.2.0
 
Сообщения: 11
Зарегистрирован: 30.12.2004 18:01

Сообщение Егор Наклоняев 12.01.2005 12:38



Насколько я вижу, у Вас установлена версия RSS Feed 1.0.5
Если глючит версия 2.0.1 и поэтому Вы сделали откат - скопируйте новую версию под именем rss201.php в корень форума и покажите результат, в противном случае - рекомендую обновить версию.

Добавлено спустя 18 минут 52 секунды:

A semi colon character was expected. Error processing resource 'http://forum.kolomna.ru/rss.php'. Line 151, Position 84

<title>Ищу человека :: Исчу дедушку и бабушку фамилии &quot;Архипов&quot; или &quot</title>
-------...


Кажется понял, что Вы спрашиваете. Это ошибка связанная не с программой, а с применением таблицы стилей IE к ленте новостей.
Поскольку, как показала практика, применение XMLT-трансформации работает в полном объеме только в IE, и, при этом, в некоторых RSS-агрегаторах для Mozilla, в частности Aggerg8, начинаются глюки лучше не использовать её в постоянном режиме. Поэтому данная функция не была включена в релиз. Если это необходимо - в ближайшей версии сделаю отдельный ключ styled.

В любом случае рекомендую обновить версию.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Wizzz_art 12.01.2005 18:26

Поставил 2,0,1. Проверяю в MyIE и на http://feedvalidator.org
Ошибка та же. Правда из за ковычки это или нет, я не уверен.
Вот, создал специально тему для примера: http://forum.kolomna.ru/rss.php?f=15
Wizzz_art
phpBB 1.2.0
 
Сообщения: 11
Зарегистрирован: 30.12.2004 18:01

Сообщение Xpert 12.01.2005 18:58

Смотрим внимательно в html-код страницы и видим...
Код: Выделить всё
<title>Коломенский Форум :: Просмотр темы - Исчу дедушку и бабушку фамилии &quot;Архипов&quot; или &quot</title>

Соотвественно, именно так выглдядит название темы, после того, как оно было извлечено из БД. А связано это с ограничением на количество символов в названии темы.
Проблема в том, что проводить обратное преобразование нежелательно - можно нарваться на возможность XSS-атаки. :(
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5710
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение Егор Наклоняев 12.01.2005 20:53

Соотвественно, именно так выглдядит название темы, после того, как оно было извлечено из БД. А связано это с ограничением на количество символов в названии темы.


Точно! Урезана ; в конце последнего &quot - из-за этого все неприятности. Следовало &quot;

Добавлено спустя 36 минут 59 секунд:

Wizzz_art
Давайте попробуем следующий путь:
Найдем в файле rss.php строку (примерно 547 строка)

'TOPIC_TITLE' => str_replace($badtags,$goodtags,$topic_title),

и заменим это на

'TOPIC_TITLE' =>htmlspecialchars(html_entity_decode($topic_title,ENT_QUOTES)),

Если это исправит ситуацию в Вашем случае - добавлю в следующую версию.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Wizzz_art 12.01.2005 21:08

Спасибо! С причиной разобрался.
А избежать этого, насколько я понимаю, нельзя?

Добавлено спустя 34 секунды:

Упс. Поторопился :)
Сейчас попробую.

Добавлено спустя 4 минуты 20 секунд:

Исправил. Вроде работает...
Wizzz_art
phpBB 1.2.0
 
Сообщения: 11
Зарегистрирован: 30.12.2004 18:01

Сообщение Егор Наклоняев 13.01.2005 2:15

Вышла новая версия исправляющая эту и еще несколько огрех
Изменения в версии 2.1.0
- Улучшена безопасность
- Добавлено кэширование
- Устранены отдельные недочёты ( с TOPIC_TITLE в том числе)
- Добавленый аддоны
- Добавлено английское описание
- автоподдержка языка.

Кроме того, самое главное, сделано кэширование основного rss
Если rss вызывается без параметров, то результат может сохраняться на диске и не считаться следующий раз, что позволяет еще больше снизить нагрузку на сервер.
Для этого нужно установить на папку cache права доступа 777 и в начале rss.php:
НАЙТИ
define('CACHE_TO_FILE', false);
ИЗМЕНИТЬ НА
define('CACHE_TO_FILE', true);

Добавлено спустя 1 час 6 минут 4 секунды:

Для тех, у кого кэш включен может полезно будет следующее:

Код: Выделить всё
<?php
$define('USE_GZIP',false);
$cache_file="УКАЖИТЕ ЗДЕСЬ ПОЛНЫЙ ПУТЬ/cache/rss_feed.xml";
$cachefiletime=@filemtime($cache_file);
$MyETag='"RSS'.gmdate("YmdHis", $cachefiletime).$verinfo.'"';
$MyGMTtime=gmdate("D, d M Y H:i:s", $cachefiletime)." GMT";

$do_gzip_compress = FALSE;
        if(isset($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH'])) {
      if ($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH'] == $MyETag) {
             header("HTTP/1.1 304 Not Modified");
           exit;
             }
      }
        else {
      if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'])) {
      if ($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'] == $MyGMTtime) {
          header("HTTP/1.1 304 Not Modified");
           exit;
             }
      }}
if (USE_GZIP)
{
   $phpver = phpversion();
   $useragent = (isset($_SERVER["HTTP_USER_AGENT"]) ) ? $_SERVER["HTTP_USER_AGENT"] : $HTTP_USER_AGENT;
   if ( $phpver >= '4.0.4pl1' && ( strstr($useragent,'compatible') || strstr($useragent,'Gecko') ) )
   {
      if ( extension_loaded('zlib') )
      {
         ob_start('ob_gzhandler');
      }
   }
   else if ( $phpver > '4.0' )
   {
      if ( strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip') )
      {
         if ( extension_loaded('zlib') )
         {
            $do_gzip_compress = TRUE;
            ob_start();
            ob_implicit_flush(0);

            header('Content-Encoding: gzip');
         }
      }
   }
}
    if (!empty($HTTP_SERVER_VARS['SERVER_SOFTWARE']) && strstr($HTTP_SERVER_VARS['SERVER_SOFTWARE'], 'Apache/2'))
   {
      header ('Cache-Control: no-cache, pre-check=0, post-check=0, max-age=0');
   }
   else
   {
      header ('Cache-Control: private, pre-check=0, post-check=0, max-age=0');
   }
   header("Last-Modified: ".$MyGMTtime);
   header("Etag: ".$MyETag);
   header("Expires: ".gmdate("D, d M Y H:i:s", time())." GMT");
   header ('Content-Type: text/xml; charset='.$lang['ENCODING']);
    if (!empty($HTTP_SERVER_VARS['SERVER_SOFTWARE']) && strstr($HTTP_SERVER_VARS['SERVER_SOFTWARE'], 'Apache/2'))
   {
      header ('Cache-Control: no-cache, pre-check=0, post-check=0, max-age=0');
   }
   else
   {
      header ('Cache-Control: private, pre-check=0, post-check=0, max-age=0');
   }
   header("Last-Modified: ".$MyGMTtime);
   header("Etag: ".$MyETag);
   header("Expires: ".gmdate("D, d M Y H:i:s", time())." GMT");
   header ('Content-Type: text/xml; charset='.$lang['ENCODING']);

   readfile($cache_file);
if ( $do_gzip_compress )
{
   $gzip_contents = ob_get_contents();
   ob_end_clean();

   $gzip_size = strlen($gzip_contents);
   $gzip_crc = crc32($gzip_contents);

   $gzip_contents = gzcompress($gzip_contents, 9);
   $gzip_contents = substr($gzip_contents, 0, strlen($gzip_contents) - 4);

   echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
   echo $gzip_contents;
   echo pack('V', $gzip_crc);
   echo pack('V', $gzip_size);
}
exit;
?>


Сия программка, размещенная где-нибудь на сайте может служить источником данных для разных роботов. Время выполнения её около 0.001 сек.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 14.01.2005 20:43

Опять давил клопов. В результате, надавил аж версию 2.1.3
Ошибки были мелкие, встречались редко, но все равно, без них лучше...
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 15.01.2005 16:41

Немного самолюбования.

Небольшое сравнение с известным модом, который изначально был взят за основу, а потом полностью переделан.
Код: Выделить всё
##############################################################
## MOD Title: RSS Content Syndicator
## MOD Author: nschindler < phpbb@wickedwisdom.com > (Nathan Schindler) N/A
## MOD Description: Post-centric forum syndication using RSS
## MOD Version: 2.0.2


http://naklon.info/talk/rss_new.php?nolimit - Около 0.3 сек
http://naklon.info/talk/rss_old.php - Около 0.4 сек

Это при наличии всего 1500(!) записей в форуме. При увеличении разрыв будет гораздо сильнее. Например, на одном сильно используемом форуме было 15 сек против 1.2 сек

При использовании кэширования:
http://naklon.info/talk/rss_new.php - 0.17 сек.
Только кэш, без обработки сессий (программа - выше)
http://naklon.info/rss/forum.php - 0.02 сек

Время выполнения скрипта выводится в комментариях в конце XML файла

ОФФТОПИК:
Как показало моё тестирование более 20 существующих агрегаторов, для RSS, из бесплатного, лучше всего использовать Abilon:
Немного о программе: http://naklon.info/texts/sleep/abilon.htm
Скачать можно здесь: http://abilon.org/abilon/download/
Программка небольшая, даже Dual-Up хватит

Из shareware - NewzCrawler, однозначно.

Opera и Mozilla (в т.ч. Sage, Aggreg8) - на настоящий момент не оптимально работают с HTTP заголовками и гораздо менее удобны.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

Сообщение Егор Наклоняев 15.01.2005 22:46

МАЛЕНЬКИЕ ХИТРОСТИ -3

Как исключить форум номер, например, 666 из RSS:
1.Открыть rss.php
2. Около строке 315 найти:
$unauthed = '0';
3. Заменить на
$unauthed = '0,666';
4. Чуть далее найти
if(!$is_auth[$forum_id]['auth_read'])
5.Заменить на
if(!$is_auth[$forum_id]['auth_read'] || $forum_id==666)

В результате, для Админов не изменится ничего, а обычные граждане не смогут получать форум 666 по RSS. Это удобно для исключения той же "корзины", или, скажем, для исключения премодерируемых форумов, поскольку данный MOD не поддерживает Approve Mod.

Более сложный случай:
$unauthed = '0,666,777';
if(!$is_auth[$forum_id]['auth_read'] || $forum_id==666 || $forum_id==777)


Sapienty sat

UPD: Извините, накосячил. Исправил.
Последний раз редактировалось Егор Наклоняев 16.01.2005 19:26, всего редактировалось 1 раз.
Аватара пользователя
Егор Наклоняев
Moderator
 
Сообщения: 417
Зарегистрирован: 25.10.2004 3:27
Откуда: оттуда

След.

Вернуться в Анонсы и поддержка модов для phpBB 2.0.x

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0