#!/usr/bin/perl # (c) dimio (http://dimio.org) # homepage: http://dimio.org/?p=827 require 5.008_008; use warnings; use strict; use utf8; use Carp; use LWP::UserAgent; use HTTP::Cookies; local $| = 1; my $VERSION = 0.02; my $options = { #логин и пароль от ЖЖ аккаунта, под именем которого #будет работать скрипт lj_login => 'test', lj_pwd => 'test', #путь к файлу с именами пользователей ЖЖ, #см. http://dimio.org/lj-mass-add-remove-friends/comment-page-1#comment-17290 lj_users_file => './lj-users.txt', #сколько пользователей ЖЖ обойти за один запуск скрипта lj_users_cnt => 500, }; #====================================================================# my $ua = create_browser(); open( my $ljusers_fh, '+<:encoding(UTF-8)', $options->{lj_users_file} ) or croak "Can't open $options->{lj_users_file} : $! $/"; my @lj_users = <$ljusers_fh>; close($ljusers_fh) or croak "Unable to close $options->{lj_users_file} : $! $/"; login_lj( $options->{lj_login}, $options->{lj_pwd} ); for ( 1 .. $options->{lj_users_cnt} ) { my $lj_user = shift @lj_users || 'dimio-blog'; chomp $lj_user; get_lj_user_profile($lj_user); } open( $ljusers_fh, '>:encoding(UTF-8)', $options->{lj_users_file} ) or croak "Can't open $options->{lj_users_file} : $! $/"; print {$ljusers_fh} @lj_users; close($ljusers_fh) or carp "Unable to close $options->{lj_users_file} : $! $/"; loguot_lj( $options->{lj_login} ); exit; #====================================================================# sub get_lj_user_profile { my $lj_user = shift; my $response = $ua->get( 'http://' . $lj_user . '.livejournal.com/profile' ); carp $response->status_line . "$/" unless $response->is_success; # задержка между обработкой каждого профиля # от 0 до N сек, где N = 2 sleep( int( rand(2) ) ); return $response->status_line; } sub loguot_lj { my $lj_login = shift; my $response = $ua->post( 'http://www.livejournal.com/logout.bml', [ 'user' => $lj_login, ] ); carp $response->status_line . "$/" unless $response->is_success; return $response->status_line; } sub login_lj { my ( $lj_login, $lj_pwd ) = @_; my $response = $ua->post( 'http://www.livejournal.com/login.bml?ret=1', [ 'mode' => 'login', 'user' => $lj_login, 'password' => $lj_pwd, ] ); croak $response->status_line . "$/" unless $response->is_success; return $response->status_line; } sub create_browser { my $browser = LWP::UserAgent->new( 'agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.11)' . 'Gecko/2009060215 Firefox/3.0.11)', 'cookie_jar' => HTTP::Cookies->new( 'file' => './cookies.lwp', 'autosave' => 0, ), 'requests_redirectable' => [ 'GET', 'POST' ], ); $browser->default_header( 'Accept' => 'text/html, application/xml;q=0.9, ' . 'application/xhtml+xml, image/png, image/jpeg, image/gif, ' . 'image/x-xbitmap, */*;q=0.1', 'Accept-Charset' => 'utf-8; *;q=0.1', 'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3', 'Accept-Encoding' => 'deflate, gzip, x-gzip, identity, *;q=0', ); # при таймауте свыше 2 минут - закрывать соединение $browser->timeout(120); return $browser; }