summaryrefslogtreecommitdiff
path: root/bin/efa
blob: d39beebc8e2fe46c162759ba96cd22407900b7f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env perl
## Copyright © 2009 by Daniel Friesel <derf@derf.homelinux.org>
## License: WTFPL <http://sam.zoy.org/wtfpl>
use strict;
use warnings;
use encoding 'utf8';
use Getopt::Long;
use WWW::Mechanize;

my $firsturl = 'http://efa.vrr.de/vrr/XSLT_TRIP_REQUEST2?language=de&itdLPxx_transpCompany=vrr';
my $posturl = 'http://efa.vrr.de/vrr/XSLT_TRIP_REQUEST2';

my $content;
my %post;
my $www = WWW::Mechanize->new(
	autocheck => 1,
);
my $offer = 0;
my $i = 0;
my $raw;
my $cons;
my $groupsize = 8;
my $offset;
my @from;
my @to;
my $time;
my $date;
my $debug = 0;

$post{type_origin} = 'stop';
$post{type_destination} = 'stop';

GetOptions(
	'from=s{2}' => \@from,
	'to=s{2}'   => \@to,
	'time=s'    => \$time,
	'date=s'    => \$date,
	'debug'     => \$debug,
);

@post{'place_origin','name_origin'} = @from;
@post{'place_destination','name_destination'} = @to;

if ($time) {
	@post{'itdTimeHour','itdTimeMinute'} = split(/:/, $time);
}
if ($date) {
	@post{'itdDateDay','itdDateMonth','itdDateYear'} = split(/\./, $date);
}

$www->get($firsturl);
$www->submit_form(
	form_name => 'jp',
	fields => \%post,
);

$content = $www->content;

foreach(split(/<span class="labelTextBold"> \d+\. Fahrt<\/span>/, $content)) {
	unless ($offer) {
		$offer++;
		next;
	}
	foreach(split(/\n/)) {
		if (/<span class="labelText">(?<content>[^<]+)<\/span>/) {
			# Ignore "ca. 3 Minuten" and similar
			# something like /^ca\. \d+ Minute/ does not work here, for some reason
			# (probably related to encoding fuckup)
			if ($+{content} !~ /^ca.*Minute/) {
				push(@{$raw->[$offer-1]}, $+{content});
			}
		}
	}
	$offer++;
}

if ($debug) {
	print STDERR "custom post values used in query:\n";
	foreach(keys(%post)) {
		print STDERR "    $_ => $post{$_}\n";
	}
	print STDERR "\nraw response:\n";
	foreach(@$raw) {
		print STDERR "---\n";
		foreach(@$_) {
			print STDERR "$_\n";
		}
	}
}

for ($offer = 0; exists($raw->[$offer]); $offer++) {
	for ($i = 0; @{$raw->[$offer]} >= (($i+1) * $groupsize); $i++) {
		$offset = $i * $groupsize;
		# skip "Fußweg: x Minuten" messages (they're smaller than $groupsize)
		if ($raw->[$offer]->[$offset+2] =~ /ca.*Minute/) {
			splice(@$_, $offset, 5);
		}
		$cons->[$offer]->[$i] = {
			deptime  => $raw->[$offer]->[$offset],
			dep      => $raw->[$offer]->[$offset+1],
			depstop  => $raw->[$offer]->[$offset+2],
			deptrain => $raw->[$offer]->[$offset+3],
			depdest  => $raw->[$offer]->[$offset+7],
			arrtime  => $raw->[$offer]->[$offset+4],
			arr      => $raw->[$offer]->[$offset+5],
			arrstop  => $raw->[$offer]->[$offset+6],
		};
	}
}

foreach (@$cons) {
	foreach (@$_) {
		printf(
			"%-5s %-2s %-30s %-20s %s\n%-5s %-2s %-30s\n\n",
			$_->{deptime}, $_->{dep}, $_->{depstop}, $_->{deptrain},
			$_->{depdest}, $_->{arrtime}, $_->{arr}, $_->{arrstop}
		);
	}
	print "------\n\n";
}