#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use open qw(:std :utf8);
use WWW::Mechanize;
my $USER = ""; #Адрес элетронной почты
my $PASS = ""; #Пароль
my $LOGIN = "http://vkontakte.ru/login.php"; #Страница логина
my $FRIENDS = "http://vkontakte.ru/friends.php";#Страница со списком друзей
my $PTGT = "http://vkontakte.ru/id"; #Страница пользователя
my $PWALL = "http://vkontakte.ru/wall.php"; #Страница отправки сообщений
my $INTERVAL = 2; #Время ожидания
my $MESSAGE = "НЛО прилетело и оставило эту запись."; #Сообщение
my $bot = WWW::Mechanize -> new(-agent=>'march/8.0', -cookie=>{} );
#
# На странице со списком друзей валяется json массив, который полностью передаётся с сервера
# при загрузке страницы. Больше нам от нёё ничего не надо.
# Эта функция вернёт нам json массив.
#
sub get_json() {
$bot -> get($LOGIN);
if ( $bot -> success() ) {
$bot -> form_id("login");
$bot -> field("email", $USER);
$bot -> field("pass", $PASS);
$bot -> submit();
$bot -> submit();
if ( $bot -> success() ) {
print "Loggen in\n";
$bot -> get($FRIENDS);
if ( ( $bot->success() ) && ( $bot->content =~ /var friendsData = ({.*?});/ ) ) {
print "Got friends list\n\n";
return $1;
print 1;
}
}
}
}
#
# Вообще, для того, чтобы распарсить json есть и более элегантные способы.
# Но мне нужен был только список друзей.
#
sub get_id() {
my $json = get_json();
return my @id = $json =~ /\[(\d+),/g;
}
#
# Для отправки сообщения на стену необходимы два параметра
# Первый -- to_id, его можно стянуть со страницы жертвы.
# Это обычный id пользователя плюс пара другая цифр в конце.
# С хэшем немного забавнее.
sub mk_hash($) {
#
# POSTDATA=act=get10&wall_hash=fec33378c58fe25dba9517a1ac3063f6&wpage=100000&seed=1&fpage=2&mid=164301441911&n=3
#
# На самой стене: bba43ca1a7159abd52ef85c87333cefa326f360;
#
#
# Т.е. с восьмого с конца до четвёртого с начала + с конца до пятого с конца;
my $expr = reverse shift();
my $hash = substr ( $expr, 8, 27);
$hash .= substr ( $expr, 0, 5);
return $hash;
}
sub congrat_them() {
my @id = get_id(); #Получаем список друзей.
foreach (@id) {
$,="/n";
sleep $INTERVAL; #Подождём, чтобы не нарваться на капчу.
$bot -> get($PTGT.$_);
if ( $bot -> content() =~ /<a .*?>женский<\/a>/ ) { #Поздравлять будет только тёток.
print $bot-> title()."\n";
print "id = $_.\n";
$bot-> content() =~ /<input type="hidden" id="to_id" name="to_id" value="(\d+)"\/>/;
my $to_id = $1; # Выдираем to_id
$bot-> content() =~ /decodehash\('([a-z0-9]+)'\)/;
my $hash = $1; # Ищем хэш, который фигурирует на стене
my $wall_hash = mk_hash($1); # Делаем из него тот, что нужен для отправки сообщения
print "Found hash: ".$hash.";\nTrue hash: ".$wall_hash.";\nmid: ".$to_id.";\n\n";
$bot->post($PWALL, [
"to_id" => $to_id,
"act" => "sent",
"wall_hash" => $wall_hash,
"message" => $MESSAGE
]); #Шлём сообщение.
}
}
}
congrat_them();