Author: sparky
Date: Tue Jan  6 23:47:20 2009
New Revision: 10053

Modified:
   toys/fun/rsget.pl
Log:
- added megaupload, requires perl-GD and gocr for captchas


Modified: toys/fun/rsget.pl
==============================================================================
--- toys/fun/rsget.pl   (original)
+++ toys/fun/rsget.pl   Tue Jan  6 23:47:20 2009
@@ -97,6 +97,16 @@
 
        {
                my $fn = $self->{file_name};
+               if ( -r $fn ) {
+                       my $ext = "";
+                       $ext = $1 if $fn =~ s/(\..{3,5})$//;
+                       my $i = 1;
+                       while ( -r "$fn-$i$ext" ) {
+                               $i++;
+                       }
+                       $fn .= "-$i$ext";
+                       $self->{file_name} = $fn;
+               }
                my $net = $self->{obj}->{net};
                $self->{obj}->{netname} = "[$net] $fn: ";
        }
@@ -217,7 +227,8 @@
        if ( $obj->{curl_next} ) {
                my $func = $obj->{curl_next};
                my $body = $ecurl->{file}
-                       ? "DONE $ecurl->{file_name} $ecurl->{size_got} / 
$ecurl->{size_total}"
+                       ? "DONE $ecurl->{file_name} " . main::bignum( 
$ecurl->{size_got} )
+                               . " / " . main::bignum( $ecurl->{size_total} )
                        : $ecurl->{body};
                my $eurl = $curl->getinfo( CURLINFO_EFFECTIVE_URL );
                
@@ -248,7 +259,7 @@
                my $size_got = $ecurl->{size_got};
                my $size_total = $ecurl->{size_total};
 
-               my $size = "$size_got / $size_total";
+               my $size = main::bignum( $size_got ) . " / " . main::bignum( 
$size_total );
                my $eta = "";
                my $time_diff = $time - $ecurl->{time_start};
                if ( $size_total > 0 ) {
@@ -270,7 +281,7 @@
 {
        my $ecurl = shift;
 
-       my $size_total = $ecurl->{size_total};
+       my $size_total = $ecurl->{size_got};
 
        my $time_diff = time() - $ecurl->{time_start};
        $time_diff = 1 unless $time_diff;
@@ -279,7 +290,7 @@
 
        my @l = localtime;
        my $date = sprintf "%d-%.2d-%.2d %2d:%.2d:%.2d", $l[5] + 1900, $l[4] + 
1, @l[(3,2,1,0)];
-       return "DONE $size_total; ${speed}KB/s $eta @ $date";
+       return "DONE " . main::bignum( $size_total ) . "; ${speed}KB/s $eta @ 
$date";
 }
 
 
@@ -609,12 +620,12 @@
 sub stage4
 {
        my ($self, $body, $url) = @_;
-       $self->print("starting............");
+       $self->print("reading captcha");
 
        my $captcha = Get::NetLoad::Captcha::resolve( $body );
 
        unless ( defined $captcha ) {
-               return $self->stage1();
+               return $self->curl( $self->{s3dir} . $self->{captcha_img}, 
\&stage4, cookies => $self->{cookie}, referer => $url );
        }
        $self->{captcha} = $captcha;
 
@@ -624,7 +635,7 @@
 sub stage5
 {
        my $self = shift;
-       $self->print("starting...............");
+       $self->print("starting............");
 
        my $post = 
"file_id=$self->{file_id}&captcha_check=$self->{captcha}&start=";
        $self->curl(
@@ -636,18 +647,28 @@
 sub stage6
 {
        my ($self, $body, $url) = @_;
-       $self->print("starting..................");
+       $self->print("starting...............");
 
        if ( $body =~ /You may forgot the security code or it might be wrong/ ) 
{
                return $self->stage1();
        }
-
+       if ( $body =~ /This file is currently unavailable/ ) {
+               return $self->error( "file currently unavailable" );
+       }
        if ( $body =~ /You could download your next file 
in.*countdown\(([0-9]+)/ ) {
                my $wait = $1 / 100;
                $wait = 1200 if $wait > 1200;
                return $self->wait( $wait, \&stage1, "free limit reached, 
waiting" );
        }
-       $body =~ /please wait .*countdown\(([0-9]+),/;
+       unless ( $body =~ /please wait .*countdown\(([0-9]+),/ ) {
+               if ( $self->{s6problems} ) {
+                       return $self->error( "unknown problem" );
+               } else {
+                       $self->{s6problems} = 1;
+                       return $self->wait( 5 * 60, \&stage1, "unknown 
problems, retrying in" );
+               }
+       }
+       $self->{s6problems} = 0;
        my $wait = $1 / 100 + 1;
 
        my ($full_link) = ($body =~ m#<a class="Orange_Link" href="(.*?)"#);
@@ -741,8 +762,8 @@
        $nimg->copy( $trimg, 13 + 2*$w, 1, $xmin, $ymin, $w, $h );
        $nimg->copy( $trimg, 15 + 3*$w, 1, $xmin, $ymin, $w, $h );
 
-       use IPC::Open2;
-       open2( *READ, *WRITE, "pngtopnm | gocr -f ASCII -a 5 -m 56 -C 
0123456789 - 2>/dev/null" );
+       require IPC::Open2;
+       IPC::Open2::open2( *READ, *WRITE, "pngtopnm | gocr -f ASCII -a 5 -m 56 
-C 0123456789 - 2>/dev/null" );
        print WRITE $nimg->png;
        close WRITE;
        my $num = <READ> || "";
@@ -750,8 +771,7 @@
 
        my ($gocr) = ($num =~ /^([0-9])/);
 
-       use IPC::Open2;
-       open2( *READ, *WRITE, "pngtopnm | ocrad --filter=numbers_only - 
2>/dev/null" );
+       IPC::Open2::open2( *READ, *WRITE, "pngtopnm | ocrad 
--filter=numbers_only - 2>/dev/null" );
        print WRITE $nimg->png;
        close WRITE;
        $num = <READ> || "";
@@ -889,6 +909,189 @@
 }
 
 # }}}
+package Get::MegaUpload; # {{{
+
+BEGIN {
+       our @ISA;
+       @ISA = qw(Get);
+}
+
+my $mucookie = 0;
+sub new
+{
+       my $proto = shift;
+       my $class = ref $proto || $proto;
+       my $url = shift;
+
+       ++$mucookie;
+       my $cookie = ".mu.$nlcookie.txt";
+       unlink $cookie if -e $cookie;
+
+       Get::makenew( "MU", $class, $url, cookie => $cookie );
+}
+
+sub stage1
+{
+       my $self = shift;
+
+       $self->print("starting...");
+       $self->curl( $self->{url}, \&stage2, cookies => $self->{cookie} );
+}
+
+sub stage2
+{
+       my ($self, $body, $url) = @_;
+       $self->print("starting......");
+
+       my %search = (
+               captcha_img => qr#<img src="(/capgen\.php\?[0-9a-f]+)"#,
+               action => qr#<form method="POST" action="(.*?)"#,
+               s2id => qr#<input type="hidden" name="d" value="(.*?)"#,
+               s2icode => qr#<input type="hidden" name="imagecode" 
value="(.*?)"#,
+               s2mevagar => qr#<input type="hidden" name="megavar" 
value="(.*?)"#,
+       );
+
+       foreach my $name ( keys %search ) {
+               my $search = $search{$name};
+               if ( $body =~ m/$search/ ) {
+                       $self->{$name} = $1;
+               } else {
+                       return $self->stage1()
+               }
+       }
+
+       (my $domain = $url) =~ s#^(.*?://.*?)/.*$#$1#; ## vim
+       $self->{s2url} = $url;
+
+       $self->curl( $domain . $self->{captcha_img}, \&stage3, cookies => 
$self->{cookie}, referer => $url );
+}
+
+sub stage3
+{
+       my ($self, $body, $url) = @_;
+
+       $self->print("reading captcha");
+
+       my $captcha = Get::MegaUpload::Captcha::resolve( $body );
+
+       unless ( defined $captcha ) {
+               return $self->stage1();
+       }
+
+       my $post = 
"d=$self->{s2id}&imagecode=$self->{s2icode}&megavar=$self->{s2mevagar}&imagestring=$captcha";
+
+       $self->curl( $self->{action}, \&stage4, post => $post, cookies => 
$self->{cookie}, referer => $url );
+}
+
+sub stage4
+{
+       my ($self, $body, $url) = @_;
+
+       my %search = (
+               s4wait => qr#x[0-9]+=([0-9]+);#,
+               s4g => qr#var . = 
String\.fromCharCode\(Math.abs\(-?([0-9]+)\)\);#,
+               s4j1 => qr#var . = '(.)' \+ 
String\.fromCharCode\(Math\.sqrt\([0-9]+\)\);#,
+               s4j2 => qr#var . = '.' \+ 
String\.fromCharCode\(Math\.sqrt\(([0-9]+)\)\);#,
+               s4href => qr#document\.getElementById\("dlbutton"\)\.innerHTML 
= '<a href="(.*?)"#,
+       );
+
+       foreach my $name ( keys %search ) {
+               my $search = $search{$name};
+               if ( $body =~ m/$search/ ) {
+                       $self->{$name} = $1;
+               } else {
+                       return $self->stage1()
+               }
+       }
+
+       my $furl = $self->{s4href};
+
+       my $g = chr $self->{s4g};
+       my $j2 = chr sqrt $self->{s4j2};
+       my $jg = $self->{s4j1} . $j2 . $g;
+
+       $furl =~ s/' \+ . \+ . \+ '/$jg/;
+
+       $self->{file_url} = $furl;
+       $self->{file_referer} = $url;
+
+       $self->wait( $self->{s4wait}, \&stage5, "starting in" );
+}
+
+sub stage5
+{
+       my $self = shift;
+       $self->print("downloading");
+
+       $self->download( referer => $self->{file_referer}, cookies => 
$self->{cookie} );
+}
+
+sub DESTROY
+{
+       my $self = shift;
+       unlink $self->{cookie};
+}
+
+# }}}
+package Get::MegaUpload::Captcha; # {{{
+
+sub resolve
+{
+       my $capdata = shift;
+       require GD;
+
+       my $img = GD::Image->new( $capdata );
+
+       my @img;
+       foreach ( 0..2 ) {
+               my $img = GD::Image->newPalette( 70, 32 );
+               my $w = $img->colorAllocate( 255, 255, 255 );
+               my $b = $img->colorAllocate( 0, 0, 0 );
+               push @img, { img => $img, w => $w, b => $b };
+       }
+
+       my $bg = $img->getPixel( 0, 0 );
+
+       foreach my $y ( 1..30 ) {
+               foreach my $x ( 1..68 ) {
+                       my $ci = $img->getPixel( $x, $y );
+                       next if $ci == $bg;
+                       my ($r, $g, $b ) = $img->rgb( $ci );
+
+                       next if $g < 0x60 or $g > 0x80 or $b < 0x60 or $g > 
0x80;
+                       if ( $r > 110 and $r < 130 ) {
+                               $img[ 0 ]->{img}->setPixel( $x, $y, $img[ 0 
]->{b} );
+                       }
+                       if ( $r > 160 and $r < 180 ) {
+                               $img[ 1 ]->{img}->setPixel( $x, $y, $img[ 1 
]->{b} );
+                       }
+                       if ( $r > 210 and $r < 230 ) {
+                               $img[ 2 ]->{img}->setPixel( $x, $y, $img[ 2 
]->{b} );
+                       }
+               }
+       }
+
+       my @l;
+       require IPC::Open2;
+       foreach ( 0..2 ) {
+               my $img = $img[$_]->{img};
+               IPC::Open2::open2( *READ, *WRITE, "pngtopnm | gocr -f ASCII -m 
56 -C A-Z - 2>/dev/null" );
+               print WRITE $img->png;
+               close WRITE;
+               my $out = <READ> || "";
+               close READ;
+
+               if ( $out =~ /^([A-Z])/ ) {
+                       push @l, $1;
+               } else {
+                       return undef;
+               }
+       }
+
+       return join "", @l;
+}
+
+# }}}
 package main;
 
 my $get_list = shift @ARGV || 'get.list';
@@ -916,9 +1119,12 @@
                } elsif ( $line =~ m#^\s*(http://netload\.in/datei.*?)\s*$# ) { 
#){# vimbug
                        $url = $1;
                        new Get::NetLoad( $1 );
-               } elsif ( $line =~ 
m#^\s*(http://odsiebie.com/(pokaz|pobierz)/.*?)\s*$# ) { #){# vimbug
+               } elsif ( $line =~ 
m#^\s*(http://odsiebie\.com/(pokaz|pobierz)/.*?)\s*$# ) { #){# vimbug
                        $url = $1;
                        new Get::OdSiebie( $1 );
+               } elsif ( $line =~ 
m#^\s*(http://(www\.)?megaupload\.com/\?d=.*?)\s*$# ) { #){# vimbug
+                       $url = $1;
+                       new Get::MegaUpload( $1 );
                }
 
                if ( $url ) {
@@ -974,4 +1180,11 @@
        return sprintf '%d:%.2d', $minutes, $seconds;
 }
 
+sub bignum($)
+{
+       local $_ = shift;
+       s/(...?)(?=(...)+$)/$1_/g;
+       return $_;
+}
+
 # vim:ts=4:sw=4:fdm=marker
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to