Termine in's Auto

Termine in’s Auto

Ein ganz großes Ärgernis meines Studiums an der FOM ist die schlechte Vorausplanbarkeit. Die Termine für die Vorlesungen, werden zwar zum Semesteranfang festgelegt und bekannt gegeben, die Räume aber werden oft erst spät bekannt gegeben und dann auch oft noch mehrmals bis kurz vor der Vorlesung geändert.

Das wäre weiter nicht schlimm, wenn es sich um Räume im gleichen Gebäude handeln würde, dummerweise entscheidet sich damit aber auch, ob die Vorlesung z. B. im Norden oder im Süden von München stattfindet…

Leider ist die Webseite der FOM, auf der man seine Termine abrufen kann nur über einen Web-Login mit schnell ablaufendem Cookie realisiert, sodass der schnelle Zugriff mit dem iPhone auf der Fahrt leider auch keine Option ist. Zum Glück gibt es genug langweilige hochinteressante Vorlesungen, in denen man nebenher etwas basteln kann.

Das folgende Skript logt sich mit meinem Usernamen und Passwort im Intranet der FOM ein und lädt dort die Liste der anstehenden Termine und Räume herunter und stellt diese als RSS-Feed zur Verfügung. Da mein Auto über einen Connected Drive Internetzugang verfügt, kann ich den RSS-Feed so direkt in mein Autocockpit einbinden. Was ich daran am erstaunlichsten finde: Es funktioniert sogar :-)

Hier sieht man nicht nur, dass ich dringend mal wieder den Innenraum putzen sollte, sondern zudem die nächste Vorlesung samt Raumbelegung. (Das fehlende Leerzeichen ist inzwischen gefixt)

So kann ich direkt im Display meines Autos nachlesen, wo und wann genau die nächste Vorlesung stattfindet. Das Skript ist zwar immer noch im Zustand “grausiger Hack”, aber nachdem es jetzt schon 1,5 Jahre unverändert ist und hervorragend funktioniert: Falls es jemand brauchen kann, bedient euch:

#!/usr/bin/perl
use strict;
use warnings;
use XML::RSS;
use FindBin '$RealBin';
use YAML::Syck;
use Hoeni::FOM;


my $config = LoadFile("$RealBin/../fom2rss.yml") || die "No config file found";
my $rss = new XML::RSS(version => '2.0', encoding => 'ISO-8859-15');
my $fom = new Hoeni::FOM;
$fom->login(user => $config->{user}, pass => $config->{pass});

$rss->channel(title => 'BWI07 Vorlesungen', ttl => 1);
foreach ($fom->get_lectures()) {
    my $title = sprintf('%s', $_->start->day_abbr);
    if ($_->end) {    # start, end
        $title .= sprintf(
                          " %d:%02d - %d:%02d",
                          $_->start->hour, $_->start->minute,
                          $_->end->hour,   $_->end->minute
        );
    } elsif ($_->start->hour != 0) {    # start only
        $title .= sprintf(" %d:%02d", $_->start->hour, $_->start->minute);
    } else {                            # no start, no end
        $title .= sprintf(" %s", $_->alternative_time);
    }

    if ($_->room) {
        $title .= sprintf(" (%s)", $_->room);
    }

    $rss->add_item(
                   title => $title,                   description =>
                     sprintf("<em>%s</em>\n<br/>%s", $_->title, $_->room_info),
    );
}

print "Content-Type: text/xml\n\n" . $rss->as_string;

In diesem Kernstück lässt sich auch einfach die Ausgabe des RSS-Feeds an eigene Wünsche anpassen, das Pagescraping der FOM ist im lib/ Verzeichnis zu finden. Das Skript ist in Perl geschrieben und benötigt XML::RSS, YAML::Syck, Moose, HTML::TreeBuilder::XPath und WWW::Mechanize (man sieht, es sollte mal was Richtiges werden). Einfach den Tarball auspacken, in der fom2rss.yml Datei Username und Passwort eintragen und dafür sorgen, dass .rss als CGI ausgeführt werden kann. Bei Fragen fragen! :-)

© 2024 Tobias Henöckl