commit
					e116955e5c
				
				 1 changed files with 145 additions and 0 deletions
			
			
		@ -0,0 +1,145 @@ | 
				
			|||||||
 | 
					#!/usr/pkg/bin/perl | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use WWW::Mechanize; | 
				
			||||||
 | 
					local $mech = WWW::Mechanize->new(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $configfile = $ARGV[0]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error("Usage: $0 configfile") unless defined($configfile); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					open CONFIG, "<$configfile" or die $!; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while (<CONFIG>) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    chomp; | 
				
			||||||
 | 
					    # no newline | 
				
			||||||
 | 
					    s/#.*//; | 
				
			||||||
 | 
					    # no comments | 
				
			||||||
 | 
					    s/^\s+//; | 
				
			||||||
 | 
					    # no leading white | 
				
			||||||
 | 
					    s/\s+$//; | 
				
			||||||
 | 
					    # no trailing white | 
				
			||||||
 | 
					    next unless length; | 
				
			||||||
 | 
					    # anything left? | 
				
			||||||
 | 
					    my ($var, $value) = split(/\s*=\s*/, $_, 2); | 
				
			||||||
 | 
					    $options{$var} = $value; | 
				
			||||||
 | 
					}  | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					close CONFIG; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$username = $options{'username'}; | 
				
			||||||
 | 
					die "username not set" unless defined($username); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$password = $options{'password'}; | 
				
			||||||
 | 
					die "password not set" unless defined($password); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$downloaddir = $options{'downloaddir'}; | 
				
			||||||
 | 
					die "downloaddir not set" unless defined($downloaddir); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print "Fetching homepage\n"; | 
				
			||||||
 | 
					$mech->get("https://www.orange.co.uk/"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$mech->follow_link( text_regex => qr/mobile account/ ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print "Logging in\n"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$mech->submit_form( | 
				
			||||||
 | 
						form_number => 1, | 
				
			||||||
 | 
						fields      => { | 
				
			||||||
 | 
							txtMSISDN  => $username, | 
				
			||||||
 | 
							txtPassword  => $password, | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Stupid JavaScript here to submit the form on loading of the page. | 
				
			||||||
 | 
					# Just log in. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print "Following intermediate login form\n"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$mech->submit_form( | 
				
			||||||
 | 
						form_number => 1, | 
				
			||||||
 | 
						fields      => { | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print "Following view your bills link\n"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$mech->follow_link( text_regex => qr/view your bills/ ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					follow_processing(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my @links = $mech->find_all_links( text_regex => qr/download PDF/ ); | 
				
			||||||
 | 
					for $link (@links) { | 
				
			||||||
 | 
					    my $url = $link->url(); | 
				
			||||||
 | 
					    my ($invoice) = $url =~ /leg_invoice=(\d+)/; | 
				
			||||||
 | 
					    my $filename = $downloaddir . '/' . $invoice . ".pdf"; | 
				
			||||||
 | 
					    unless (-e $filename) { | 
				
			||||||
 | 
					#	print "Downloading invoice $invoice to $filename from $url\n"; | 
				
			||||||
 | 
						print "Downloading invoice $invoice to $filename\n"; | 
				
			||||||
 | 
					        downloadbill($url, $filename); | 
				
			||||||
 | 
					        #$mech->mirror($url, $filename); | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
						print "Skipping download of invoice $invoice\n"; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#$mech->follow_link( text_regex => qr/log out/ ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#print $mech->content(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#$mech->dump_forms( undef, $absolute ); | 
				
			||||||
 | 
					#$mech->dump_links( undef, $absolute ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub follow_processing { | 
				
			||||||
 | 
					    my $url, $attempts; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $attempts = 0; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while ($attempts < 10) { | 
				
			||||||
 | 
						$attempts++; | 
				
			||||||
 | 
					        ($url) = $mech->content() =~ /var sURL = "(.*)";/; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return unless defined($url); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sleep(1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $url =~ s/&/&/g; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#        print "Attempt $attempts. Found URL: $url\n"; | 
				
			||||||
 | 
						print "Waiting for processing. Attempt $attempts.\n"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        my $newurl = $mech->uri(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $newurl =~ s/\/[^\/]*$//; | 
				
			||||||
 | 
					        $newurl = $newurl . "/" . $url; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#        print "I think I'm going to $newurl\n"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $mech->get($newurl); | 
				
			||||||
 | 
					        print "Processing finished.\n"; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub downloadbill { | 
				
			||||||
 | 
					    my ($url, $filename) = @_; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print "Following download link\n"; | 
				
			||||||
 | 
					    $mech->get($url); | 
				
			||||||
 | 
					    follow_processing(); | 
				
			||||||
 | 
					    print "Following View your bill link\n"; | 
				
			||||||
 | 
					    my $billlink = $mech->find_link( text_regex => qr/View your bill/ ); | 
				
			||||||
 | 
					    if (!defined($billlink)) { | 
				
			||||||
 | 
						print "Unable to download bill\n"; | 
				
			||||||
 | 
						return; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    my $billurl = $billlink->url_abs(); | 
				
			||||||
 | 
					    print "Downloading bill\n"; | 
				
			||||||
 | 
					    $mech->mirror($billurl, $filename); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub error { | 
				
			||||||
 | 
					    my ($error) = @_; | 
				
			||||||
 | 
					    print STDERR $error; | 
				
			||||||
 | 
					    print STDERR "\n"; | 
				
			||||||
 | 
					    exit 1; | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue