А вы раскоментировали блок, чтоб все ссылки обнаружавались?natali писал(а):а блокнотик всё пишет и пишет сцуко )))))
Detector Bots
-
- phpBB 2.0.1
- Сообщения: 293
- Стаж: 19 лет 11 месяцев
- Откуда: Киев
-
- phpBB 2.0.3
- Сообщения: 368
- Стаж: 20 лет
-
- phpBB 1.2.1
- Сообщения: 24
- Стаж: 19 лет 10 месяцев
Для того чтоб гость не смог оставлять ссылки,
добавте перед строчкой
Такой код:
Добавлено спустя 3 минуты 6 секунд:
Но только сообщение выведится как для рекламного бота.
Потом доработаю
добавте перед строчкой
Код: Выделить всё
$bot_link_count = 0;
Такой код:
Код: Выделить всё
if ($userdata['user_id'] == ANONYMOUS ) $bot_max_link=0;
Но только сообщение выведится как для рекламного бота.
Потом доработаю
-
- phpBB 2.0.3
- Сообщения: 368
- Стаж: 20 лет
-
- phpBB 1.2.1
- Сообщения: 24
- Стаж: 19 лет 10 месяцев
-
- phpBB 2.0.1
- Сообщения: 293
- Стаж: 19 лет 11 месяцев
- Откуда: Киев
-
- phpBB 2.0.13
- Сообщения: 917
- Стаж: 19 лет 9 месяцев
- Откуда: с Луны свалил...
А это не страшно, даже имхо дарабатывать необязательно. Я у себя сделал, что выводится сообщение вроде (точно щас не помню) "На этом форуме есть ограничения по размещению ссылок. Сообщение не отправлено". Мне кажется lex'у не надо делать лишнюю работу, чтобы выводились разные сообщения. Какждый может придумать для своего форума сообщение, которое ему больше всего подойдет.lex писал(а):Но только сообщение выведится как для рекламного бота.
Потом доработаю
Еще раз спасибо за мод! Но чего-то я уже насладился сообщениями о попытках ботов оставить рекламу. Обычно 1-2 в день, а вчера вдруг сразу 10 попыток было. В честь праздника наверно

-
- phpBB 2.0.13
- Сообщения: 917
- Стаж: 19 лет 9 месяцев
- Откуда: с Луны свалил...
-
- phpBB 1.4.3
- Сообщения: 79
- Стаж: 19 лет 3 месяца
- Откуда: Минск
Доработано :wink:Stern писал(а):Надо для ЗАРЕГИСТРИРОВАННОГО пользователя. Чтобы после регистрации и только после оставления нескольких постов ему разрешалось закинуть ссылку. (гости вообще запрещено постить)
Жду с нетерпением доработки!
Предлагаю расширенный вариант мода Detector Bots
Отличия:
* Если юзер (читай, робот) постит спам в первом же сообщении - удаляет также юзера;
* Корректно обрабатывает сцепленные посты
* "Проверенного" юзера не убивает, но штрафует (если установлен мод Yellow Card)
Код: Выделить всё
# OPEN
includes\functions_post.php
# FIND
# именно в функцию prepare_message(), а не submit_post() - иначе
# не будут обрабатываться прицепляемые мессаги, а только новые
if($bbcode_on && $bbcode_uid != '')
{
$message = bbencode_first_pass($message, $bbcode_uid);
}
# AFTER ADD
/* ---8<--------[Detector Bots]----------------------------------------- */
global $unhtml_specialchars_match, $unhtml_specialchars_replace,$client_ip,$user_ip,$db,$userdata,$phpbb_root_path,$phpEx;
$first_post_max_link = 1; // позволено линков Гостю и Юзеру в самом первом посте, все слепленные считаются одним постом
$newbie_max_link = 10; // позволено линков новичку, написавшему более 1 поста
$oldbie_minposts = 16; // старичком считаем юзера, написавшего хотя бы 16 постов
$oldbie_max_link = 15; // позволено линков старичку
$use_yellowcard = true; // штрафовать юзера. Если MOD YellowCard не установлен, поставить FALSE
$send_email_to_admin = true; // отправлять уведомление админу
$link_count = 0;
preg_match_all('/\[url(.*?)\[\/url\]/i',$message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ BEG раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
preg_match_all("#(^|[\n ])([\w]+?://[^ "\n\r\t<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
preg_match_all("#(^|[\n ])((www|ftp)\.[^ "\t\n\r<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ END раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
if ($userdata['user_level'] == ADMIN && $userdata['session_logged_in']) {$link_count=0;} // не надо банить админа
if ($userdata['user_level'] == ANONYMOUS)
{
if ($link_count > $first_post_max_link)
{
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => '',
'LINKS' => $link_count,
'RESULT' => 'Сообщение не отправлено.',
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения. Для того, чтобы иметь возможность размещать ссылки необходимо <a href="profile.php?mode=register">зарегистрироваться</a>.');
}
}
elseif ($userdata['user_posts'] < 2 && $link_count > $first_post_max_link) // Самый первый пост. А <2 потому что если склеиваем, пост будет все равно первый, но число постов уже 1
{
// киляем и пост и юзера! без предупреждения...
$sql = "DELETE FROM " . SESSIONS_TABLE . " WHERE session_ip ='$user_ip'";
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT group_id FROM " . USER_GROUP_TABLE . " WHERE user_id = ".$userdata['user_id'];
if ($row = $db->sql_fetchrow($db->sql_query($sql)))
{
$sql = "DELETE FROM " . GROUPS_TABLE . " WHERE group_id = ".$row['group_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
}
$sql = "DELETE FROM " . USER_GROUP_TABLE . " WHERE user_id = ".$userdata['user_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
$sql = "DELETE FROM " . USERS_TABLE . " WHERE user_id = ".$userdata['user_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
// грамотно чистим форум (корректно обрабатываются склеенные сообщения)
if (isset($GLOBALS['topic_id'])) // продолжаем топик ? убить пост, оставить топик : прервать отправку
{
$sql = "SELECT Count(*) AS posts_in_topic, poster_id, topic_id FROM ".POSTS_TABLE." GROUP BY topic_id, poster_id HAVING topic_id = ".$GLOBALS['topic_id']." AND poster_id <> ".$userdata['user_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
// $sql = "DELETE p.* FROM ".POSTS_TABLE." p LEFT JOIN ".USERS_TABLE." u ON p.poster_id = u.user_id WHERE (u.user_id Is Null)";
// if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete posts', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT p.* FROM ".POSTS_TABLE." p LEFT JOIN ".USERS_TABLE." u ON p.poster_id = u.user_id WHERE (u.user_id Is Null)";
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Cannot select posts', '', __LINE__, __FILE__, $sql); }
while ($row = $db->sql_fetchrow($result)) {
$sql = "DELETE FROM ".POSTS_TABLE." WHERE post_id = ".$row['post_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete posts', '', __LINE__, __FILE__, $sql); }
}
// $sql = "DELETE pt.* FROM ".POSTS_TEXT_TABLE." pt LEFT JOIN ".POSTS_TABLE." p ON p.post_id = pt.post_id WHERE (p.post_id Is Null)";
// if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete post texts', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT pt.* FROM ".POSTS_TEXT_TABLE." pt LEFT JOIN ".POSTS_TABLE." p ON p.post_id = pt.post_id WHERE (p.post_id Is Null)";
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Cannot select post', '', __LINE__, __FILE__, $sql); }
while ($row = $db->sql_fetchrow($result)) {
$sql = "DELETE FROM ".POSTS_TEXT_TABLE." WHERE post_id = ".$row['post_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete post text', '', __LINE__, __FILE__, $sql); }
}
// обновляем статистику по топику и форумам (иначе глюк: пропадает тема, хоть и не удаляется)
$sql = "SELECT MIN(post_id) AS first_post, MAX(post_id) AS last_post FROM ".POSTS_TABLE." WHERE topic_id = ".$GLOBALS['topic_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql); }
if ($row = $db->sql_fetchrow($result))
{
$first_post = ( $row['first_post'] ) ? $row['first_post'] : 0;
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
}
else
{
$first_post = $last_post = 0;
}
$sql = "UPDATE ".TOPICS_TABLE." SET topic_first_post_id = $first_post, topic_last_post_id = $last_post WHERE topic_id = ".$GLOBALS['topic_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Could not update forum', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT MAX(post_id) AS last_post, COUNT(post_id) AS total FROM ".POSTS_TABLE." WHERE forum_id = ".$GLOBALS['forum_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql); }
if ($row = $db->sql_fetchrow($result))
{
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
$total_posts = ($row['total']) ? $row['total'] : 0;
}
else
{
$last_post = $total_posts = 0;
}
$sql = "SELECT COUNT(topic_id) AS total FROM ".TOPICS_TABLE." WHERE forum_id = ".$GLOBALS['forum_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get topic count', '', __LINE__, __FILE__, $sql); }
$total_topics = ( $row = $db->sql_fetchrow($result) ) ? ( ( $row['total'] ) ? $row['total'] : 0 ) : 0;
$sql = "UPDATE ".FORUMS_TABLE." SET forum_last_post_id = $last_post, forum_posts = $total_posts, forum_topics = $total_topics WHERE forum_id = ".$GLOBALS['forum_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Could not update forum', '', __LINE__, __FILE__, $sql); }
}
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => $userdata['user_posts'],
'LINKS' => $link_count,
'RESULT' => 'Сообщение удалено, Пользователь удален.',
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения.<br>Пользователь <b>'.$userdata['username'].'</b> удален. Если Вы считаете, что это - ошибка, внимательно читайте условия регистрации.');
}
elseif (($userdata['user_posts'] < $oldbie_minposts && $link_count > $newbie_max_link) || ($link_count > $oldbie_max_link))
{
// пост оставляем, но юзера штрафуем
if ($use_yellowcard)
{
$sql = "SELECT user_warnings FROM " . USERS_TABLE . " WHERE user_id = ".$userdata['user_id'];
if ($row = $db->sql_fetchrow($db->sql_query($sql)))
{
$sql = "UPDATE " . USERS_TABLE . " SET user_warnings = ".(intval($row['user_warnings'])+1)." WHERE user_id = ".$userdata['user_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
}
else
{
message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql);
}
}
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => $userdata['user_posts'],
'LINKS' => $link_count,
'RESULT' => 'Сообщение не отправлено'.($use_yellowcard ? ', Пользователь оштрафован: сейчас '.(intval($row['user_warnings'])+1).' из '.$board_config['max_user_bancard']:''),
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения.<br>Сообщение не отправлено'.($use_yellowcard ? ', пользователь <b>'.$userdata['username'].'</b> оштрафован.':'.').' Если Вы считаете, что это - ошибка, внимательно читайте условия регистрации.');
}
/* ---8<--------[Detector Bots]----------------------------------------- */
# CREATE FILE
language\lang_russian\email\detector_bot.tpl
# WITH THIS TEXT
Subject: Попытка размещения рекламы на {SITENAME}
Charset: windows-1251
На {SITENAME} была зафиксирована попытка размещения рекламы со следующими регистрационными данными:
IP: {IP}
Username: {USERNAME}
Total posts before: {POSTS}
Тема: {SUB}
Total links: {LINKS}
Message:
- - -8<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{MESSAGE}
- - -8<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Result: {RESULT}
{EMAIL_SIG}
# SAVE / CLOSE ALL FILES
Думал, в сказку попал??? Нее... ты в жизнь вляпался!
Авторские проекты: www.tuning.by | www.blume.by
Авторские проекты: www.tuning.by | www.blume.by
-
- phpBB 2.0.3
- Сообщения: 368
- Стаж: 20 лет
Объясните мне, что здесь надо удалить? Вроде и так все расскомментировано...
Поставил обновленный мод и вот что у меня форум выдает, когда новый пользователь пытается постить много ссылок в первом же сообщении:
SQL Quering error
DEBUG MODE
SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND poster_id <> 30' at line 1
SELECT Count(*) AS posts_in_topic, poster_id, topic_id FROM phpbb_posts GROUP BY topic_id, poster_id HAVING topic_id = AND poster_id <> 30
Line : 184
File : functions_post.php
Добавлено спустя 4 минуты 28 секунд:
А пользователь был удален. Значит, мод работает, но что-то где-то не так...
Может из-за того, что я подставил вот сюда свои значения?
$first_post_max_link = 0;
$newbie_max_link = 1
Протестировал еще раз и выяснилось, что эта ошибка возникает только тогда, когда новый юзер пытается в ПЕРВОМ же посте разместить ссылку(и). Он тут же удаляется, правда с этой ошибкой.
строка 184 содержит вот это:
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
Но, если юзер в первом сообщении никаких ссылок не давал, то при попытке разместить рекламу в СЛЕДУЮЩИХ постах МОД четко отсекал эти попытки и сообщал об этом на экране "Зафиксирована попытка размещения рекламного сообщения...". Юзер, конечно же, при этом не удалялся.
Жду с нетерпением исправления ошибки!!! А мод просто замечательный!
Добавлено спустя 48 минут 51 секунду:/* ---8<-----[ BEG раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
preg_match_all("#(^|[\n ])([\w]+?://[^ \"\n\r\t<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
preg_match_all("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ END раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
Поставил обновленный мод и вот что у меня форум выдает, когда новый пользователь пытается постить много ссылок в первом же сообщении:
SQL Quering error
DEBUG MODE
SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND poster_id <> 30' at line 1
SELECT Count(*) AS posts_in_topic, poster_id, topic_id FROM phpbb_posts GROUP BY topic_id, poster_id HAVING topic_id = AND poster_id <> 30
Line : 184
File : functions_post.php
Добавлено спустя 4 минуты 28 секунд:
А пользователь был удален. Значит, мод работает, но что-то где-то не так...
Может из-за того, что я подставил вот сюда свои значения?
$first_post_max_link = 0;
$newbie_max_link = 1
Протестировал еще раз и выяснилось, что эта ошибка возникает только тогда, когда новый юзер пытается в ПЕРВОМ же посте разместить ссылку(и). Он тут же удаляется, правда с этой ошибкой.
строка 184 содержит вот это:
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
Но, если юзер в первом сообщении никаких ссылок не давал, то при попытке разместить рекламу в СЛЕДУЮЩИХ постах МОД четко отсекал эти попытки и сообщал об этом на экране "Зафиксирована попытка размещения рекламного сообщения...". Юзер, конечно же, при этом не удалялся.
Жду с нетерпением исправления ошибки!!! А мод просто замечательный!
-
- Former team member
- Сообщения: 3942
- Стаж: 19 лет 11 месяцев
- Откуда: Оренбург (Южный Урал)
- Благодарил (а): 3 раза
Код: Выделить всё
HAVING topic_id = AND poster_id <> 30
---
Кстати о птичках. Бродяга, а как бы этот мод оформить по правилам оформления модов и программирования phpBB.
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции
наш форум http://forum.aeroion.ru/cat1.html
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции
наш форум http://forum.aeroion.ru/cat1.html
-
- phpBB 2.0.13
- Сообщения: 917
- Стаж: 19 лет 9 месяцев
- Откуда: с Луны свалил...