Автоматическое определение движка форума
Решил поделиться очередной своей наработкой – набором скриптов на Perl для определения движка форума. Эту заметку можно считать дополнением к посту Определение CMS средствами Perl.
Начнем сразу с кода основного скрипта:
#!/usr/bin/perl
# which-forum.pl script
# (c) 2010 Alexandr 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 апдейта), так что лучше не тратить тут время, если только вас не интересуют переходы.
Понятно, что названное применение скриптов далеко не единственное. Думаю, вы легко придумаете, как еще можно их использовать.