Тема: 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'].': </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 определения ботовАналогично например можно для ботов не выводить ссылки на каждое сообщение форума.