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