]> git.street.me.uk Git - andy/viking.git/blame - tools/gcget-perl
Add a 'home' default location preference.
[andy/viking.git] / tools / gcget-perl
CommitLineData
71fe616d
EB
1#!/usr/bin/perl
2#
3# gcget 34.25,-118.25 100 > yeah.loc
4# ./gcget "Johnstown,CA" 10|gc2gpspoint - -|viking -
5#
6# have to make viking-remote allow multiple points. maybe just regular input + maps ?
7
8$USERNAME="username";
9$PASSWORD="password";
10
11$what = $ARGV[0];
12if (!$what) {
13 print "Nothing to do!\nUsage: gcget zip/lat,lon/lat.mm.mmm,lon.mm.mmm/address [max]";
14 exit(0);
15}
16
17
18$zip = $lat = $lon = "";
19if ( $what =~ /^(-?[0-9]{0,3}(\.[0-9]{0,9})?),(-?[0-9]{0,3}(\.[0-9]{0,9})?)$/ ) {
20 ($lat,$lon) = ($1,$3);
21} elsif ( $what =~ /^(-?[0-9]{1,3})\.([0-9]{1,2}\.[0-9]{0,3}),(-?[0-9]{1,3})\.([0-9]{1,2}\.[0-9]{0,3})$/ ) {
22 $lat = $1 + ($1 < 0 ? -1 : 1) * $2 / 60;
23 $lon = $3 + ($3 < 0 ? -1 : 1) * $4 / 60;
24} elsif ( $what =~ /^[0-9]{5}$/ ) {
25 $zip = $what;
26} else {
27 $address = `gpsaddress.pl "$what"`;
28 if (not (($address) and $address =~ /^(-?[0-9]{1,3}(\.[0-9]{1,9})?) (-?[0-9]{1,3}(\.[0-9]{1,9})?)$/ )) {
29 die "gpsaddress failed looking up address '$what'\n"
30 } else {
31 ($lat,$lon) = ($1,$3);
32 }
33}
34
35# turn on perl's safety features
36use warnings;
37use WWW::Mechanize;
38use HTML::TableContentParser;
39$browser = WWW::Mechanize->new();
40
41$browser->get("http://www.geocaching.com/seek/");
42$browser->follow("log in");
43print STDERR $browser->title() . "\n";
44$browser->form_number(1);
45$browser->field("myUsername", $USERNAME);
46$browser->field("myPassword", $PASSWORD);
47$browser->click();
48print STDERR $browser->title() . "\n\n";
49
50if ( $zip ) {
51 $browser->form(1);
52 $browser->field("zip", $zip);
53} else {
54 $browser->form(6);
55 $browser->field("origin_lat", $lat);
56 $browser->field("origin_long", $lon);
57}
58$browser->click();
59
60$gcsdone = 0;
61$maxgcs = $ARGV[1] ? $ARGV[1] : 1000000;
62
63print STDERR "\nPages: ";
64
65print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<loc version=\"1.0\" src=\"Groundspeak\">\n";
66
67
68while ( $gcsdone < $maxgcs ) {
69
70$p = HTML::TableContentParser->new();
71$tables = $p->parse($browser->content());
72
73$t = ${$tables}[10];
74@rows = @{$t->{rows}};
75$r = $rows[8];
76
77@cs = @{$r->{cells}};
78
79$browser->form_number(1);
80
81for ( $i = 0; $i < 20; $i++ ) {
82 $r = $rows[4+(2*$i)];
83 @cs = @{$r->{cells}};
84 if ( $gcsdone < $maxgcs && (! $cs[1]->{data}) ) {
85 if ( $cs[7]->{data} =~ /name='CID' value='(.*)'>/ ) {
86 $browser->tick("CID", $1);
87 $gcsdone++;
88 }
89 }
90}
91
92$browser->click("Download");
93@lines = split "\n", $browser->content();
94shift @lines; shift @lines; pop @lines;
95print join "\n", @lines;
96print "</waypoint>\n";
97
98$browser->back();
99$form = $browser->form_name("Form1");
100$nextlink = $browser->find_link( text => "Next" );
101if ( $nextlink ) {
102 if ( ($nextlink->url()) =~ /_ctl([0-9]+)/ ) {
103 $form->push_input("hidden", {"name" => "ResultsPager:_ctl$1", value => ""});
104 } else {
105 print STDERR "\n\nERROR\n\n";
106 print "</loc>\n";
107 exit(0);
108 }
109} else {
110 print STDERR "\n\nDONE\n\n";
111 print "</loc>\n";
112 exit(0);
113}
114$browser->submit();
115
116print STDERR "i";
117
118}
119
120print STDERR "\n\nREACHED MAX\n\n";
121print "</loc>\n";
122