Имеется следующий код (в перле второй день - ногами не пинайте): | Код | #!c:\\perl\\bin
use strict; use WWW::Mechanize; use HTTP::Cookies; use LWP::Debug qw(+);
my $url = "http://win.mail.ru/cgi-bin/login";
my $login = "my_mail_login"; my $domain = "mail.ru"; my $password = "my_pass";
#авторизуемся на майл.ру
my $mech = WWW::Mechanize->new(); $mech->cookie_jar(HTTP::Cookies->new()); $mech->get($url); $mech->form_name('Auth'); $mech->field(page => ""); $mech->field(post => ""); $mech->field(login_from => ""); $mech->field(Login => $login); $mech->field(Domain => $domain); $mech->field(Password => $password); $mech->click();
my ($out) = $mech->get("http://win.mail.ru/cgi-bin/editpass")->content(); # получаем страницу с капчей my ($xregid) = $out =~ /name="captha_frame" frameborder='0' scrolling='no' style='border-width:0px;overflow:hidden;border-width:0px;height:51px;width:151px' src='(.+?)'/i; my ($xreg) = $out =~ /input type=hidden value="(.+?)" name=x_reg_id/i; print $xregid."\n"; print $xreg."\n"; $out = $mech->get("http://win.mail.ru/cgi-bin/".$xregid)->content(); my ($img_url) = $out =~ /<img src="(.+?)">/i; my ($c) = &captcha($mech, 'http://win.mail.ru/cgi-bin/'.$img_url);
$mech->post("http://win.mail.ru/cgi-bin/modifypass", [ 'modify'=>'1', 'Username'=>$login, 'browserData'=>'screen--%60top%60%3A%600%60%2C%60height%60%3A%60768%60%2C%60width%60%3A%601366%60%2C%60left%60%3A%600%60%2C%60colorDepth%60%3A%6032%60%2C%60pixelDepth%60%3A%6032%60%2C%60availWidth%60%3A%601366%60%2C%60availHeight%60%3A%60708%60%2C%60availLeft%60%3A%600%60%2C%60availTop%60%3A%600%60%0D%0Anavigator--%60userAgent%60%3A%60Mozilla%2F5.0+%28Windows%3B+U%3B+Windows+NT+5.1%3B+ru%3B+rv%3A1.9.1.5%29+Gecko%2F20091102+MRA+5.6+%28build+03278%29+Firefox%2F3.5.5%60%2C%60appVersion%60%3A%605.0+%28Windows%3B+ru%29%60%2C%60appCodeName%60%3A%60Mozilla%60%2C%60appName%60%3A%60Netscape%60%2C%60language%60%3A%60ru%60%2C%60platform%60%3A%60Win32%60%2C%60oscpu%60%3A%60Windows+NT+5.1%60%2C%60vendor%60%3A%60%60%2C%60vendorSub%60%3A%60%60%2C%60product%60%3A%60Gecko%60%2C%60productSub%60%3A%6020091102%60%2C%60securityPolicy%60%3A%60%60%2C%60cookieEnabled%60%3A%60true%60%2C%60onLine%60%3A%60true%60%2C%60buildID%60%3A%6020091102152451%60%0D%0Aflash--%60version%60%3A%6010.0.32%60%0D%0A', 'oldPswd'=>$password, 'Password'=>'fuck0ff123', 'Password_Verify'=>'fuck0ff123', 'x_reg_id'=>$xreg, 'security_image_word'=>$c ] )->as_string;
my $outfile = "out.htm"; my $output_page = $mech->content(); open(OUTFILE, '>tmp/'.$outfile); print OUTFILE $output_page; close(OUTFILE);
sub get_cap {
}
sub captcha { my ($mech, $img_url) = @_; my $img_name = rand(9).'.jpg'; my $imdata = $mech->get($img_url)->content; open(F,'>tmp/'.$img_name); binmode F; print F $imdata; close(F); my ($cap) = 0; $cap = &anti_captcha($mech, './tmp/'.$img_name); return $cap if ($cap ne '0'); unlink 'tmp/'.$img_name; return 0; }
sub anti_captcha { my ($mech, $img) = @_; print " . recognizing captcha (".$img.")..."."\n"; my $digits = ''; M: my $response = $mech->post( 'http://antigate.com/in.php', Content_Type => 'form-data', Content => [ file => [ $img, "$img", "Content-Type" => "application/octet-stream" ], method => "post", key => "41c93c87c2e360e01065e42d37bd5410" ] )->as_string; if ($response =~ /500 read timeout/i) { print ' . 500 read timeout'."\n"; sleep(10); goto M; } if($response =~ /OK\|(\d+)/i) { my $kkey = $1; do { print " . Waiting chinese response... ($kkey)"."\n"; $digits = $mech->get( 'http://'.'antigate.com'."/res.php?key=41c93c87c2e360e01065e42d37bd5410&action=get&id=$kkey" )->as_string; sleep(5); } while($digits =~ /CAPCHA_NOT_READY/i); $digits =~ /OK\|(.*)/i; $digits = $1; print " + Recorgenized (".$img."): ".$digits."\n"; } elsif ($response =~ /ERROR_NO_SLOT_AVAILABLE/i) { sleep(1); print " . Waiting for free slot ..."."\n"; goto M; } elsif ($response =~ /ERROR_KEY/i) { print " -!- Your anti-captcha key is invalid, please check or remove it"."\n"; exit(0); } else { if ($response =~ /500 Server closed/is) { print " ?? 500 timeout\n"; sleep(5); goto M; } $response =~ /\n\n(.*)/is; print " ?? Something wrong with AC: $1"."\n"; exit(0) if ($1 =~ /ERROR_ZERO_BALANCE/); } return $digits; }
|
Задача состоит в том, чтобы получить капчу, разгадать ее и отправить обратно... Возникла трудность в том, что капча рисуется в отдельном фрейме и плюс к этому обновляется автоматом каждые N (вроде 30) секунд. Пробовал через MECH и через обычный UA делать - одна херня, не получается. Помогите кто чем может =\ Код не откомментирован, думаю ничего сверхоригинального я, как новичок, там не намудрил
|