#! /usr/bin/perl -w use HTTP::Cookies; use LWP::UserAgent; use Fcntl ':flock'; use threads; use threads::shared; ####################################################################### $tn = shift || 5 ; #Кол-во потоков <= кол-во аккаунтов $tp = shift || 0 ; #0 - личные сообщения (тем кто онлайн) ; 1 - приглашения (тем кто онлайн) ; 2 - личные сообщения друзьям; 3 - сообщения друзьям друзей $sx = 0 ; #0 - не использовать прокси, 1 - использовать прокси $de = 20 ; #Задержка (секунды) $lg = 0 ; #0 - не вести логи, 1 - вести логи $ml = './accs.txt'; #Список аккаунтов в формате email:pass $tx = './text.txt' ; #Файл с сообщениями (одно на строчке) !Обязательно сохраните файл в UTF-8! $tl = './tokn.txt'; #Список людей кому были отправленны сообщения $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 = ; @data = grep(!$saw{$_}++, @data); close(DAT); open(DAT, $tl) || die("Could not open tokens file!"); my @tokens : shared = ; chomp(@tokens); close(DAT); open(DAT, $px) || die("Could not open proxy file!"); @proxy =; chomp(@proxy); close(DAT); open(DAT, $tx) || die("Could not open text file!"); @text=; close(DAT); ####################################################################### my $size : shared = scalar @data; my $seed : shared = 0; my $totl : shared = 1; my @ccap : shared = (); my @criteria : shared = ($tp > 1) ? (@data) : (1); $tsize = scalar @text; $time = time; @tokens = (); $| = 1; ($tn > $size-1) ? ($tn = $size-1) : (); ####################################################################### printf "Odnoklassniki.ru\n"; printf "Started at ".localtime()."\n"; sleep(1); ####################################################################### for(0..$tn) {$trl[$_] = threads->create(\&gogo, $_);} for(@trl) { $_->join; } ####################################################################### sub gogo { my($ua,$cookie_jar) = browser($_); AGAIN: if($sx) {until(proxy($ua)){}} sleep(1); $cookie_jar->clear(); my $prefix = ''; my $mail = ''; my $sid = ''; my $eli = 0; until($prefix) { {lock($seed); $seed++; } ($prefix,$mail,$sid) = login($ua, $seed); sleep(2); } warno($ua,$prefix); $ua->post("http://$prefix.odnoklassniki.ru/dk?cmd=lang&st.cmd=userMain", {lang => 'ru'}); my $counter = 0; while(@criteria) { if($tp == 2 || $tp == 3) { my $get = ($tp == 2) ? ("http://$prefix.odnoklassniki.ru/dk?st.cmd=userFriend") : ("http://$prefix.odnoklassniki.ru/dk?st.cmd=userFriend2"); my $page = ''; my $people = $ua->get("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMain")->as_string; if($people =~ /recaptcha/) {captcha($ua,$people,$prefix);} if($people =~ /cmd=warning/) {warno($ua,$prefix);} if($tp == 2) {$people =~ /Мои друзья<\/a><\/td>(\d+)<\/td><\/tr>/; if($1) {print "Friends $1 ($mail)\n"; $page = sprintf("%.0f",$1/20);}else{$page=0;}} elsif($tp == 3) {$people =~ /Друзья моих друзей<\/a><\/td>(\d+)<\/td><\/tr>/; if($1) {print "FF $1 ($mail)\n"; $page = sprintf("%.0f",$1/20);}else{$page=0;}} while($page>=1) { $people = $ua->get("$get&st.page=$page")->as_string; if($people =~ /recaptcha/) {captcha($ua,$people,$prefix);} if($people =~ /cmd=warning/) {warno($ua,$prefix);} $people =~ /class="pager">(.*?)class="bottomadv"/; my $friends = $1; if($friends) { while($friends =~ /st\.friendId=(\d+)\&\;tkn=(\d+)">get("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMessageCreateP&st.friendId=$fid")->as_string; if($res =~ /recaptcha/) {captcha($ua,$res,$prefix);} if($res =~ /cmd=warning/) {warno($ua,$prefix);} $res =~ /input value="(\d+)" type="hidden" name="st\.posted/; my $set = $1; $res =~ /&tkn=(\d+)\"/; my $tkn = $1; $res = $ua->post("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMessageCreateP&tkn=".$tkn, [ 'st.posted' => $set, 'st.friendId' => $fid, 'st.message' => cmes($text[int(rand($tsize))]), 'button_save' => '%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C' ] )->as_string; if($res =~ /recaptcha/) {(length($key) > 10) ? (captcha($ua,$res,$prefix)) : (goto AGAIN);} elsif($res =~ /cmd=warning/) {warno($ua,$prefix);} elsif($res =~ /чёрный список/) {lo(" blacklisted($mail)\n"); filter($mail); goto AGAIN} elsif($res =~ /"submit" name="button_cancel"/) {lo(" filtered\n"); ++$totl;} elsif($res =~ /=userMessageCreateP\&\;st\.message=/) {lo(" filtered\n");} elsif ($res =~ /window\.close\(\)/) {lo(" sent($mail)\n"); {lock($totl); ++$totl;}} else {lo(" error($mail)\n");} sleep($de); } --$page; } else {lo(" no friends ($mail)\n"); goto AGAIN;} } goto AGAIN; } else { sleep(1); my $people = $ua->get("http://$prefix.odnoklassniki.ru/dk?st.cmd=userFriendLive")->as_string; if($people =~ /recaptcha/) {captcha($ua,$people,$prefix);} if($people =~ /cmd=warning/) {warno($ua,$prefix);} if($people =~ /которые сейчас на сайте<\/h3>(.*?)Обновить<\/a>/s) { my $filtered = $1; while($filtered =~ /st\.friendId=(\d+)\&\;tkn=(\d+)">get("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMessageCreateP&st.friendId=$id")->as_string; if($res =~ /recaptcha/) {captcha($ua,$res,$prefix);} if($res =~ /cmd=warning/) {warno($ua,$prefix);} $res =~ /input value="(\d+)" type="hidden" name="st\.posted/; my $set = $1; $res =~ /&tkn=(\d+)\"/; $tkn = $1; my $url = $tp ? ("http://$prefix.odnoklassniki.ru/dk?st.cmd=userFriendAdd&tkn=$tkn") : ("http://$prefix.odnoklassniki.ru/dk?st.cmd=userMessageCreatePS&tkn=$tkn"); $res = $ua->post($url, [ 'st.posted' => $set, 'st.friendId' => $id, 'st.message' => cmes($text[int(rand($tsize))]), 'button_save' => '%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C' ] )->as_string; if($res =~ /recaptcha/) {(length($key) > 10) ? (captcha($ua,$res,$prefix)) : (goto AGAIN);} elsif($res =~ /cmd=warning/) {warno($ua,$prefix);} elsif($res =~ /чёрный список/) {lo(" blacklisted($mail)\n"); filter($mail); goto AGAIN} elsif($res =~ /window\.close\(\)|st\.notify=true/) { {lock($totl); ++$totl;} lo(" sent($mail)\n"); {lock(@tokens); push(@tokens, $id);} open(TL, ">>$tl") || print("Could not open tokens file!"); flock(TL, LOCK_EX); print TL $id."\n"; flock(TL, LOCK_UN); close(TL); } else { lo(" error($mail)\n");} ++$counter; sleep($de); ($counter > 20) ? (goto AGAIN) : (); } } } else {lo(" Can't get online userlist\n"); sleep($de); ++$eli;} if($eli>20) {sleep(5); goto AGAIN;} } } } ####################################################################### 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) = @_; if(scalar @ccap == scalar @data) {die("No more valid accounts for this thread\n");} if(scalar @data == 0) {die("No more valid accounts for this thread\n");} my $acc = ''; {lock(@data); $acc = ($tp > 1) ? (shift(@data)) : ($data[$seed % $size]);} 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; my ($sid) = $res =~ /jsessionid=([a-zA-z0-9_]+)\?/; $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,$sid; } else { filter($acc); return 0; } } else { lo(" [+]$mail\n"); return $prefix,$acc,$sid; } } else { lo(" [-]$mail\n"); filter($acc); 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 filter { my($acc) = @_; {lock(@ccap); push(@ccap, $acc); undef %saw; @ccap = grep(!$saw{$_}++, @ccap);} } ####################################################################### 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()." @_"; if($lg) { open (F, ">>log.txt"); flock(F, LOCK_EX); print F @_; print F "< sent $totl messages >\n"; flock(F, LOCK_UN); close(F); } print "\r"; } ####################################################################### 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']); } ####################################################################### sub cmes { my ($data)=@_; my @tags = ('', '', ''); my %hash = ('а' => 'a', 'А' => 'A', 'В' => 'B', 'Е' => 'E', 'Н' => 'H', 'о' => 'o', 'О' => 'O', 'р' => 'p', 'Р' => 'P', 'е' => 'e', 'М' => 'M', 'К' => 'K', 'Т' => 'T', 'с' => 'c', 'С' => 'C', 'х' => 'x', 'Х' => 'X', 'З' => '3'); foreach my $key (keys %hash) { if(int(rand(2)) == int(rand(3))) { $data =~ s/$key/$hash{$key}/g; } } my $seed = int(rand(scalar @tags)); $data =~ s/ / $tags[$seed]/; return $data; } ####################################################################### $time = time-$time; printf "Completed at ".localtime()."\n"; printf "Total sent $totl messages\n"; printf "Time Elapsed: $time sec\n"; ####################################################################### #(c)Kaimi