#!/usr/bin/perl use HTML::Parser; use LWP::Simple; my $onesaturl = "http://www.heavens-above.com/PassSummary.asp"; my $allsatsurl = "http://www.heavens-above.com/allsats.asp"; my %locations = ( "Troy (EST)" => "lat=42.728&lng=-73.692&alt=0&loc=Troy&TZ=EST", "SJC (PST)" => "lat=37.339&lng=-121.894&alt=0&loc=San+Jose&TZ=PST" ); my %satellites = ( ISS => "&satid=25544", Mir => "", "STS-98" => "&satid=26698" ); print "Satellite Pass Info for " . (join ', ', sort keys %satellites) . ",and all >3.5 objects.\n"; print "(updated " . scalar(localtime) . " from www.heavens-above.com)\n\n"; my $p = HTML::Parser->new(api_version => 3, start_h => [\&start, "tagname, attr"], text_h => [\&text, "dtext"], end_h => [\&end, "tagname"], unbroken_text => 1); my $state; my ($row, $location, $satellite); $^L = ""; $- = 0; foreach $location (keys %locations) { # get all the selected satellites foreach $satellite (keys %satellites) { my $url = "$onesaturl?$locations{$location}$satellites{$satellite}\n"; $state = {}; $p->parse(get($url)); foreach $row (@{$state->{table}}) { next unless $row->[0] =~ /\S/; unshift @{$row}, $satellite; write; last; } } # also get all the bright (<= Mag 3.5) satellites my $url = "$allsatsurl?$locations{$location}&Mag=3.5"; $state = {}; $p->parse(get($url)); foreach $row (@{$state->{table}}) { next unless $row->[0] =~ /\S/; # need to add date in (it's missing) my $satellite = shift @{$row}; unshift @{$row}, ""; # should be the date, but i'll omit it for now. # (need to infer it based on time, which is # a pain) unshift @{$row}, $satellite; write; } } sub start { my ($tagname, $attr) = @_; $state->{in}{$tagname} = 1; if ($tagname eq "table" && $attr->{border}) { $state->{interesting} = 1; } if ($tagname eq "table") { $state->{rownum} = 0; } if ($tagname eq "tr") { $state->{colnum} = -1; $state->{rownum}++; } if ($tagname eq "td") { $state->{colnum}++; } } sub end { my ($tagname) = @_; if ($tagname eq "table" && $state->{interesting}) { $state->{interesting} = 0; } $state->{in}{$tagname} = 0; } sub text { my ($text) = @_; return unless $state->{interesting}; if ($state->{in}{td}) { $text =~ s/\n//g; $text =~ s/^\s*//g; $text =~ s/\s*$//g; $text =~ s/°//g; if ($state->{colnum} >= 0) { $state->{table}[$state->{rownum}][$state->{colnum}] .= $text; } } } format STDOUT_TOP = +-- Start --+ +--- Max ---+ +--- End ---+ Loc Sat. Date Mag Time Alt Az Time Alt Az Time Alt Az ---------- ---------- ------ ---- ----- --- --- ----- --- --- ----- --- --- . format STDOUT = @<<<<<<<<< @<<<<<<<<< @<<<<< @>>> @<<<< @<< @<< @<<<< @<< @<< @<<<< @<< @<< $location,@{$row} .