Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!usr/bin/env perl
- ###############
- ### Modulos ###
- ###############
- use common::sense;
- use WWW::Mechanize; # Ja tem os cookies automaticos
- use WWW::Mechanize::DecodedContent; # Plugin que adiciona o decoded_content
- use JSON -support_by_pp;
- use URI::Escape;
- use threads;
- use threads::shared;
- #########################
- ### Variáveis globais ###
- #########################
- my ($login, $senha, $token);
- my (@mensagemAcao, @mensagemReacao);
- my $url = WWW::Mechanize->new();
- ##########################
- ### Preparando log.txt ###
- ##########################
- my $time = localtime(time);
- open my $fileLog,">>". 'log.txt' or die "Cannot create file log.txt: $!";
- print $fileLog "\n---------------/ $time /---------------\n";
- close $fileLog;
- #######################
- ### Iniciando BOT ###
- #######################
- &login;
- sub login {
- #cookieuser
- if (-e 'login.txt') { # Caso tenha os dados de login salvos no computador, tentar acessar por eles
- print "Realizando login com os dados armazenados no 'login.txt'\n";
- my @linesFile;
- open FILE_LOGIN_LEITURA, "<" . 'login.txt' or die "Cannot open file: $!";
- @linesFile = <FILE_LOGIN_LEITURA>;
- close FILE_LOGIN_LEITURA;
- $login = @linesFile[0]; $senha = @linesFile[1];
- } else {
- print "Login: ";
- chomp ($login = <>);
- print "Senha: ";
- chomp ($senha = <>);
- }
- $url->get("http://www.forum-invaders.com.br/vb/login.php");
- $url->submit_form(
- fields => {
- vb_login_username => $login,
- vb_login_password => $senha,
- }
- );
- # Conferindo o LogIn
- if($url->decoded_content =~ /Bem-vindo/gi) {
- print "Bem-vindo, $login\n";
- &logado;
- } else {
- $url->decoded_content =~ /re">(.+?)<\/div>/s;
- &loginError($1);
- }
- }
- sub logado {
- # Lembrar de mim?
- if (!-e 'login.txt') {
- print "Deseja salvar seu login e senha? (s/n) \n";
- chomp (my $resposta = <>);
- if ($resposta eq 's') {
- open FILE_LOGIN_ESCRITA,">". 'login.txt' or die "Cannot create file login.txt: $!";
- print FILE_LOGIN_ESCRITA "$login\n$senha\n";
- close FILE_LOGIN_ESCRITA;
- }
- }
- # Realizar leitura do arquivo mensagens.txt
- &parseMensagens;
- # Exibir os avisos do chat
- my $chatDecorde = $url->get("http://www.forum-invaders.com.br/vb/vbshout.php?type=activeusers&do=ajax&action=fetch&instanceid=2")->decoded_content;
- $chatDecorde =~ /y":"(.+?)(",)/;
- print "Avisos do chat: $1 \n\n";
- # Definindo as variáveis antes de iniciar o loop
- my $content = $url->get("http://www.forum-invaders.com.br/vb/forum.php")->decoded_content;
- $content =~ /SECURITYTOKEN = "(.*?)"/g;
- $token = $1;
- my $work = 1;
- my @old;
- my $num = 0;
- # Thread para a leitura das mensagens do chat
- threads->create( sub {
- while ($work == 1) {
- my $r = $url->get("http://www.forum-invaders.com.br/vb/vbshout.php?type=activeusers&do=ajax&action=fetch&instanceid=2");
- my $json = JSON->new->relaxed;
- my $s = $json->decode($r->decoded_content);
- my $time = $s->{"shouts"}->{0}->{"time"}; my $shoutid = $s->{"shouts"}->{0}->{"shoutid"};
- my $msg = $s->{"shouts"}->{0}->{"message_raw"}; my $user = $s->{"shouts"}->{0}->{"musername"};
- my $pmuser = $s->{"shouts"}->{0}->{"pmuser"};
- # Caso o nick tenha TAGs HTML, serão removidas
- my $name;
- if ($user =~ />(.+)<\/span/gi) {$name = $1;}
- else {$name = $user}
- # Essa rotina implementei para evitar ficar repetindo mensagens
- if ($num == 0) {
- &logChat($time, $shoutid, $num, $name, $pmuser, $msg);
- push (@old, $msg);
- $num++;
- }
- elsif($old[$num - 1] ne $msg) {
- &logChat($time, $shoutid, $num, $name, $pmuser, $msg);
- push (@old, $msg);
- $num++;
- # Rotina para responder uma mensagem se tiver alguma relação pré-definida
- for (my $i = 0; $i <= @mensagemAcao; $i++) {
- if ($msg =~ /$mensagemAcao[$i]/gi) {
- my $msg = uri_escape(@mensagemReacao[$i]);
- $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
- message => $msg, securitytoken => $token,
- do => "ajax", action => "save", instanceid => "2"});
- }
- }
- }
- sleep(3);
- }
- } );
- &comandTime;
- }
- # comandTime -> após a realização de todas as ações pré-meditares, o usuário poderá enviar comandos
- sub comandTime {
- chomp (my $input = <>);
- my ($comand) = $input =~ /^(\w*)/;
- # c
- if ($comand eq 'c') { # Enviar uma mensagem para o *c*hat
- my ($msgText) = $input =~ /^[\s\S]*? ([\s\S]*)/;
- $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
- message => $msgText, securitytoken => $token,
- do => "ajax", action => "save", instanceid => "2"});
- # lar
- } elsif ($comand eq 'lar') { # Comandos referentes a *l*ista de *a*ção-*r*eação
- my ($arg) = $input =~ /^[\s\S]*? (\w+)/;
- if ($arg eq 'reload') { # Relê o arquivo da ista de ação-reação
- @mensagemAcao = (); @mensagemReacao = ();
- &parseMensagens;
- } elsif ($arg eq 'list') { # Listar os itens nas variáveis de ação-reação
- for (my $i = 0; $i <= @mensagemAcao; $i++) {
- $i++;
- print "@mensagemAcao[$i] @mensagemReacao[$i]\n";
- }
- } else {
- print "Informe um argumento!\n" .
- " * reload -> Relê o arquivo da ista de ação-reação\n" .
- " * list -> Listar os itens nas variáveis de ação-reação\n";
- }
- # logs
- } elsif ($comand eq 'logs') { # Comandos referentes aos *logs*
- my ($arg) = $input =~ /^[\s\S]*? (\w+)/;
- if ($arg eq 'delete') { # Apaga o arquivo de logs
- unlink('log.txt');
- } elsif ($arg eq 'list') { # Listar o conteúdo do arquivo de logs
- open $fileLog,"<". 'log.txt' or die "Cannot create file log.txt: $!";
- while (<$fileLog>) {
- print "$_\n";
- }
- close $fileLog;
- } else {
- print "Informe um argumento!\n" .
- " * delete -> Apaga o arquivo de logs\n" .
- " * list -> Listar o conteúdo do arquivo de logs\n";
- }
- # ...
- } else {
- print "Erro: Comando $comand não reconhecido!\n" .
- "Lista de comandos disponíveis:\n" .
- " * c -> Enviar uma mensagem para o *c*hat\n" .
- " * lar -> Comandos referentes a *l*ista de *a*ção-*r*eação\n" .
- " * logs -> Comandos referentes aos *logs*\n";
- }
- &comandTime;
- }
- # parseMensagens -> leitura do arquivo mensagens.txt, o responsável pela lista de Ação-Reação
- sub parseMensagens {
- my ($acao, $reacao);
- if (-e 'mensagens.txt') {
- open my $fileMensagens, "<" . 'mensagens.txt' or die "Cannot open file: $!";
- while (<$fileMensagens>) {
- ($acao, $reacao) = split(/\t+/, $_);
- push (@mensagemAcao, $acao);
- push (@mensagemReacao, $reacao);
- }
- close $fileMensagens;
- print "Leitura da lista de Ação-Reação feita!\n";
- } else {
- print "Erro: Você não tem o arquivo 'mensagens.txt'! Crie e configure conforme o tópico informa!\n";
- }
- }
- # logChat -> formatar a mensagem do chat e a salva no log
- sub logChat {
- print "$_[0] <$_[4]> $_[3]: $_[5]\n";
- open $fileLog,">>". 'log.txt' or die "Cannot create file log.txt: $!";
- print $fileLog "$_[2] ($_[1]) | $_[0] <$_[4]> $_[3]: $_[5]\n";
- close $fileLog;
- }
- # loginError -> chamado em caso de erro ao tentar logar
- sub loginError {
- print "Erro ao realizar login!\n";
- print "Mensagem de erro: @_\n";
- print "Tentar realizar login novamente? (s/n)\n";
- chomp (my $resposta = <>);
- if ($resposta eq 's') {
- &login;
- }
- }
- __END__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement