Advertisement
KeplerBR

BOT Chat Forum-Invader - 14/12/12

Dec 14th, 2012
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.25 KB | None | 0 0
  1. #!usr/bin/env perl
  2.  
  3. ###############
  4. ### Modulos ###
  5. ###############
  6. use common::sense;
  7. use WWW::Mechanize; # Ja tem os cookies automaticos
  8. use WWW::Mechanize::DecodedContent; # Plugin que adiciona o decoded_content
  9. use JSON -support_by_pp;
  10. use URI::Escape;
  11.  
  12. use threads;
  13. use threads::shared;
  14.  
  15. #########################
  16. ### Variáveis globais ###
  17. #########################
  18. my ($login, $senha, $token);
  19. my (@mensagemAcao, @mensagemReacao);
  20. my $url = WWW::Mechanize->new();
  21.  
  22. ##########################
  23. ### Preparando log.txt ###
  24. ##########################
  25. my $time = localtime(time);
  26. open my $fileLog,">>". 'log.txt' or die "Cannot create file log.txt: $!";
  27. print $fileLog "\n---------------/ $time /---------------\n";
  28. close $fileLog;
  29.  
  30.  
  31. #######################
  32. ###  Iniciando BOT  ###
  33. #######################
  34.  
  35. &login;
  36.  
  37. sub login {
  38.     #cookieuser
  39.     if (-e 'login.txt') { # Caso tenha os dados de login salvos no computador, tentar acessar por eles
  40.         print "Realizando login com os dados armazenados no 'login.txt'\n";
  41.         my @linesFile;
  42.        
  43.         open FILE_LOGIN_LEITURA, "<" . 'login.txt' or die "Cannot open file: $!";
  44.         @linesFile = <FILE_LOGIN_LEITURA>;
  45.         close FILE_LOGIN_LEITURA;
  46.        
  47.         $login = @linesFile[0]; $senha = @linesFile[1];
  48.     } else {
  49.         print "Login: ";
  50.         chomp ($login = <>);
  51.         print "Senha: ";
  52.         chomp ($senha = <>);
  53.     }
  54.  
  55.     $url->get("http://www.forum-invaders.com.br/vb/login.php");
  56.      
  57.     $url->submit_form(
  58.         fields => {
  59.             vb_login_username => $login,
  60.             vb_login_password => $senha,
  61.         }
  62.     );
  63.      
  64.     # Conferindo o LogIn
  65.     if($url->decoded_content =~ /Bem-vindo/gi) {
  66.         print "Bem-vindo, $login\n";
  67.         &logado;
  68.     } else {
  69.         $url->decoded_content =~ /re">(.+?)<\/div>/s;
  70.         &loginError($1);
  71.     }
  72. }
  73.  
  74. sub logado {
  75.     # Lembrar de mim?
  76.     if (!-e 'login.txt') {
  77.         print "Deseja salvar seu login e senha? (s/n) \n";
  78.         chomp (my $resposta = <>);
  79.        
  80.         if ($resposta eq 's') {
  81.             open FILE_LOGIN_ESCRITA,">". 'login.txt' or die "Cannot create file login.txt: $!";
  82.             print FILE_LOGIN_ESCRITA "$login\n$senha\n";
  83.             close FILE_LOGIN_ESCRITA;
  84.         }
  85.     }
  86.  
  87.     # Realizar leitura do arquivo mensagens.txt
  88.     &parseMensagens;
  89.  
  90.     # Exibir os avisos do chat
  91.     my $chatDecorde = $url->get("http://www.forum-invaders.com.br/vb/vbshout.php?type=activeusers&do=ajax&action=fetch&instanceid=2")->decoded_content;
  92.     $chatDecorde =~ /y":"(.+?)(",)/;
  93.     print "Avisos do chat: $1 \n\n";
  94.      
  95.     # Definindo as variáveis antes de iniciar o loop
  96.     my $content = $url->get("http://www.forum-invaders.com.br/vb/forum.php")->decoded_content;
  97.     $content =~ /SECURITYTOKEN = "(.*?)"/g;
  98.     $token = $1;
  99.     my $work = 1;
  100.     my @old;
  101.     my $num = 0;
  102.  
  103.     # Thread para a leitura das mensagens do chat
  104.     threads->create( sub {
  105.         while ($work == 1) {
  106.             my $r = $url->get("http://www.forum-invaders.com.br/vb/vbshout.php?type=activeusers&do=ajax&action=fetch&instanceid=2");
  107.             my $json = JSON->new->relaxed;
  108.             my $s = $json->decode($r->decoded_content);
  109.             my $time = $s->{"shouts"}->{0}->{"time"};       my $shoutid = $s->{"shouts"}->{0}->{"shoutid"};
  110.             my $msg = $s->{"shouts"}->{0}->{"message_raw"}; my $user = $s->{"shouts"}->{0}->{"musername"};
  111.             my $pmuser = $s->{"shouts"}->{0}->{"pmuser"};
  112.             # Caso o nick tenha TAGs HTML, serão removidas
  113.                 my $name;
  114.                 if ($user =~ />(.+)<\/span/gi) {$name = $1;}
  115.                 else {$name = $user}
  116.             # Essa rotina implementei para evitar ficar repetindo mensagens
  117.                 if ($num == 0) {
  118.                     &logChat($time, $shoutid, $num, $name, $pmuser, $msg);
  119.                     push (@old, $msg);
  120.                     $num++;
  121.                 }
  122.                 elsif($old[$num - 1] ne $msg) {
  123.                     &logChat($time, $shoutid, $num, $name, $pmuser, $msg);
  124.                     push (@old, $msg);
  125.                     $num++;
  126.  
  127.                     # Rotina para responder uma mensagem se tiver alguma relação pré-definida
  128.                     for (my $i = 0; $i <= @mensagemAcao; $i++) {
  129.                         if ($msg =~ /$mensagemAcao[$i]/gi) {
  130.                             my $msg = uri_escape(@mensagemReacao[$i]);
  131.                             $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
  132.                             message => $msg, securitytoken => $token,
  133.                             do => "ajax", action => "save", instanceid => "2"});
  134.                         }
  135.                     }
  136.                 }
  137.             sleep(3);
  138.         }
  139.     } );
  140.  
  141.     &comandTime;
  142. }
  143.  
  144. # comandTime -> após a realização de todas as ações pré-meditares, o usuário poderá enviar comandos
  145. sub comandTime {
  146.     chomp (my $input = <>);
  147.  
  148.     my ($comand) = $input =~ /^(\w*)/;
  149.  
  150.     # c
  151.     if ($comand eq 'c') { # Enviar uma mensagem para o *c*hat
  152.         my ($msgText) = $input =~ /^[\s\S]*? ([\s\S]*)/;
  153.         $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
  154.         message => $msgText, securitytoken => $token,
  155.         do => "ajax", action => "save", instanceid => "2"});
  156.  
  157.     # lar
  158.     } elsif ($comand eq 'lar') { # Comandos referentes a *l*ista de *a*ção-*r*eação
  159.         my ($arg) = $input =~ /^[\s\S]*? (\w+)/;
  160.         if ($arg eq 'reload') { # Relê o arquivo da ista de ação-reação
  161.             @mensagemAcao = (); @mensagemReacao = ();
  162.             &parseMensagens;
  163.         } elsif ($arg eq 'list') { # Listar os itens nas variáveis de ação-reação
  164.             for (my $i = 0; $i <= @mensagemAcao; $i++) {
  165.                 $i++;
  166.                 print "@mensagemAcao[$i]    @mensagemReacao[$i]\n";
  167.             }
  168.         } else {
  169.             print "Informe um argumento!\n" .
  170.                   " * reload -> Relê o arquivo da ista de ação-reação\n" .
  171.                   " * list -> Listar os itens nas variáveis de ação-reação\n";
  172.         }
  173.  
  174.     # logs
  175.     } elsif ($comand eq 'logs') { # Comandos referentes aos *logs*
  176.         my ($arg) = $input =~ /^[\s\S]*? (\w+)/;
  177.         if ($arg eq 'delete') { # Apaga o arquivo de logs
  178.             unlink('log.txt');
  179.         } elsif ($arg eq 'list') { # Listar o conteúdo do arquivo de logs
  180.             open $fileLog,"<". 'log.txt' or die "Cannot create file log.txt: $!";
  181.             while (<$fileLog>) {
  182.                 print "$_\n";
  183.             }
  184.             close $fileLog;
  185.         } else {
  186.             print "Informe um argumento!\n" .
  187.                   " * delete -> Apaga o arquivo de logs\n" .
  188.                   " * list -> Listar o conteúdo do arquivo de logs\n";
  189.         }
  190.  
  191.     # ...
  192.     } else {
  193.         print "Erro: Comando $comand não reconhecido!\n" .
  194.               "Lista de comandos disponíveis:\n" .
  195.               " * c -> Enviar uma mensagem para o *c*hat\n" .
  196.               " * lar -> Comandos referentes a *l*ista de *a*ção-*r*eação\n" .
  197.               " * logs -> Comandos referentes aos *logs*\n";
  198.     }
  199.  
  200.     &comandTime;
  201. }
  202.  
  203. # parseMensagens -> leitura do arquivo mensagens.txt, o responsável pela lista de Ação-Reação
  204. sub parseMensagens {
  205.     my ($acao, $reacao);
  206.     if (-e 'mensagens.txt') {
  207.         open my $fileMensagens, "<" . 'mensagens.txt' or die "Cannot open file: $!";
  208.         while (<$fileMensagens>) {
  209.             ($acao, $reacao) = split(/\t+/, $_);
  210.             push (@mensagemAcao, $acao);
  211.             push (@mensagemReacao, $reacao);
  212.         }
  213.         close $fileMensagens;
  214.         print "Leitura da lista de Ação-Reação feita!\n";
  215.     } else {
  216.         print "Erro: Você não tem o arquivo 'mensagens.txt'! Crie e configure conforme o tópico informa!\n";
  217.     }
  218. }
  219.  
  220. # logChat -> formatar a mensagem do chat e a salva no log
  221. sub logChat {
  222.     print "$_[0] <$_[4]> $_[3]: $_[5]\n";
  223.  
  224.     open $fileLog,">>". 'log.txt' or die "Cannot create file log.txt: $!";
  225.     print $fileLog "$_[2] ($_[1]) | $_[0] <$_[4]> $_[3]: $_[5]\n";
  226.     close $fileLog;
  227. }
  228.  
  229. # loginError -> chamado em caso de erro ao tentar logar
  230. sub loginError {
  231.     print "Erro ao realizar login!\n";
  232.     print "Mensagem de erro: @_\n";
  233.     print "Tentar realizar login novamente? (s/n)\n";
  234.     chomp (my $resposta = <>);
  235.        
  236.     if ($resposta eq 's') {
  237.         &login;
  238.     }
  239. }
  240.  
  241. __END__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement