← На главную

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

Решил поделиться очередной своей наработкой – набором скриптов на 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 апдейта), так что лучше не тратить тут время, если только вас не интересуют переходы.

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