Subject: | There is no Form Number on that page. |
Linux idx32.idx.net 2.4.17 #4 SMP Fri Feb 18 15:31:35 PST 2005 i686 unknown
This is perl, v5.6.1 built for i686-linux
I am using WWW::Mechanize 1.18.
I am getting this error message:
There is no form numbered 1 at ./regdomain.pl line 120
Can't call method "find_input" on an undefined value at
/usr/local/lib/perl5/site_perl/5.6.1/WWW/Mechanize.pm line 1269, <STDIN>
line 1.
I have attached my script (regdomain.pl as regdomain_pl.txt) and an
example of the text file it's supposed to parse (example.txt).
The way it's supposed to work is like this:
unix@host>./regdomain.txt example.txt
If you review the file, you will see the URL that it attempts to get the
HTML form from. Viewing its source should reveal the form fields my
script is attempting to populate.
Any help you can provide with this would be substantially appreciated.
Thank you.
Subject: | example.txt |
-----Original Message-----
From: nobody@nowhere.com
Sent: Tuesday, February 07, 2006 5:07 PM
To: Shared Account setup
Subject: Shared Web Hosting Order
Century 21 Web Hosting Order
Name: Someone Somebody-Hypehnated
Company: Ultra Business, Inc.
Address: 1234 Anywhere Blvd.
City: Somewhere
State: CA
Zip: 90010
Country: United States
Phone: 2135551212
Fax: 323-55-1212
Email: email@address.tld
Card type: Visa
Card No.: 1234567812345678
CCID: 000
Exp.: 02/2010
Order Total: 60.00
CP Username: 0123456
CP Password: owiekazowee
FTP Passwd: ayeyiyi
Hosting Term: 12 month(s)
Requested Domains: thedomain.com (main domain - register me please, 1 year(s))
Subject: | regdomain_pl.txt |
#!/usr/local/bin/perl
#
# regdomain.pl v1.00b
#
# usage:
# ./regdomain.pl filename.txt
# filename.txt contains the e-mail from sales@broadspire.com
# For now, this only handles registering one domain name at a time.
# For multiple domain names, or non-American registrations, you'l have to
# go to the site yourself.
# Fortunately, those domains are pretty rare.
# Populate hash array called ordermail with text file...
while ( $_ = <> ) {
($field, $input) = split /:\s*/, $_, 2;
@fields = split ' ', $input;
$ordermail{$field} = [ @fields ];
}
# Parse the hash into variables for HTML form injection...
$firstname = "$ordermail{Name}[0]";
$lastname = "$ordermail{Name}[1] $ordermail{Name}[2] $ordermail{Name}[3]";
$company = "$ordermail{Company}[0] $ordermail{Company}[1] $ordermail{Company}[2] $ordermail{Company}[3] $ordermail{Company}[4]";
$address = "$ordermail{Address}[0] $ordermail{Address}[1] $ordermail{Address}[2] $ordermail{Address}[3] $ordermail{Address}[4] $ordermail{Address}[5]";
$city = "$ordermail{City}[0] $ordermail{Address}[1] $ordermail{Address}[2]";
$state = "$ordermail{State}[0]";
$postalcode = "$ordermail{Zip}[0]";
$country = "$ordermail{Country}[0] $ordermail{Country}[1]";
$phno = "$ordermail{Phone}[0] $ordermail{Phone}[1] $ordermail{Phone}[2]";
# Take out non-numbers
$phno =~ s/[^\d]//g;
# Add +1. to the number because it's required.
$phone = "\+1.$phno";
# A fax number is mandatory; if this is blank, we have to use all zeros.
$faxno = "$ordermail{Fax}[0] $ordermail{Fax}[1] $ordermail{Fax}[2]";
$faxno =~ s/[^\d]//g;
$fax = "\+1.$faxno";
if ($fax =~ /\+1\.$/) {
$fax = "\+1.0000000000";
}
$email = "$ordermail{Email}[0]";
$cardtype = "Visa";
$cardno = "4111111111111111";
# We have to split the expiry because it's two separate HTML form fields.
$exp = "$ordermail{'Exp.'}[0]";
@expdate = split '/', $exp;
$expmo = @expdate[0];
# Because sometimes the e-mail has a four digit year as opposed to two.
$expy = @expdate[1];
if ($expy =~ /^0/) {
$expyr = "20$expy";
} else {
$expyr = $expy;
}
$login = "$ordermail{'CP Username'}[0]";
$pwd = "$ordermail{'CP Password'}[0]";
$domain = "$ordermail{'Requested Domains'}[0]";
$regyears = "$ordermail{'Requested Domains'}[7]";
$pdns = "ns1.idx.net";
$sdns = "ns2.idx.net";
# Tell the operator what's going on:
print "Registering: $domain\n";
print "\n";
print "Domain Management Username: $login\n";
print "Domain Management Password: $pwd\n";
print "\n";
print "Registration Period: $regyears year(s)\n";
print "\n";
print "First Name: $firstname\n";
print "Last Name: $lastname\n";
print "Organization Name: $company\n";
print "Street Address: $address\n";
print "City: $city\n";
print "State\/Province: $state\n";
print "Postal Code: $postalcode\n";
print "Country: $country\n";
print "Telephone Number: $phone\n";
print "Fax Number: $fax\n";
print "E-Mail Address: $email\n";
print "\n";
print "Primary Name Server Hostname: $pdns\n";
print "Secondary Name Server Hostname: $sdns\n";
print "\n";
print "Using Method Type: $cardtype\n";
print "Using Card Number: $cardno\n";
print "Using Expiration Date: $expmo/$expyr\n";
print "\n";
print "OK to proceed? (Y/n): ";
chomp(my $input = <STDIN>);
if ($input =~ /^[Y]?$/i) {
print "OK! ";
}
elsif ($input =~ /^[N]$/i) {
print "Aborting as requested.\n";
exit;
}
# HTML Form Injection:
print "Registering...\n";
# Use WWW::Mechanize, initialize our robot and fetch the good form...
use WWW::Mechanize;
my $robot = WWW::Mechanize->new();
my $url = "https://register.broadspire.com/reg/reg_system.cgi?action=bulk_order";
$robot->get($url);
die unless ($robot->success);
# Specify the Domain Management username and password...
$robot->set_visible( 0, $login, $pwd, $pwd );
$robot->click();
die unless ($robot->success);
print "Set Domain Management Username and Password.\n";
# Now fill out and submit the main domain name registration form...
$robot->form_number(1);
$robot->tick(flag_admin_use_contact_info);
$robot->tick(flag_billing_use_contact_info);
$robot->set_fields(
domains => $domain,
period => $regyears,
confirm_password => $pwd,
period => $regyears,
owner_first_name => $firstname,
owner_last_name => $lastname,
owner_org_name => $company,
owner_address1 => $address,
owner_city => $city,
owner_state => $state,
owner_postal_code => $postalcode,
owner_phone => $phone,
owner_fax => $fax,
owner_email => $email,
fqdn1 => $pdns,
fqdn2 => $sdns,
p_cc_type => $cardtype,
p_cc_num => $cardno,
p_cc_exp_mon => $expmo,
p_cc_exp_yr => $expyr,
);
$robot->click();
die unless ($robot->success);
# Order Now!
$robot->click();
# Show the domain name order number...
$msg = $robot->content;
print $msg\n;