in reply to Expresso Login

Actually, I don't need to specify the page so explicitly; I should just make a request, say for Google.com, follow redirects and check the result. If the result is Google -- Good! If it's T-Mobile login page, then post the login based on the URL and the form action. But, I didn't do it that way. Sorry.

Replies are listed 'Best First'.
Re: Re: Expresso Login
by rjamestaylor (Acolyte) on Dec 20, 2003 at 20:11 UTC
    Ok, since I'm at a T-Mobile Hotspot I thought I might as well try this. I used Google, but I could have used anything else. Also, I hard-coded some particulars to identify the site as Google (images.google.com; thinking that that would less likely be referred to on T-Mobile's login page and would always be on Google's page) and also hard-coded the post_url regexp for T-Mobile's login page to find out what url to bang at. Here's the updated code, kinda ugly, but I'm in a hurry and this worked:
    #!/usr/bin/perl -w # tmobile.pl use strict; use LWP::UserAgent; use HTTP::Request::Common qw(:DEFAULT $DYNAMIC_FILE_UPLOAD); use HTTP::Cookies; use Logger::Simple; my ($username,$password) = @ARGV; my $i = 0; my $max_tries = 5; my %levels = (ERROR=>1, WARN=>4, INFO=>6, DEBUG=>9); my $loglevel = "DEBUG"; print "level set to: $loglevel -- $levels{$loglevel}\n"; my $log=Logger::Simple->new(LOG=>"/var/log/tmobile.log",CARP=>'1'); $log->set("###### Start tmobile.pl v.01 ######") if $levels{"$loglevel +"} > $levels{'WARN'}; my $ua = LWP::UserAgent->new; ## Just a little lie $ua->agent("Mozilla/4.0 (compatible; MSIE 5.5; MSN 2.5; Windows 98) ") +; $ua->cookie_jar(HTTP::Cookies->new(file => "lwpcookies.txt", autosave => 1)); push @{ $ua->requests_redirectable }, 'POST'; $log->set("Attempting to Login") if $levels{"$loglevel"} > $levels{'WA +RN'}; ## ## Try to get the post url automatically by trying Google. ## And, if getting Google works, I'm lucky so quit while I'm ahead. ## ## In SoCal all the TMobile HotSpots I'd visited used "service1.hotspo +t.t-mobile.com" but ## in South TX I found "service3...", so let's iterate thru a bit. ## unless (can_get_google(\$ua)) { while (!login_to_tmobile(\$ua,$i) && $i < $max_tries) { $log->set("\tLogin retry # $i ... ") if $levels{"$loglevel"} > $le +vels{'WARN'}; $i++; sleep 3; # Let's not bang too hard... } } exit 0; # Create a request, send it through UA and get result sub login_to_tmobile{ my ($ua, $j, $post_url) = @_; $j++; $post_url = "https://service$j.hotspot.t-mobile.com//user/home" unl +ess $post_url; print "trying $j..."; my $res = $$ua->request(POST $post_url, Content_Type => "application/x-www-form-urlencoded", Content => [ username => $username, password => $password, ]); #Check the outcome of the response if ($res->is_success) { $log->set("Login successful!\n $res->content"); # always log print "Got it!\n"; return 1; } $log->set("Post failed with $res->status_line"); # always log print " nope: ",$res->status_line,"\n"; return 0; } # Try Google, if I get it, quit # Otherwise, grab the post URl from what should be the # T-Mobile login page and use it to login. Any failure sends # me to the regular incremental login method sub can_get_google{ my ($ua) = @_; print "trying to get lucky..."; my $res = $$ua->request(GET "http://www.google.com"); #Check the outcome of the response if ($res->is_success) { if ($res->content =~ m|http://images.google.com/|) { $log->set("Already logged in and connected"); print "Already logged in!\n"; return 1; } else { # name="postURL" value="https://service1.hotspot.t-mobile.com +//user/home?t=dog2g830" my ($post_url) = $res->content =~ /name="postUrl" value="([^" +]+)"/; return login_to_tmobile($ua,0,$post_url); } } $log->set("Get Google failed with $res->status_line"); # always log print " Not lucky: ",$res->status_line,"\n"; return 0; }