Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 20th, 2010 | Syntax: Perl | Size: 4.40 KB | Hits: 27 | Expires: Never
This paste has a previous version, view the difference. Copy text to clipboard
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4. use strict;
  5. use utf8;
  6. use open qw(:std :utf8);
  7.  
  8. use WWW::Mechanize;
  9.  
  10. my $USER   = "";                                #Адрес элетронной почты
  11. my $PASS   = "";                                #Пароль
  12. my $LOGIN = "http://vkontakte.ru/login.php";    #Страница логина
  13. my $FRIENDS = "http://vkontakte.ru/friends.php";#Страница со списком друзей
  14. my $PTGT = "http://vkontakte.ru/id";            #Страница пользователя
  15. my $PWALL = "http://vkontakte.ru/wall.php";     #Страница отправки сообщений
  16. my $INTERVAL = 2;                               #Время ожидания
  17. my $MESSAGE = "НЛО прилетело и оставило эту запись."; #Сообщение
  18.  
  19. my $bot = WWW::Mechanize -> new(-agent=>'march/8.0', -cookie=>{} );
  20.  
  21. #
  22. # На странице со списком друзей валяется json массив, который полностью передаётся с сервера
  23. # при загрузке страницы. Больше нам от нёё ничего не надо.
  24. # Эта функция вернёт нам json массив.
  25. #
  26.  
  27. sub get_json() {
  28.     $bot -> get($LOGIN);
  29.     if ( $bot -> success() ) {
  30.         $bot -> form_id("login");
  31.         $bot -> field("email", $USER);
  32.         $bot -> field("pass", $PASS);
  33.         $bot -> submit();
  34.         $bot -> submit();
  35.         if ( $bot -> success() ) {
  36.             print "Loggen in\n";
  37.             $bot -> get($FRIENDS);
  38.             if ( ( $bot->success() ) && ( $bot->content =~ /var friendsData = ({.*?});/ ) ) {
  39.                 print "Got friends list\n\n";
  40.                 return $1;
  41.                 print 1;
  42.             }
  43.         }
  44.     }
  45. }
  46.  
  47. #
  48. # Вообще, для того, чтобы распарсить json есть и более элегантные способы.
  49. # Но мне нужен был только список друзей.
  50. #
  51.  
  52. sub get_id() {
  53.     my $json = get_json();
  54.     return my @id = $json =~ /\[(\d+),/g;
  55. }
  56.  
  57. #
  58. # Для отправки сообщения на стену необходимы два параметра
  59. # Первый -- to_id, его можно стянуть со страницы жертвы.
  60. # Это обычный id пользователя плюс пара другая цифр в конце.
  61. # С хэшем немного забавнее.
  62.  
  63. sub mk_hash($) {
  64.     #
  65.     #   POSTDATA=act=get10&wall_hash=fec33378c58fe25dba9517a1ac3063f6&wpage=100000&seed=1&fpage=2&mid=164301441911&n=3
  66.     #  
  67.     #   На самой стене: bba43ca1a7159abd52ef85c87333cefa326f360;
  68.     #  
  69.     #
  70.     #   Т.е. с восьмого с конца до четвёртого с начала + с конца до пятого с конца;
  71.    
  72.     my $expr  = reverse shift();
  73.     my $hash  = substr ( $expr, 8, 27);
  74.        $hash .= substr ( $expr, 0, 5);
  75.     return $hash;
  76. }  
  77.  
  78.  
  79. sub congrat_them() {
  80.     my @id = get_id();      #Получаем список друзей.
  81.     foreach (@id) {
  82.         $,="/n";
  83.         sleep $INTERVAL;    #Подождём, чтобы не нарваться на капчу.
  84.         $bot -> get($PTGT.$_);
  85.         if ( $bot -> content() =~ /<a .*?>женский<\/a>/ ) {  #Поздравлять будет только тёток.
  86.             print $bot-> title()."\n";
  87.             print "id = $_.\n";
  88.             $bot-> content() =~ /<input type="hidden" id="to_id" name="to_id" value="(\d+)"\/>/;
  89.             my $to_id = $1;                                   # Выдираем to_id
  90.             $bot-> content() =~ /decodehash\('([a-z0-9]+)'\)/;
  91.             my $hash = $1;                                    # Ищем хэш, который фигурирует на стене
  92.             my $wall_hash = mk_hash($1);                      # Делаем из него тот, что нужен для отправки сообщения
  93.             print "Found hash: ".$hash.";\nTrue hash: ".$wall_hash.";\nmid: ".$to_id.";\n\n";
  94.             $bot->post($PWALL, [
  95.                                 "to_id" => $to_id,
  96.                                 "act" => "sent",
  97.                                 "wall_hash" => $wall_hash,
  98.                                 "message" => $MESSAGE
  99.                                 ]); #Шлём сообщение.
  100.         }
  101.     }
  102. }
  103.  
  104. congrat_them();