#!/usr/bin/perl -w ## This is an auto-form submission program to demostrate how LWP ## interact with webpage and form. ## Author: James.Q.L Aug 2002 ## ## Submission form must have similiar entries or add it yourlself. ## different entry name can be defined in %defined_tags for match. ## use strict; use DB_File; #use Data::Dumper; #use MLDBM qw(DB_File Data::Dumper); #unlink("easy_form_submit.db") or warn "error: $!\n"; #tie %form, 'MLDBM', 'easy_form_submit.db', O_CREAT|O_RDWR|O_EXCL, 0664; # easy sites have more than one form #$url_1 ='a.com'; #$url_2 ='b.com'; #$url_3 ='c.com'; # default form entry name for submission form. # Do not change key name as it used in below code. bad!! my %defined_tags = (url => 'gurl|link|url|Hjemmeside', desc => 'des|dsc|dsci|comment', cat => 'cat|sekce|kategori', num => 'num|pics|no|images|antal', email => 'mail', name => 'nick|name|Navn', recip => 'rurl|recip', pwd => 'pass', user => 'id', ); # default form value to submit. my %default_value = ( num => '20', email => 'easy@easyya.com', name => 'easyya', #user => 'easyya', #pwd => 'easyya', ); # easy url source open F,'t.txt' or die 'cant open file'; # Read easy rank and urls. # rank should be in form of <01> # exit reading while seeing __END__ my @urls; while() { last if (/^__END__/); if (/^<(\d+)>/ || /^\b(http\S+)/) { push @urls, $1; } } close F; #################### Start Form operation use LWP::UserAgent; use HTTP::Request::Common; #use LWP::Debug qw(+); use HTML::Form; my $br = LWP::UserAgent->new; $br->cookie_jar ( {} ); $br->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windws NT 5.1)'); #$br->timeout(60); my ($easy_no,$url,$title,$key,$value,%easy); # extract url and submit them. URL: foreach $url (@urls) { # Get rank of url. if ($url=~ /^(\d+)/) { $easy_no = $1; next; } print "examing form on $url\n"; my $req = GET ($url); $req->referer($url); my $resp = $br->request($req); if ($resp->is_error || $resp->code ne 200) { die "Error: ",$resp->status_line,"\n"; } if ($resp->is_redirect) { die "redirecting to", $resp->header('location') ,"\n"; } my @form = HTML::Form->parse($resp->content,$url); # record error and skip it if the url has no form unless (@form) { print "No form found at $url\n"; next URL; } # Pick up the right form for easys have more than one form #if ($url=~ /$url_1|$url_2|$url_3/o) { # $form = $form[1]; #} else { my $form = $form[0]; #} # Match "a.com" out of "http://a.com" or "http://www.a.com" # url must have a ending "/" $url =~ m#http://(www\.){0,1}(.*?)/#; $title = $2; ####################### Now constructiong the hash my ($input); my @inputs = $form->inputs; $easy{$easy_no}{$title}{info}{refer} = $url; $easy{$easy_no}{$title}{info}{form_action} = $form->action; # Go over the form elements. foreach $input ( @inputs ) { # Ignore button type. my $match; next if ($input->type=~ /(submit|reset)/i); if ($input->type=~ /hidden/i) { # Save hidden value if it's defined. if ( defined( $input->value ) ) { $easy{$easy_no}{$title}{$input->name}{name} = $input->name; $easy{$easy_no}{$title}{$input->name}{value} = $input->value; } } else { # Go over each element name which we recognize. MATCH: while ( ($key,$value) = each %defined_tags ) { # Use our pre-set name for later look-up. if ( $input->name =~ /$value/i ) { $match = 1; $easy{$easy_no}{$title}{$key}{name} = $input->name; # set category value if form has "asian" category. if ($key eq 'cat') { foreach ($input->possible_values) { chomp; if (lc($_) eq "asian" || lc($_)=~ /asian/) { $easy{$easy_no}{$title}{$key}{value} = $_; values (%defined_tags); # reset hash last MATCH; } } } # set default key if key exist,use form own value otherwise. if (exists $default_value{$key} ) { $easy{$easy_no}{$title}{$key}{value} = $default_value{$key}; } else { $easy{$easy_no}{$title}{$key}{value} = $input->value; } # reset hash values (%defined_tags); last MATCH; } # end of if } # end of MATCH # use form own element name if nothing match our default name. unless ( $match ) { $easy{$easy_no}{$title}{$input->name}{name} = $input->name; $easy{$easy_no}{$title}{$input->name}{value} = $input->value; } $match = 0; } # end of if/else } # end of foreach loop } # end of URL #print Dumper %easy; #%form = $easy; #print Data::Dumper->Dump( [\%form] ); #untie %easy || die "Error: $!\n"; ########################### Posting form. print "#"x5,"posting.........\n"; #use LWP::Debug qw(+); my @array; my $base_url = 'http://www.webpage.to.submit'; my $desc = "china great wall"; foreach $easy_no (sort keys %easy ) { $url = $base_url.$easy_no.".html"; foreach $title ( keys %{ $easy{$easy_no} } ) { foreach $key ( keys %{ $easy{$easy_no}{$title} } ) { if ($key eq 'url') { push @array, $easy{$easy_no}{$title}{$key}{name}=>$url; next; } if ($key eq 'recip') { push @array, $easy{$easy_no}{$title}{$key}{name}=>$url; next; } if ($key eq 'desc') { push @array, $easy{$easy_no}{$title}{$key}{name}=>$desc; next; } if (defined( $easy{$easy_no}{$title}{$key}{value} )) { push @array, $easy{$easy_no}{$title}{$key}{name} =>$easy{$easy_no}{$title}{$key}{value}; next; } } my $r = $easy{$easy_no}{$title}{info}{refer}; print join ' ',@array;print " $r\n";#undef @array; last; my $req = POST ( $easy{$easy_no}{$title}{info}{form_action},\@array ); $req->referer( $r ); my $resp = $br->request($req); if ($resp->is_error || $resp->code ne 200) { die "Error at $title: ",$resp->status_line,"\n"; } open F,">easy_log/$easy_no-$title.html"; print F $resp->as_string; close F; undef @array; } } __END__