Автоматическое определение движка форума

20 сентября 2010

Решил поделиться очередной своей наработкой — набором скриптов на Perl для определения движка форума. Эту заметку можно считать дополнением к посту Определение CMS средствами Perl.

Начнем сразу с кода основного скрипта:

#!/usr/bin/perl

# which-forum.pl script
# (c) 2010 Alexandr A Alexeev, http://eax.me/

use strict;

# закомментированные строки - для строгости
# если задача - собрать статистику движков, оставить как есть
# если составить список форумов - раскомментировать

my $data;
$data .= $_ while(<>);

# проверить, сколько было Powered by phpBB без ссылки в подвале
print "phpbb\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?phpbb\.com\/?"[^>]*>phpBB/i or
#     $data =~ /viewforum\.php\?[^'"]*f=\d+/i or
     $data =~ /phpBB\-SEO/i or
     $data =~ /<link rel="copyright" href="(?:http:\/\/)?phpBB\.com"/i);
print "ipb\n"
  if($data =~ /<a[^>]+href='[^']*http:\/\/(?:www\.)?invision(?:board|power)\.com\/?[^']*'[^>]*>[^<]*IP\.Board/i or
     $data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?invisionboard\.com\/?"[^>]*>Invision Power Board/i or
     $data =~ /<div id=["']{0,1}ipbwrapper["']{0,1}>/i or
     $data =~ /index\.php\?[^'"]*showforum=\d+/i);
print "vbulletin\n"
  if($data =~ /Powered by:?[^<]+vBulletin[^<]+(?:Version)?/i or
     $data =~ /<meta name="generator" content="vBulletin/i or
     $data =~ /forumdisplay\.php\?[^'"]*f=\d+/i);
print "smf\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?simplemachines\.org\/?"[^>]*>Powered by SMF/i or
     $data =~ /index\.php\?[^'"]*board=\d+\.0/i);
print "punbb\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:(?:www\.)?punbb\.org|punbb\.informer\.com)\/?"[^>]*>PunBB/i); #or
#     $data =~ /viewforum\.php\?[^'"]*id=\d+/i);
print "fluxbb\n"
#  if($data =~ /viewtopic\.php\?id=\d+/i or
    if( $data =~ /<a[^>]+href="http:\/\/(?:www\.)fluxbb\.org\/?"[^>]*>FluxBB/i);
print "exbb\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?exbb\.org\/?"[^>]*>ExBB/i); # or
#     $data =~ /forums\.php\?[^'"]*forum=\d+/i);
print "yabb\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?yabbforum\.com\/?"[^>]*>YaBB/i or
     $data =~ /YaBB\.pl\?[^'"]*num=\d+/i);
print "dleforum\n"
  if($data =~ /\(Powered By DLE Forum\)<\/title>/i or
     $data =~ /<a[^>]+href="[^"]+(?:http:\/\/(?:www\.)?dle\-files\.ru|act=copyright)[^"]*">DLE Forum<\/a>/i);
print "ikonboard\n"
  if($data =~ /<a[^>]+href="[^"]*http:\/\/(?:www\.)?ikonboard\.com\/?[^"]*"[^>]*>Ikonboard/i or
     $data =~ /<meta name="GENERATOR" content="Ikonboard/i or
     $data =~ /ikonboard\.cgi/i);
print "bbpress\n"
  if($data =~ /<meta name="generator" content="bbPress/i); # or
#     $data =~ /topic\.php\?id=\d+/i or
#     $data =~ /forum\.php\?id=\d+/i);
print "flashbb\n"
#  if($data =~ /forums\.php\?fid=\d+/i or
#     $data =~ /topic\.php\?fid=\d+/i or
     if($data =~ /<a[^>]+href="http:\/\/(?:www\.)?flashbb\.net\/?"[^>]*>FlashBB/i);
print "stokesit\n"
#  if($data =~ /forum\.php\?f=\d+/i or
     if($data =~ /<a[^>]+href="http:\/\/(?:www\.)?stokesit\.com\.au\/?"[^>]*>[^\/]*Stokes IT/i);
print "podium\n"
#  if($data =~ /topic\.php\?t=\d+/i or
     if($data =~ /<a[^>]+href=['"]?http:\/\/(?:www\.)?sopebox\.com\/?['"]?[^>]*>Podium/i);
print "usebb\n"
#  if($data =~ /forum\.php\?id=\d+/i or
     if($data =~ /<a[^>]+href="http:\/\/(?:www\.)?usebb\.net\/?"[^>]*>UseBB/i);
print "wrforum\n"
#  if($data =~ /index\.php\?fid=\d+/i or
     if($data =~ /<a[^>]+href="http:\/\/(?:www\.)?wr\-script\.ru\/?"[^>]*>WR\-Forum/i);
print "yetanotherforumnet\n"
  if($data =~ /Yet Another Forum\.net/i or
     $data =~ /default\.aspx\?g=posts&t=\d+/i);

Этот и другие скрипты, упомянутые в посте, вы найдете в этом архиве.

Скрипт which-forum.pl изучает код html-страницы на предмет наличия в нем сигнатур форумного движка. Аналогичный прием мы использовали при определении WordPress и Joomla, но есть пара отличий. Во-первых, сам скрипт не загружает код страницы, а читает его из stdin или файла, переданного в качестве аргумента. Это позволяет загрузить страницу один раз, к примеру, с помощью wget, а затем прогнать ее через несколько анализаторов, если у нас их не один. Во-вторых, в данном скрипте наличие сигнатуры является 100% признаком движка. В прошлый раз наличие сигнатуры лишь придавало веса соответствующему движку и «выигрывал» движок с наибольшим весом. Я решил, что в данном случае такой подход лишь напрасно усложнит код.

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

Для получения списка форумов я воспользовался своим парсером Google. Поисковой системе посылались запросы типа

site:forum.*.ru
site:talk.*.ru
site:board.*.ru
site:smf.*.ru
site:phpbb.*.ru
....

и так далее. Полный код генератора запросов вы найдете в файле gen-forumsearch-urls.pl. Помимо зоны .ru также использовались .su .ua .kz и .by. В прошлый раз провести такое исследование было затруднительно, поскольку сайты на WordPress и Joomla не имеют подобных сигнатур в URL. Каталоги типа cmsmagazine.ru/catalogue/ не обеспечивают достаточного объема выборки. Что такое 600 сайтов на Drupal?

Надо признать, результаты эксперимента меня огорчили. Из 12590 исследуемых сайтов только на 7083 движок был определен успешно, то есть лишь в 56% случаев. Может быть, я не учел какой-нибудь движок? Неужто на половине форумов стоял Bitrix? Или мне стояло больше времени уделить поиску сигнатур? В общем, тут требуются дополнительные исследования.

Среди 56% успешно опознанных движков самыми популярными, как и следовало ожидать, оказались IPB (31%), phpBB (26,6%) и vBulletin (26,5%)

Статистика использования форумов

За ними с большим отставанием следуют SMF (5,8%) и DLEForum (5,3%). Мой любимый punBB оказался лишь на 6-м месте (1,64%). Я не советовал бы сильно доверять этим цифрам (мол, каждый третий форум в рунете работает на IPB), но определенные выводы сделать, конечно, можно.

Например, если вы намерены делать сайт на форумном движке и планируете модифицировать форум, скажем, платить пользователям по 0.01$ за каждое сообщение с автоматическим выводом средств раз в неделю, то вам следует выбрать один из трех наиболее популярных движков. Чем популярнее форум, тем больше шансов найти программиста, который хорошо в нем разбирается.

Если же существенных изменений в движке не предвидится, то возможно имеет смысл выбрать не самый популярный движок, например SMF или punBB. Этим вы уменьшите число хакерских атак на свой форум и количество автоматически рассылаемого на нем спама.

Скриптам для поиска/определения форумов также можно найти не одно практическое применение. Первое, что пришло лично мне в голову — это отсортировать по тИЦ опознанные форумы и разместить на первой сотне посты с ссылками на один из своих сайтов. Однако сотня форумных dofolllow-ссылок никак не повлияла на тИЦ (прошло 2 апдейта), так что лучше не тратить тут время, если только вас не интересуют переходы.

Понятно, что названное применение скриптов далеко не единственное. Думаю, вы легко придумаете, как еще можно их использовать.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.