Участник:Ignatus/Скрипт для подсчёта статистики активности в категории
Перейти к навигации
Перейти к поиску
Скрипт собирает информацию об участниках, внёсших вклад на портале (в некоторых категориях). Функцию &crawlcat
с тем же списком исключений можно вызвать несколько раз для статистики по нескольким категориям. Внимание: в разветвлённой категории работа алгоритма может занять несколько часов.
Финальная сортировка немного не допилена, но сам список вроде правильный
use MediaWiki::Bot;
$b= MediaWiki::Bot->new({
useragent => 'MediaWiki::Bot/3.1.6 (User:Ignatus)',
protocol=>'http',
qw/host ru.wikipedia.org path w/,
login_data=>{qw'username Логин password Пароль'}
});
@igl = split(', ',q/Аккумуляторы, Двигатели, Авиационные двигатели, Автомобильные двигатели, Судовые двигатели, Нефть и газ, Энергия, Огонь, Ракетное топливо, Моторное топливо, Энергосберегающие технологии компонентов ПК, Пища, Транспортные средства с ядерной энергетической установкой/);
@igl{map{"Категория:$_"}@igl} = (0) x scalar @igl;
sub catout{local $_=$_;#s/[\x{00ab}\x{00bb}]/"/g; #при use encoding 'cp866' под"о заменяет "л", а не кавычки
print " " x (5-$_[1]), $_, "\n"
};
sub crawlcat($$$;&\%){my ($b,$c,$d,$f,$ign)=splice @_;
$ign->{$c}=$d;# Себя больше не рассматриваем
my @pages = $b->get_pages_in_category($c);
foreach (@pages){
unless(exists $ign->{$_}){# Если в игноре нет, то
$f->($_,$d) if $f; # делаем что-то
if($d>0 and /^Категория:/){# и спускаемся, если можно
&crawlcat($b,$_,int($d)-1,$f,$ign)
}else{$ign->{$_}=$d}# а если нельзя, всё равно в игнор
}
};
};
sub queryeditors{
my @h = $b->get_history($_,20);
&catout;
foreach(@h){$conters{$_->{user}}{substr($_->{timestamp_date},0,4)}++ unless $_->{minor}}
};
crawlcat($b,"Категория:Энергетика",5,\&queryeditors,%igl);
open F,'>:utf8','D:\\editors.txt';#файл результатов
print F '{| class="standard sortable"
|-
!Участник||2004||2005||2006||2007||2008||2009||2010||2011||н.2012||всего';
sub hsum(\%){my $h=shift;my $e=0;foreach(keys %$h){$e+=$h->{$_}};return $e}
my %top;
foreach my $u(keys %conters){
my ($f,$s,$t);
if( ($t=hsum(%{$conters{$u}}))>60
or ($s=($conters{$u}{2011}//0)+($conters{$u}{2012}//0))>10 ){
$f="\n|-\n|{{User|$u}}";
for(2004..2012){$f.="||".($conters{$u}{$_}//0)};$f.="||$t";
$top{$f}=$s
}
};
print F ((sort{$top{$b}<=>$top{$a}}keys %top),"\n|}"); close F;
Результат работы скрипта: Портал:Энергетика/Статистика вклада