En stund nå har jeg vært nødt til å forholde meg til
Fronter, en nettløsning
Osloskolen bruker for kontakt mellom hjem og skole. Løsningen
imponerer ikke, og det er lagt opp til at vi foreldre skal logge inn
regelmessig for å se om noe har endret seg. Idéen om å la folk stikke
innom nettsider for å se om det har skjedd endringer er så idiotisk at
jeg har lett etter et alternativ. Fronterløsningen har en innebygget
løsning der en kan abonnere på forsiden (som viser en oppsummering av
det en har tilgang til), og få tilsendt en kopi hver natt, men det
fjerner jo bare behovet for å stikke innom, ikke den idiotiske ideen
om at folk skal huske hvordan nettsiden så ut sist og oppdage hva som
er endret.
For å gjøre livet enklere har jeg derfor brukt litt tid på å lage
et program som kobler seg opp og sjekker etter endringer automatisk,
slik at jeg kan få beskjed fra datamaskinen når noe endrer seg i
stedet for å forsøke å finne ut av det selv. I går ble scriptet
brukbart, og jeg er dermed klar til å dele det med deg.
Jeg startet med å skrive programmet i Python, og hadde en versjon
som logget inn og hentet ned enkeltsider fra Fronter. Men
Fronter-websidene suger golfballer gjennom en hageslange, med
uleselig HTML, flere nivåer av iframes og en struktur på innholdet som
er svært vanskelig å finne ut av, så jeg ga til slutt opp lxml-parsing
med Python og forsøkte meg med WWW::Mechanize for Perl som jeg kjente
fra før. I ettertid har jeg oppdaget at WWW:Mechanize også finnes for
Python, så jeg kunne antagelig droppet språkbyttet. Men da jeg
oppdaget det hadde jeg kommet så langt med Perl-utgaven, så jeg hoppet
ikke tilbake.
For å logge inn i Fronter besøker en enten skolens websider eller
den sentrale innloggingsiden https://fronter.com/osloskoler/.
Perl-koden for å logge inn ser slik ut:
my $mech = WWW::Mechanize->new();
$mech->get('https://fronter.com/osloskoler/');
$mech->submit_form(fields => {
username => $username,
password => $password,
} );
Neste steg er å få oversikt over hvilke «rom» en har tilgang til.
På vår skole er det rom for skolen, biblioteket, elevrådet,
aktivitetsskolen og klasser der en har unger, og dette vil være
forskjellig fra person til person. Etter å ha romstert rundt i
Fronter-grensesnittet endel kom jeg over en grei HTML-side med
oversikt over rommene,
https://fronter.com/osloskoler/adm/projects.phtml?mode=displayRoomchooser,
så jeg bruker denne til å hente ut romoversikt med rom-ID.
my %room;
$mech->get('https://fronter.com/osloskoler/adm/projects.phtml?mode=displayRoomchooser');
for my $link ($mech->links()) {
my $url = $link->url();
if ($url =~ m%/links/list_files.phtml\?edit=(\d+)$%) {
$room{$link->text()} = $1;
}
}
Når en har rom-ID kan en slå opp websiden for rommet, som starter
på
https://fronter.com/osloskoler/contentframeset.phtml?goto_prjid=$ROMID
(der $ROMID byttes ut med rom-ID-tallet). Det gir en side med
iframes, og en må tre nivåer ned i iframes før en får tak i
HTML-informasjonen som vises frem når en ser på det aktuelle rommet.
Her ga jeg opp den robuste parsingen og hardkodet endel URL-er som i
stedet bør spores opp maskinelt. HTML-informasjonen som vises lagres
i en fil etter at økt- og innloggings-nøkkel er fjernet og deretter
bruker jeg lynx --dump --nolist for å hente ut en tekstlig
utgave av websiden. Denne tekstlige utgaven sammenlignes med forrige
versjon og oversikt over endringer kan så sendes ut på egnet vis.
Jeg valgte å bruke git til å holde rede på endringer, så jeg
sjekker inn HTML og tekst-utgaver i git og bruker git til å vise frem
endringene i tekstutgavene. Programvaren for å gjøre dette er testet
på Debian GNU/Linux og kan
lastes
ned fra github.
For å bruke dette selv, kjør følgende kommandoer på din
Debian-maskin (forutsetter sudo-tilgang for installasjon av
programvare):
sudo apt-get install git lynx-cur libio-prompter-perl libwww-mechanize-perl \
libconfig-inifiles-perl
git clone https://github.com/petterreinholdtsen/fronter-scraper-oslo
cd fronter-scraper-oslo
./update-git
Det gjenstår endel, men systemet er allerede nyttig for meg. Jeg
ønsker at systemet også skal laste ned PDF-er og slikt som er lagt ut
for nedlasting på sidene, slik at f.eks. ukeplaner kommer inn i
git-arkivet mitt automatisk og jeg får automatisk beskjed når ny
ukeplan er lagt ut. Kanskje du kan bidra med å få det på plass, eller
kanskje du har andre ting du vil fikse? Jeg tar gjerne imot endringer
og forbedringer. Det er mye som kan gjøres bedre, og scriptet er ikke
veldig robust mot endringer hos nettsidene til Fronter. Jeg regner
dermed med at det vil trengs oppdateringer jevnlig etter hvert som
Fronter-løsningen endrer seg.