1

Тема: MOD для ботов :)

Написал такой модик для определения ботов и не только.

1.  В functions.php меняем функцию set_default_user()

function set_default_user()
{
    global $db, $db_type, $pun_user, $pun_config;

  // MOD определения ботов
  $flag_bot = false;
  @include PUN_ROOT.'cache/cache_bots.php';
  if (!defined('PUN_BOTS_LOADED'))
    $remote_addr = get_remote_address();
  else
  {
    $user_agent = getenv('HTTP_USER_AGENT');
    $k = count($bot_string);
    for ($i=0; $i < $k; $i++)
    {
      if (strstr($user_agent, $bot_string[$i]))
      {
        $remote_addr = $bot_alias[$i];
        $flag_bot = true;
        break;
      }
    }
    if (!$flag_bot)
        $remote_addr = get_remote_address();
  }
  // MOD определения ботов
  
    // Fetch guest user
    $result = $db->query('SELECT u.*, g.*, o.logged FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.ident=\''.$remote_addr.'\' WHERE u.id=1') or error('Unable to fetch guest information', __FILE__, __LINE__, $db->error());
    if (!$db->num_rows($result))
        exit('Unable to fetch guest information. The table \''.$db->prefix.'users\' must contain an entry with id = 1 that represents anonymous users.');

    $pun_user = $db->fetch_assoc($result);

    // Update online list
    if (!$pun_user['logged'])
    {
        $pun_user['logged'] = time();

        // With MySQL/MySQLi, REPLACE INTO avoids a user having two rows in the online table
        switch ($db_type)
        {
            case 'mysql':
            case 'mysqli':
                $db->query('REPLACE INTO '.$db->prefix.'online (user_id, ident, logged) VALUES(1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
                break;

            default:
                $db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) VALUES(1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
                break;
        }
    }
    else
        $db->query('UPDATE '.$db->prefix.'online SET logged='.time().' WHERE ident=\''.$db->escape($remote_addr).'\'') or error('Unable to update online list', __FILE__, __LINE__, $db->error());

    $pun_user['disp_topics'] = $pun_config['o_disp_topics_default'];
    $pun_user['disp_posts'] = $pun_config['o_disp_posts_default'];
    $pun_user['timezone'] = $pun_config['o_server_timezone'];
    $pun_user['language'] = $pun_config['o_default_lang'];
    $pun_user['style'] = $pun_config['o_default_style'];
    $pun_user['is_guest'] = true;
    // MOD определения ботов
    if ($flag_bot)
     $pun_user['is_bot'] = true;
    // MOD определения ботов
}

2.  В каталог cache ложим файл cache_bots.php. Сделан на будущее, если из админки редактировать захочется боты.

<?php

define('PUN_BOTS_LOADED', 1);
// название бота для отображения (точек не должно быть)
$bot_alias = Array('Rambler', 'Yandex', 'Googlebot', 'YahooSlurp', 'MSNmedia');
// строка соответствия для поиска в [b]HTTP_USER_AGENT[/b]. Регистр важен.
$bot_string = Array('StackRambler', 'Yandex', 'Googlebot', 'Yahoo! Slurp', 'msnbot-media');

3. index.php начиная с

if ($pun_config['o_users_online'] == '1')

изменяем на

if ($pun_config['o_users_online'] == '1')
{
    // Fetch users online info and generate strings for output
    $num_guests = 0;
    $num_bots = 0;
    $users = array();
    $result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());

    while ($pun_user_online = $db->fetch_assoc($result))
    {
        if ($pun_user_online['user_id'] > 1)
        {
          ++$num_users;
            $users[] = "\n\t\t\t\t".'<dd><a href="profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
        }
        else
        {
        // MOD определения ботов
            ++$num_guests;
            if (!strstr($pun_user_online['ident'],'.')) // Условие простое: если в идентификаторе нет точки, то это бот
             $users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($pun_user_online['ident']);
        // MOD определения ботов
        }
    }

    $num_users = intval($num_users); //count($users);
    echo "\t\t\t\t".'<dd>'. $lang_index['Users online'].': <strong>'.$num_users.'</strong></dd>'."\n\t\t\t\t".'<dd>'.$lang_index['Guests online'].': <strong>'.$num_guests.'</strong></dd>'."\n\t\t\t".'</dl>'."\n";


    if ($num_users+$num_guests > 0)
        echo "\t\t\t".'<dl id="onlinelist" class= "clearb">'."\n\t\t\t\t".'<dt><strong>'.$lang_index['Online'].':&nbsp;</strong></dt>'."\t\t\t\t".implode(',</dd> ', $users).'</dd>'."\n\t\t\t".'</dl>'."\n";
    else
        echo "\t\t\t".'<div class="clearer"></div>'."\n";

}
else
    echo "\t\t".'</dl>'."\n\t\t\t".'<div class="clearer"></div>'."\n";


?>
        </div>
    </div>
</div>
<?php

$footer_style = 'index';
require PUN_ROOT.'include/footer.php';

4. Если Вы хотите выводить страницы по другому для ботов, то вот пример:
Ссылки на поиск для ботов не выводятся, даже если гостям поиск разрешен.
В каталоге include в файле common.php после

check_cookie($pun_user);

добавляем это

// MOD определения ботов
if (isset($pun_user['is_bot']) && $pun_user['is_bot'])
  $pun_user['g_search'] = '0';
// MOD определения ботов

Аналогично например можно для ботов не выводить ссылки на каждое сообщение форума.

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

2

Re: MOD для ботов :)

это называется клоакинг)

Мой блог, на котором делаю форум :)

Сайт VoiD

Поделиться

3

Re: MOD для ботов :)

VoiD пишет:

это называется клоакинг)

Какое ругательное слово smile

Про это я вспомнил

Visman пишет:

Аналогично например можно для ботов не выводить ссылки на каждое сообщение форума.

потому что в реврайт моде видел упоминания в обсуждении про одни и теже страницы по разным ссылкам, что не хорошо для индексирования.

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

4

Re: MOD для ботов :)

Это называется Бан!

Сайт russianaustria

Поделиться

5

Re: MOD для ботов :)

russianaustria пишет:

Это называется Бан!

Это утверждение к чему относится?

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

6

Re: MOD для ботов :)

Видимо к ПС, точнее к их санкциям.

Сайт hcs

Поделиться

7

Re: MOD для ботов :)

в принципе нет, контент-то не изменяется

Ссылки на поиск для ботов не выводятся, даже если гостям поиск разрешен.

Аналогично например можно для ботов не выводить ссылки на каждое сообщение форума.

это проще в robots.txt запретить

Мой блог, на котором делаю форум :)

Сайт VoiD

Поделиться

8

Re: MOD для ботов :)

VoiD пишет:

это проще в robots.txt запретить

Ага, если только боты придерживаются robots.txt smile

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

9

Re: MOD для ботов :)

не придерживаются - их проблемы)

Мой блог, на котором делаю форум :)

Сайт VoiD

Поделиться

10

Re: MOD для ботов :)

Поправка: в index.php вот этот участок

        // MOD определения ботов
            ++$num_guests;
            if (!strstr($pun_user_online['ident'],'.')) // Условие простое: если в идентификаторе нет точки, то это бот
             $users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($pun_user_online['ident']);
        // MOD определения ботов

наверное лучше заменить на это

        // MOD определения ботов
            if (!strstr($pun_user_online['ident'],'.')) // Условие простое: если в идентификаторе нет точки, то это бот
            {
             ++$num_guests;
             $users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($pun_user_online['ident']);
            }
        // MOD определения ботов

чтобы слово Активны на простых гостей не вылазило smile

Добавлено спустя     8 минут   33 секунды:
Нет не надо так менять, я ошибся.
Оставляем без изменений

// MOD определения ботов
            ++$num_guests;
            if (!strstr($pun_user_online['ident'],'.')) // Условие простое: если в идентификаторе нет точки, то это бот
             $users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($pun_user_online['ident']);
        // MOD определения ботов

а вот это

if ($num_users+$num_guests > 0)

меняем на это

if ($num_users > 0)

Добавлено спустя     20 минут   24 секунды:
Вот закрыли редактирование постов, теперь за собой надо следить, что пишешь smile
P.S. Один раз отрежь, семь раз отмерь.

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

11

Re: MOD для ботов :)

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

Сайт hcs

Поделиться

12

Re: MOD для ботов :)

Возмусь за мод в котором ограничение по времени редактирования, но надо в реале малость с делами разобраться. А там может и до статусов дело дойдет.
Где-то мы это уже обсуждали smile

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться

13

Re: MOD для ботов :)

Вот интересная ссылка по теме роботов.
List of User-Agents (Spiders, Robots, Crawler, Browser) - hттp://www.user-agents.org/

Моя сборка FluxBB 1.4

Сайт Visman

Поделиться