#!/usr/bin/perl -w
#
# Травля гутника в комментах.
# Поиск последних комментов целевого жж-юзера (гутника)
# и отправка ответов на них (массив @phrases).
#
# Капча и иные подобные исключения не обрабатываются.
# Ставить в cron и радоваться :)
#
# Строку с указанием прокси раскомментировать при необходимости.
#
use strict;
use LWP::UserAgent;
use HTTP::Cookies;
use Compress::Zlib;

our $VERSION = 0.4;

my $lj_login = 'gutenberger';
my $lj_password = '123asdfg';
my $target = 'gutnik-rea%2C+gutnik-real';
#my $target_comment_search_link = 'http://blogs.yandex.ru/search.xml?text=&ft=comments&server=livejournal.com&author='.$target.'&holdres=mark';
my $target_comment_search_link = 'http://blogs.yandex.ru/search.xml?text=&ft=comments&link=&server=livejournal.com&from_day=&from_month=&from_year=&to_day=&to_month=&to_year=&whom=on&author='.$target.'&journal=&f_user=&geo=&gender=&age_from=&age_to=&music=&mood=&category=&suptest=';

my @phrases = (
'Поди на хуй, Гутник!',
'Гутник! На хуй иди!',
);

our $cookies = HTTP::Cookies->new('file'=>'./cookies.lwp','autosave'=>0);
my $browser = LWP::UserAgent->new('agent' => 'Opera/9.10 (X11; Linux i686; U; en)',
								  'cookie_jar' => $cookies,
								  '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' => 'iso-8859-1, utf-8, utf-16, *;q=0.1',
						'Accept-Language' => 'ru,en;q=0.9',
						'Accept-Encoding' => 'deflate, gzip, x-gzip, identity, *;q=0',
						);
#$browser->proxy(['http',], 'http://127.0.0.1:8118');

########## MAIN #############
my @comments = &YandexCommentParser();
&LJ_login($lj_login,$lj_password);
foreach (@comments){
  shift;
  my ($target_user,$target_post_id,$target_comment_id) = split(/,/);
	&PostComment($target_user,$target_post_id,$target_comment_id,\@phrases);
	sleep (int(rand(3))+2);
}

exit;

########## PROCEDURES ##########
sub PostComment($$$){
#print "$_[0]\t$_[1]\t$_[2]\n"; exit;
my ($target_user,$target_post_id,$target_comment_id,$phrases) = @_;

  my $response = $browser->get('http://'.$target_user.'.livejournal.com/'.$target_post_id.'.html?replyto='.$target_comment_id.'&format=light');
  my $source = Compress::Zlib::memGunzip(\($response->content)[0]);
	
	my ($lj_form_auth,$chal,$resp,$replyto,$parenttalkid,$chrp1) = ($1,$2,$3,$4,$5,$6) if ($source =~ m!name="lj_form_auth" value="(.+?)".+id='login_chal' value='(.+?)'.+id='login_response' value='(.*?)'.+name="replyto" value="(\d+?)".+name="parenttalkid" value="(\d+?)".+name="chrp1" value="(.+?)" /><table>!);
		
	$response = $browser->post('http://www.livejournal.com/talkpost_do.bml',
		[
		'lj_form_auth'	=> $lj_form_auth,
		'chal'			=> $chal,
		'response'		=> $resp,
		'replyto'		=> $replyto,
		'parenttalkid'	=> $parenttalkid,
		'itemid'		=> $target_post_id,
		'journal'		=> $target_user,
		'stylemine'		=> '',
		'chrp1'			=> $chrp1,
		'usertype'		=> 'cookieuser',
		'cookieuser'	=> $lj_login,
		'subject'		=> 'Гутник!',
		'body'			=> @{$phrases}[int(rand($#$phrases+1))],
		'submitpost'	=> 'Post Comment',
		'editid'		=> '0',
		]
	);
	do{print STDOUT "Connection error: ".$response->status_line,"\r\n";next;} unless $response->is_success;
}

sub LJ_login($$){
	my $response = $browser->post('http://www.livejournal.com/login.bml?ret=1',
    [
     'mode' => 'login',
     'user' => $lj_login,
     'password' => $lj_password,
    ]);
	do{print STDOUT "Connection error: ".$response->status_line,"\r\n";exit;} unless $response->is_success;
}

sub YandexCommentParser(){
  my @comments;
	my $response = $browser->get($target_comment_search_link);
	do{print STDOUT "Connection error: ".$response->status_line,"\r\n";exit;} unless $response->is_success;
	my $source = $response->content;
	while ($source =~ m#<a href="http://([\w\-]+?)\.livejournal\.com/(\d+)\.html\?thread=(\d+)"#gc){
		push (@comments, "$1,$2,$3");
	}
  return (@comments);
}