1  use LWP::Simple;
2  use CGI;
3  use CGI::Carp qw(fatalsToBrowser);
4  use Text::CSV_XS;
5  use Business::UPS;
6  
7  my $q = new CGI;
8  my $fedex_url = "http://www.fedex.com/cgi-bin/tracking?action=track&initial=x";
9  my $language="english";
10  my $country_code = "us";
11  my $order_num = $q->param('order_num');
12  my $csv_file = "C:\\InetPub\\wwwroot\\cgi-bin\\tracker.csv";
13  my $return_code,$message,$date,$time,$note;
14  
15  print $q->header;
16  print qq(<html><body>);
17  
18  if ($order_num) {
19  	my ($track_type,$track_num) = &get_tracking_num($order_num);
20  	if (!$track_num) {
21  		print qq(Invalid order number<BR>);
22  	} else {
23  		if ($track_type eq 'fedex') {
24  			($return_code,$message,$date,$time,$note) = &parse_fedex_html($track_num);
25  		} elsif ($track_type eq 'ups') {
26  			($return_code,$message,$note) = &parse_ups_data($track_num);
27  		}
28  	
29  		if ($return_code == 0) {
30  			print qq(Invalid tracking number<BR>);
31  		} else {
32  			print "Last updated: $date, $time<BR>" if $date && $time;
33  			print "Package was last scanned in: $message $note\n";
34  		}
35  	}
36  }
37  
38  &print_form;
39  print qq(</body></html>);
40  
41  sub get_tracking_num {
42  	my $order_num = shift;
43  	open(CSV,$csv_file) || die "Cannot open $csv_file for read: $!";
44  	my $csv = new Text::CSV_XS;	
45  	
46  	while (<CSV>) {
47  		$csv->parse($_);
48  		my ($order,$fedex,$ups) = $csv->fields;
49  		if ($order eq $order_num) {
50  			if ($fedex) {
51  				return "fedex",$fedex;
52  			} else {
53  				return "ups",$ups;	
54  			}
55  		}
56  	}
57  	return 0;
58  }
59  
60  sub parse_fedex_html {
61  	my $track_num = shift;
62  	my $url = $fedex_url . "&language=$language&cntry_code=$country_code&tracknumbers=$track_num";
63  	my $page = get ($url);
64  
65  	return 0,0 if $page =~ /Invalid/i;
66  
67  	my $record;
68  
69  	$page =~ m|CLASS="resultstableheader".*?</tr>(.*?)</table>|gis;
70  	my $results = $1;
71  
72  	$col_match = "<td.*?>(.*?)</td>";
73  	$record_match = ".*?$col_match.*?$col_match.*?$col_match";
74  
75  	$results =~ m|<tr.*?>(.*?)</tr>|gis;
76  	my $record = $1;
77  	
78  	$record =~ s/&nbsp;/ /g;
79  	$record =~ m|$record_match|gis;
80  	my $message = $1;
81  	my $datetime = $2;
82  	my $note = $3;
83  	
84  	$datetime =~ m|(\d\d/\d\d/\d\d\d\d)\s+(\d\d:\d\d)|;
85  	my $date = $1;
86  	my $time = $2;
87  	
88  	return 1,$message,$date,$time,$note;
89  }
90  
91  sub parse_ups_data {
92  	my $track_num = shift;
93  	%track = UPStrack($track_num);
94  	return 0 if $track{'error'};
95  	
96  	my $message = $track{'Last Scanned at'};
97  	my $note;
98  	
99  	return 1,$message,$note;
100  }
101  
102  sub print_form {
103  	print qq(
104  <form action="/cgi-bin/tracker.pl" method="get">
105  Please enter your order number: <input name="order_num" value="$order_num"><input type="submit">
106  </form>);	
107  }