#!/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;
}