#!perl -w package Recaptcha; use strict; use WebServer; use MIME::Base64; use File::Temp qw(tempfile); sub web64encode { my $enc= encode_base64(shift); $enc =~ tr{+/}{-_}; $enc =~ s/\s//gs; return $enc; } sub web64decode { my $txt= shift; $txt =~ tr{-_}{+/}; return decode_base64($txt); } sub new { my $apikey= pack("Va6a20", 0x4cdbb7e8, "", pack("H*","4d2193c5677ddd531c79e7f6526ea30e9f82e94e")); return bless { svr=>WebServer->new("https://www.google.com"), apikey=>$apikey }, shift; } sub getchallenge { my ($self)= @_; my $rp= $self->{svr}->httpget("/recaptcha/api/challenge", k=>web64encode($self->{apikey}), lang=>'en'); #printf("\n================ %s\n%s\n\n%s\n", "recaptcha", $rp->headers->as_string(), $rp->content()); #var RecaptchaState = { # site : '6LfbTAAAAAAAAE0hk8Vnfd1THHnn9lJuow6fgulO', # challenge : '03AHJ_Vut4tNcoRkGz_sifnGS_iCp5Bh37FIsol6OXzjP2CspcmiQlRdZ2wD8bE7K6gRz6_hZIPKWx_92LR5Xq8th_a5DnSNquIiWaHLlUBT28J3-j3ukj0YWQZ7JJx1LcqUrUf09kC30s9ULsjtRkniur1TenkOQ2SQ', # is_incorrect : false, # programming_error : '', # error_message : '', # server : 'https://www.google.com/recaptcha/api/', # timeout : 18000 #}; if ($rp->content() =~ /challenge\s*:\s*'(\S+)'/) { return web64decode($1); } return undef; } sub image { my ($self, $challenge)= @_; my $rp= $self->{svr}->httpget("/recaptcha/api/image", c=>web64encode($challenge)); my ($fh, $fn)= tempfile("reXXXXXXXX", SUFFIX=>".jpg"); binmode $fh; $fh->print($rp->content()); $fh->close(); system("open -a google\\ chrome $fn"); } package Twitter; use strict; use WebServer; sub new { return bless { svr=>WebServer->new("https://twitter.com") }, shift; } sub signup { my ($self)= @_; my $rp= $self->{svr}->httpget("/signup"); #printf("\n================ %s\n%s\n\n%s\n", "signup", $rp->headers->as_string(), $rp->content()); } sub isavailable { my ($self, $name)= @_; my $rp= $self->{svr}->httpget("/users/username_available", username=>$name, $self->authtoken()); #printf("\n================ %s\n%s\n\n%s\n", "username_available", $rp->headers->as_string(), $rp->content()); # {"msg":"Username has already been taken","desc":"That username has been taken. Please choose another.","valid":false} # {"msg":"Available!","desc":"Available!","valid":true} } sub validemail { my ($self, $name)= @_; my $rp= $self->{svr}->httpget("/users/email_available", email=>$name, $self->authtoken()); #printf("\n================ %s\n%s\n\n%s\n", "email_available", $rp->headers->as_string(), $rp->content()); # {"color":"green","msg":"Available!","valid":true} } sub authtoken { my ($self)= @_; if (exists $self->{authtoken}) { return (authenticity_token=>$self->{authtoken}); } else { return (); } } sub recaptcha { my ($self)= @_; if (exists $self->{recaptcha}) { return ( 'recaptcha_challenge_field'=>$self->{recaptcha}{challenge}, 'recaptcha_response_field'=>$self->{recaptcha}{words}, ); } else { return (); } } sub create { my ($self, $name, $pass, $email)= @_; if (length($name)>=15) { warn "twitter name must be less than 15 chars\n"; } my $rp= $self->{svr}->httppost("/account/create", $self->authtoken(), $self->recaptcha(), 'user[name]'=>$name, 'user[screen_name]'=>$name, 'user[user_password]'=>$pass, 'user[email]'=>$email, 'user[discoverable_by_email]'=>0, 'user[send_email_newsletter]'=>0, 'commit'=>'Finish'); my $html= $rp->content(); if ($html =~ /data\("captchaValid", false\);/s) { printf("captcha incorrect\n"); return -1; } elsif ($html =~ /You are being.*\/welcome.*redirected/s) { printf("ok\n"); return 0; } printf("\n================ %s\n%s\n\n%s\n", "create", $rp->headers->as_string(), $rp->content()); # $("#signup-form form").data("captchaValid", true); #
You are being redirected. } package main; use strict; my $t= Twitter->new(); #$t->isavailable("joerandom"); $t->isavailable("joerandom12312"); $t->validemail('joe@random.com'); #$t->validemail('joe12313123@random.com'); #$t->signup(); #printf("---- trying without captcha\n"); #$t->create("joerandom12312", "qweiouwoiruwer", 'joe@random.com'); my $r= Recaptcha->new(); my $challenge= $r->getchallenge(); $r->image($challenge); printf("%s\n", unpack("H*", $challenge)); print "enter words:"; my $words=<>; $t->{recaptcha}= { challenge=>$r->{challenge}, words=>$words, }; printf("---- trying with captcha\n"); #$t->create("joerandom12312", "qweiouwoiruwer", 'joe@random.com'); $t->create("joerandom12313", "qweiouwoiruwe3", 'joe3@random.com');