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.