Бот форума phpbb3 - автоматизация размещения сообщений

Клиентское и серверное программное обеспечение

Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Вс дек 16, 2012 11:39

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Сообщения на форуме может размещать не только человек, но и бот - автоматически. Ниже приведен пример скрипта PHP с использованием cURL. Чей код использовался в качестве прототипа - уже не помню, в сети можно найти множество подобных примеров, но реально работающих маловато. Этот же тестировался на данном форуме, phpbb v.3.0.11, стили на основе prosilver и subsilver2.

Скрипт может выполняться как с сервера, так и с локального компьютера, подключенного к сети Интернет, с установленным сервером apache и PHP. Во время работы скрипта создается файл cookies (см. по тексту скрипта), поэтому необходимы права на запись.

Регистрация бота на форуме проводится человеком ))
Код: Выделить всё
<?

$login = 'bot';                        // Логин на форуме
$password = '123456';                  // Пароль на форуме
$link = 'http://myhost.ru/forum/';         // Ссылка на форум
$f = 2;  $t = 99;                     // Номер радела и темы узнать можно из ссылки viewtopic.php?f=2&t=99 -> $f=2 a $t=99
$time = 10;                           // Время между постами в секундах (на версиях 3.x стоит около 5 сек)
$subject = 'Re: Я - бот !';               // Текст сабжа по умолчанию
$message = 'Бот приветствует Вас !';      // Текст поста по умолчанию

// Отладка
$debug = true;                        // Для отладки

// Параметры
//$f, $t                           // f, t - Номер радела и темы
$n = 1;                              // n - Количество сообщений (умолчание = 1 )

set_time_limit(0);
header( 'Content-type: text/html; charset=utf-8' );

$f = request_var('f', $f);
$t = request_var('t', $t);
$n = request_var('n', 1);

trace($login.': start. parameters are:<br />');

trace('f='.$f.'<br />');
trace('t='.$t.'<br />');
trace('n='.$n.'<br />');

function trace ($str)
{
   global $debug

   if ($debug)
   {
      echo $str;
      ob_end_flush(); flush(); ob_start();
   }
}

function request_var($var, $default)
{
   if(isset($_GET[$var])) return $_GET[$var];
   return $default;
}

function curl($url='', $post='', $referer='', $proxy='')
{
   global $debug;

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/10.10 forum bot');
   curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/bot_cookie.txt');
   curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/bot_cookie.txt');

   if(!empty($post))
   {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
   } else
   {
      curl_setopt($ch, CURLOPT_POST, 0);
   }
   if(!empty($referer))
   {
      curl_setopt($ch, CURLOPT_REFERER, $referer);
   } else
   {
      curl_setopt($ch,CURLOPT_REFERER, 1);
   }
   if(!empty($proxy))
   {
      curl_setopt($ch, CURLOPT_PROXY, $proxy);
   }

   $ex=curl_exec($ch);

   curl_close($ch);

   return $ex;
}

// Логин
trace('login.<br />');

$x = curl($link.'ucp.php?mode=login');

preg_match('#[a-z0-9]{32}#i',$x, $sid);

curl($link.'ucp.php?mode=login', 'username='.$login.'&password='.$password.'&redirect=index.php&sid='.$sid[0].'&login=Вход');

// Отправка поста
for($i=0; $i<$n; $i++)
{
   trace('posting.<br />');

   $x = curl($link.'posting.php?mode=reply&f='.$f.'&t='.$t);

   preg_match('#[a-z0-9]{32}#i',$x, $sid);

   preg_match('/name="creation_time" value="(.*?)"/',$x, $creation_time);
   preg_match('/name="post" value="(.*?)"/',$x, $post);
   preg_match('/name="form_token" value="(.*?)"/',$x, $form_token);
   preg_match('/name="topic_cur_post_id" value="(.*?)"/',$x, $topic_cur_post_id);
   preg_match('/name="lastclick" value="(.*?)"/',$x, $lastclick);

   preg_match('/name="subject"(.*?)>/',$x, $xsubject);
   if(isset($xsubject[1]))
   {
      preg_match('/value="(.*?)"/',$xsubject[1], $ssubject);
      if(isset($ssubject[1])) $subject = $ssubject[1];
   }

   $p = array (
      'icon' => 0,
      'subject' => $subject,
      'addbbcode20' => 100,
      'message' => $message,
      'topic_cur_post_id' => $topic_cur_post_id[1],
      'lastclick' => $lastclick[1],
      'post' => $post[1],
      'attach_sig' => 'on',
      'creation_time' => $creation_time[1],
      'form_token' => $form_token[1],
      'fileupload' => '',
      'filecomment' => '',
   );
   curl($link.'posting.php?mode=reply&f='.$f.'&t='.$t, $p, $link.'posting.php?mode=reply&f='.$f.'&t='.$t);

   // Пауза между постами
   if(($i+1)<$n)
   {
      trace('sleep '.$time.' sec:');
      for($i=0;$i<$time;$i++)
      {
         trace(' '.($time-$i).' ... ');
         sleep(1);
      }
      trace('0.<br />');
   }
}

// Логаут
trace('logout.<br />');

curl($link.'ucp.php?mode=logout'.'&sid='.$sid[0]);

// Пауза между логинами
trace('sleep '.$time.' sec:');
for($i=0;$i<$time;$i++)
{
   trace(' '.($time-$i).' ... ');
   sleep(1);
}
trace('0.<br />');

trace($login.': stop.<br />');
?>

Работу скрипта через proxy можно проверить установив Tor Browser, поскольку Tor может использоваться как proxy. При загруженной панели Validata и наличии подключения к сети Tor можно использовать модифицированный скрипт:
Код: Выделить всё
<?

$login = 'bot';                        // Логин на форуме
$password = '123456';                  // Пароль на форуме
$link = 'http://myhost.ru/forum/';         // Ссылка на форум
$f = 2;  $t = 99;                     // Номер радела и темы узнать можно из ссылки viewtopic.php?f=2&t=99 -> $f=2 a $t=99
$time = 10;                           // Время между постами в секундах (на версиях 3.x стоит около 5 сек)
$subject = 'Re: Я - бот !';               // Текст сабжа по умолчанию
$message = 'Бот приветствует Вас !';      // Текст поста по умолчанию

// Отладка
$debug = true;                        // Для отладки

// Параметры
//$f, $t                           // f, t - Номер радела и темы
$n = 1;                              // n - Количество сообщений (умолчание = 1 )

// tor
$torIp = '127.0.0.1';
$torProxyPort = '9050';

set_time_limit(0);
header( 'Content-type: text/html; charset=utf-8' );

$f = request_var('f', $f);
$t = request_var('t', $t);
$n = request_var('n', 1);

trace($login.': start. parameters are:<br />');

trace('f='.$f.'<br />');
trace('t='.$t.'<br />');
trace('n='.$n.'<br />');

function trace ($str)
{
   global $debug

   if ($debug)
   {
      echo $str;
      ob_end_flush(); flush(); ob_start();
   }
}

function request_var($var, $default)
{
   if(isset($_GET[$var])) return $_GET[$var];
   return $default;
}

function curl($url='', $post='', $referer='', $proxy='')
{
   global $debug;
   global $torIp, $torProxyPort;

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/10.10 forum bot');
   curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/bot_cookie.txt');
   curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/bot_cookie.txt');

   if(!empty($post))
   {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
   } else
   {
      curl_setopt($ch, CURLOPT_POST, 0);
   }
   if(!empty($referer))
   {
      curl_setopt($ch, CURLOPT_REFERER, $referer);
   } else
   {
      curl_setopt($ch,CURLOPT_REFERER, 1);
   }
   if(!empty($proxy))
   {
      curl_setopt($ch, CURLOPT_PROXY, $proxy);
   } else
   {
      curl_setopt($cl, CURLOPT_PROXY, $torIp.':'.$torProxyPort);
      curl_setopt($cl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
   }


   $ex=curl_exec($ch);

   curl_close($ch);

   return $ex;
}

// Логин
trace('login.<br />');

$x = curl($link.'ucp.php?mode=login');

preg_match('#[a-z0-9]{32}#i',$x, $sid);

curl($link.'ucp.php?mode=login', 'username='.$login.'&password='.$password.'&redirect=index.php&sid='.$sid[0].'&login=Вход');

// Отправка поста
for($i=0; $i<$n; $i++)
{
   trace('posting.<br />');

   $x = curl($link.'posting.php?mode=reply&f='.$f.'&t='.$t);

   preg_match('#[a-z0-9]{32}#i',$x, $sid);

   preg_match('/name="creation_time" value="(.*?)"/',$x, $creation_time);
   preg_match('/name="post" value="(.*?)"/',$x, $post);
   preg_match('/name="form_token" value="(.*?)"/',$x, $form_token);
   preg_match('/name="topic_cur_post_id" value="(.*?)"/',$x, $topic_cur_post_id);
   preg_match('/name="lastclick" value="(.*?)"/',$x, $lastclick);

   preg_match('/name="subject"(.*?)>/',$x, $xsubject);
   if(isset($xsubject[1]))
   {
      preg_match('/value="(.*?)"/',$xsubject[1], $ssubject);
      if(isset($ssubject[1])) $subject = $ssubject[1];
   }

   $p = array (
      'icon' => 0,
      'subject' => $subject,
      'addbbcode20' => 100,
      'message' => $message,
      'topic_cur_post_id' => $topic_cur_post_id[1],
      'lastclick' => $lastclick[1],
      'post' => $post[1],
      'attach_sig' => 'on',
      'creation_time' => $creation_time[1],
      'form_token' => $form_token[1],
      'fileupload' => '',
      'filecomment' => '',
   );
   curl($link.'posting.php?mode=reply&f='.$f.'&t='.$t, $p, $link.'posting.php?mode=reply&f='.$f.'&t='.$t);

   // Пауза между постами
   if(($i+1)<$n)
   {
      trace('sleep '.$time.' sec:');
      for($i=0;$i<$time;$i++)
      {
         trace(' '.($time-$i).' ... ');
         sleep(1);
      }
      trace('0.<br />');
   }
}

// Логаут
trace('logout.<br />');

curl($link.'ucp.php?mode=logout'.'&sid='.$sid[0]);

// Пауза между логинами
trace('sleep '.$time.' sec:');
for($i=0;$i<$time;$i++)
{
   trace(' '.($time-$i).' ... ');
   sleep(1);
}
trace('0.<br />');

trace($login.': stop.<br />');
?>

Вышеизложенное может использоваться для автоматизации размещения сообщений при интеграции форума phpbb3 с иными системами, в том числе автоматического управления, мониторинга и др.

Надеюсь, Вы не будете использовать приведенные примеры скриптов для разработки спам-ботов !
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Сб янв 05, 2013 16:25

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен class.phpBB.php v.1.0.1 : инструментарий разработчика ботов для phpBB3. Отлаживалось на phpBB v.3.0.11.
Методы:
  • login - вход
  • post - разместить сообщение
  • search - поиск сообщений и тем
  • search_topic - поиск сообщений в теме
  • remove - удаление сообщение
  • get - получение сообщения
  • replace - замена сообщения
  • mark - пометить форумы как прочтённые
  • logout - выход
Установка и прочее - примерно так же, как для PHP class b2yd.php, см. viewtopic.php?f=41&t=56

Этот инструментарий не для спамеров и форумных вредителей, а для автоматизации работы с сообщениями ! Автоматической регистрации нет и не будет ))
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Ср янв 16, 2013 12:54

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Новый релиз class.phpBB.php v.1.0.2 : улучшения, дополнения, устранение ошибок, добавлен метод topic (начать тему).

Новый релиз class.phpBB.php v.1.0.3 : рефакторинг.

Новый релиз class.phpBB.php v.1.0.4 : исправление и дополнение сортировки в search_topic, изменение и дополнение примеров.

Новый релиз class.phpBB.php v.1.0.4 : исправление и дополнение сортировки в search_topic, изменение и дополнение примеров.

Новый релиз class.phpBB.php v.1.0.5 :
  • исправление ошибок
  • дополнены public функции
  • добавлены методы
  • изменение работы с cookies - теперь не нужен файл...
  • дополнены и переработаны примеры
Список методов:
  • login - логин
  • logout - логаут
  • get - получение сообщения (например, для цитирования)
  • mark - пометить форумы как прочитанные
  • post - размещение сообщения
  • remove - удаление сообщения
  • replace - замена (редактирование) (своего) сообщения
  • search - поиск сообщений и тем (кроме поиска в теме и поиска пользователя)
  • search_topic - поиск сообщений в теме
  • search_user - поиск пользователя
  • send_email - отправить email
  • send_pm - отправить личное сообщение
  • topic - начать тему
Новый релиз class.phpBB.php v.1.0.6 :
  • исправление ошибок
  • дополнены public функции (анализ ошибки после post - search_class_error_text)
  • исправление ошибок в примере 2
  • для search_topic учтен мод First post on every page for phpBB3
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Вс янв 27, 2013 18:46

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Совет по разработке бота.

Если полученная html-страница в кодировке utf-8 содержит некорректные с точки зрения utf-8 символы, высока вероятность, чтоб например, функция php preg_match_all работать не будет. Некорректные символы надо удалить. Ниже пример скрипта, используемого в phpBB.class.php. Здесь он приведен по той причине, что найденный в сети прототип содержал ошибки. Так, смесь из utf-8 и cp1251 на html-странице оставалась некорректной.
Код: Выделить всё
   // Удалить некорректные символы utf-8
   //
   // Символы, не попадающие под правила кодирования, по умолчанию заменяются пробелами.
   // Хотя, может, лучше их вообще удалять, как пытался сделать автор прототипа,
   // за это отвечает параметр $remove_bad (если true).
   //
   // Предполагается, что "побился" не ведущий байт, а какие-то после него (их больше,
   // следовательно, вероятность выше). Но при этом есть возможность потерять
   // полезные символы, если, например, в строку utf-8 воткнули кусок в кодировке cp1251.
   // (такое бывает, если, например, в html-страницу некорректно вставлен код).
   //
   // Прототип - см. http://phpclub.ru/talk/threads/iconv-и-битый-utf-8.24038/
   // По ссылке код, разумеется, с ошибками, то есть не проверен.
   // Зачем на непроверенный код надо было ставить копирайт, мне не понятно:
   // " (C) SiMM, based on http://ru.wikipedia.org/wiki/Unicode "
   // Ссылка на Википедию на самом деле такая: http://ru.wikipedia.org/wiki/UTF-8
   function remove_bad_utf8($str, $remove_bad = false)
   {
      $ret = '';
      for($i=0; $i<strlen($str); )
      {
         $char = $str{$i++};
         $code = ord($char);
         if($code > 0x7F)
         {
            if    ($code < 0xC0) continue;
            elseif($code < 0xE0) $nbytes = 1;
            elseif($code < 0xF0) $nbytes = 2;
            elseif($code < 0xF8) $nbytes = 3;
            elseif($code < 0xFC) $nbytes = 4;
            elseif($code < 0xFE) $nbytes = 5;
            else                 continue;
            while($nbytes)
            {
               $nbytes--;
               $char .= $code = $str{$i++};
               $code = ord($code);
               if(($code < 0x80) || ($code > 0xBF))
               {
                  $i += $nbytes;
                  if($remove_bad) continue 2;
                  $char = ' ';
                  break;
               }
            }
         }
         $ret .= $char;
      }
      return $ret;
   }
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Вс янв 27, 2013 18:58

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Ещё совет - скорее, по защите от ботов.

Мало какие боты "понимают" javascript. Ведь они обычно используют curl. Поэтому можно легко перекрыть им путь, используя, например, метод Антибот 100500. Начиная с версии 1.0.5 phpBB.class.php автоматически распознаёт эту примитивную уловку. Тем не менее, для защиты не составляет труда сделать свой собственный хук (как в антиботе) и усложнить алгоритм, в том числе, модифицируя его в зависимости от времени и т.п.
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Чт мар 07, 2013 16:36

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Тема очищена от неактуальных сообщений и прочего. Файлы устаревших версий удалены.

Новый релиз class.phpBB.php v.1.0.7 :
  • исправление ошибок
  • добавлен анализ перенаправления через ответ сервера 302 location
  • добавлен анализ мода добавления url на профиль пользователя в quote
  • добавлен анализ наличия welcome как лишней ссылки на профиль в search
  • добавлена возможность получения html сообщения (см. get())
  • добавлена возможность скрытого входа при login()
  • добавлены методы: search_logged, search_unread, report
  • добавлен пример реализации цензора мата
Скачать (примеры использования в архиве):
phpBB_v_1_0_7.zip
Скачать с Яндекс Диска : phpBB_v_1_0_7.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич

Re: Бот форума phpbb3 - автоматизация размещения сообщений

Сообщение Serg » Вс мар 17, 2013 17:16

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Новый релиз class.phpBB.php v.1.0.8 : исправления в antimat.php.
Скачать (примеры использования в архиве; читайте readme.txt):
phpBB_v_1_0_8.zip
Скачать с Яндекс Диска : phpBB_v_1_0_8.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Serg
Администратор
 
Сообщения: 88
Зарегистрирован: Ср янв 14, 2009 13:50
Имя: Сергей Юрьевич


Вернуться в Скрипты

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

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