Página 1 de 3 123 ÚltimoÚltimo
Resultados 1 a 10 de 23

Tópico: [TUTORIAL] Bot shoutbox FI

  1. #1
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like

    [TUTORIAL] Bot shoutbox FI

    Ola Monges Invaders.

    Hoje vou compartilhar com vocês um bot simples para o shoutbox (chat) do Fórum Invaders (FI). Presumirei que vocês mesmo saibam como encontrara pagina do JSON onde contem as mensagens e usuários, pois seria tema para um outro assunto já que a conversa é longa. Aqui vamos focar no uso de alguns módulos famosos e/ou importante.

    Primeiramente vamos entender como conectar site e obter o conteúdo do mesmo e ate fazer login.

    Se fosse apenas obter o conteúdo poderia usar o LWP::Simple, mas como vamos alem, como manipular ele, vou usar um navegador completo, para isso tem varias opções, inclusive o LWP::UserAgent, mas nesse caso prefiro o WWW::Mechanize, e é neste que vou me basear.

    Código PHP:
    #!usr/bin/env perl
     
    use common::sense;
    use 
    WWW::Mechanize;  #Ja tem os cookies automáticos
     
    print "Login: ";
    chomp (my $login = <>);
    print 
    "Senha: ";
    chomp (my $senha = <>);
     
    my $url WWW::Mechanize->new();
    $url->get("http://www.forum-invaders.com.br/vb/login.php");
     
    $url->submit_form(
        
    fields => { 
            
    vb_login_username => $login,
            
    vb_login_password => $senha,
        }
    ); 
    Para se manter conectado, uma sessão mantêm cookies, uma das vantagens do WWW::Mechanize é que ele é um navegador completo, se eu tivesse usado o LWP::UserAgent uma das coisas que eu seria obrigado a fazer para manter a sessão é usar o HTTP::Cookies.

    ‘ vb_login_username’ e ’vb_login_password’ indicam os forms do login e da senha na pagina http://www.forum-invaders.com.br/vb/login.php.

    Usando POST insiro a senha e o login, usando o LWP::UserAgent ficaria um pouco mais ilegível, algo como:

    Código PHP:
    use common::sense;
    use 
    HTTP::Cookies;
    use 
    LWP::UserAgent;
     
    my $url LWP::UserAgent->new();
    require 
    HTTP::Cookies;
    $url->cookie_jar(HTTP::Cookies->new(file => "$ENV{HOME}/.cookies.txt"));
    $url->post('http://www.forum-invaders.com.br/vb/login.php', {
    vb_login_username => 'nome'vb_login_password => senha',}); 
    A vantagem do LWP::UserAgent é que ele tem o método ‘decoded_content’ muito eficiente e o WWW::Mechanize tem apenas o ‘decoded’ que por sua vez não é tão eficiente, para isso temos um plugin muito simples, eficaz e leve, pois o autor não gastou mais que 14 linhas de eu tirar o desnecessário, poderia se ate incluído como sub-rotina no próprio programa, o nome desse plugin é WWW::Mechanize:ecodedContent, abaixo o código simplificado dele.

    Código PHP:
    use strict;
    use 
    Encode ();
    use 
    HTTP::Response::Encoding;
    sub WWW::Mechanize::decoded_content {
        
    my $mech shift;
        
    my $content $mech->content(@_);
        return 
    $content unless $mech->{ct} && $mech->{ct} =~ m!^text/!i;
        return 
    $content if Encode::is_utf8($content);
        if (
    my $enc $mech->res->encoding) {
            return 
    Encode::decode($enc$content);
        } else {
            return;
        }

    Agora podemos verificar se a conexão foi ou não bem sucedida.

    Código PHP:
    if($url->decoded_content !~ /Bem-vindo/gi){ print "Loggin Error\n";}
    else {print 
    "Login OK!\n";} 
    Agora podemos seguir por dois caminhos: Enviar mensagens; Receber mensagens.

    Para enviar mensagens, você precisa obter o conteúdo da pagina ‘http://www.forum-invaders.com.br/vb/...&instanceid=2’, o detalhe é que esse conteúdo está no formato JSON para isso a leitura é facilitada pelo modulo JSON.

    Os parâmetros para se obter do JSON são "musername" e "message_raw" que são respectivamente nome do usuário e mensagem. Logo ficaria mais ou menos assim:

    Código PHP:
    use JSON -support_by_pp;
     
    my $json JSON->new->relaxed;
    my $s $json->decode($r->decoded_content);
    my $msg $s->{"shouts"}->{0}->{"message_raw"};
    my $user $s->{"shouts"}->{0}->{"musername"}; 
    Mensagens devem ser enviadas via método POST, mas irá precisar do SECURITYTOKEN, o SECURITYTOKEN é uma chave que é renovada a cada nova seção e que define as suas permissões, e pode ser obtido no código fonte de qualquer pagina do forum.

    Preferencialmente as mensagens devem ser escapadas, e para isso eu sugiro o modulo URI::Escape.

    Código PHP:
    use URI::Escape;
     
    $content =~ /SECURITYTOKEN "(.*?)"/#obtem o Token
    my $token = $1;
    my $msg uri_escape('ola'); #escapa a mensagem
    $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
    message => $msgsecuritytoken => $token,
    do => 
    "ajax"action => "save"instanceid => "2"});

    Pronto, com isso você pode montar seu bot da forma que preferir, a seguir um exemplo simples e completo de como poderá ficar o seu bot.

    Código PHP:
    #!usr/bin/env perl
     
    ###############
    ### Modulos ###
    ###############
    use common::sense;
    use 
    WWW::Mechanize#Ja tem os cookies automaticos
    use WWW::Mechanize::DecodedContent#plugin que add o decoded_content
    use JSON -support_by_pp;
    use 
    URI::Escape;
     
    ###############
    ###  LogIn  ###
    ###############
     
    print "Login: ";
    chomp (my $login = <>);
    print 
    "Senha: ";
    chomp (my $senha = <>);
     
    my $url WWW::Mechanize->new();
    $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 "Loggin Error\n";}
    else {print 
    "Login OK!\n";}
     
     
     
    open OUT,">"'log.txt' or die "Cannot create file: $!";
    my $content $url->decoded_content;
    my $work 1;
    my @old;
    my $num 0;
    # Loop para atualizar as mensagens e guardar-las em um arquivo
    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 $msg $s->{"shouts"}->{0}->{"message_raw"};
                    
    # Aqui defino quando o bot vai se manifestar selecionando palavras chaves
                    
    if (($msg =~ /acpguedes/gi) or ($msg =~ /acp/gi) or ($msg =~ /guedes/gi) or ($msg =~ /perl/gi) || 
                    (
    $msg =~ /perlzista/gi) or ($msg =~ /perlzeiro/gi) or ($msg =~ /CPAN/gi) or ($msg =~ /cpan/gi)){
                                   print 
    "\a" x 15;
                                   
    $content =~ /SECURITYTOKEN "(.*?)"/;
                                   
    my $token = $1;
                                   
    my $msg uri_escape('ola');
                    
    $url->post("http://www.forum-invaders.com.br/vb/vbshout.php",{
                    
    message => $msgsecuritytoken => $token,
                    do => 
    "ajax"action => "save"instanceid => "2"});
                    }
                    
    my $user $s->{"shouts"}->{0}->{"musername"};
                    
    my $name;
                    if (
    $user =~ />(.+)<\/span/gi) {$name = $1;}
                    else {
    $name $user}
                    
    my $now join(" => "$name$msg);
                    
    # Essa rotina implementei para evitar ficar repetindo mensagens
                    
    if ($num == 0){
                                   print 
    $num "\n" "#" x 80 "\n" $now "\n" "#" x 80 "\n";
                                   print 
    OUT $num "\n" "#" x 80 "\n" $now "\n" "#" x 80 "\n";
                                   
    push (@old$now);
                                   
    $num++;
                    }
                    
    elsif($old[$num 1ne $now){
                                   print 
    $num "\n" "#" x 80 "\n" $now "\n" "#" x 80 "\n";
                                   print 
    OUT $num "\n" "#" x 80 "\n" $now "\n" "#" x 80 "\n";
                                   
    push (@old$now);
                                   
    $num++;
                                  
                    }
    }
    close OUT;
     
    __END__ 
    Existem uma imensa gama de possibilidades agora, ate IA pensei em implementar.

    Espero que aproveitem.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  2. #2
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Errata (moderador, se puder corrigir):

    Agora podemos verificar se a conexão foi ou não bem sucedida.

    Código PHP:
    use WWW::Mechanize::DecodedContent;
    if(
    $url->decoded_content !~ /Bem-vindo/gi){ print "Loggin Error\n";}
    else {print 
    "Login OK!\n";} 
    Agora podemos seguir por dois caminhos: Enviar mensagens; Receber mensagens.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  3. #3
    Membro Avançado ingresso
    Data de Ingresso
    Dec 2011
    Localização
    !/usr/bin/env perl
    Posts
    868
    Post Thanks / Like
    Vlw, deu para aprender bastante ^^
    Gostei do método de login, serve para outras situações também xD


    Só resta saber se a staff do fórum vai ficar feliz com isso kk
    Já bastou o Wap burlar o chat na versão desatualizada

  4. #4
    Veterano ingresso
    Data de Ingresso
    Jan 2011
    Localização
    Pguá ~ PR
    Posts
    2.363
    Post Thanks / Like
    Bacana a iniciativa. Em uma eventual versão pretende adicionar uma interface gráfica a esse seu projeto?

  5. #5
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Citação Postado originalmente por r00t_5tr1k3r Ver Post
    Bacana a iniciativa. Em uma eventual versão pretende adicionar uma interface gráfica a esse seu projeto?
    Estou tentando, mas estou tendo um pouco de problemas, o metodo update do Tk é pessimo. Mas em breve estarei disponibilizando um chat completo.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  6. #6
    Membro Avançado ingresso
    Data de Ingresso
    Dec 2011
    Localização
    !/usr/bin/env perl
    Posts
    868
    Post Thanks / Like
    Resolvi fazer um upgrade no sistema.
    As principais novidades que implementei foram:
    • Listagem de Ação -> Reação (vou explicar melhor mais adiante)
    • Caso tenha problema ao realizar o login, informa a mensagem de erro
    • Realizar login automaticamente
    • Removi aquele beep que encomodava ¬¬'
    • Fixbug: as vezes, não realizava corretamente o login, mas o programa achava que tivesse sido feito direito

    Link para o código

    Sobre a listagem de Ação -> Reação...
    Trata-se de uma lista que você coloca a mensagem que recebe (ação) causará a seguinte reação (resposta). A ação deve esta separada por um TAB da reação.
    Por exemplo...
    Código:
    forum(TAB)invaderskaao    lindo
    Lembre-se de deixar uma linha em branco no final.

    Seguindo o exemplo, se alguém falar apenas kaao ou falar oia só o kaao aqui, a resposta será dada: lindo.



    Agradecimento ao Wap por me ajudar, principalmente no regexr =]

    Esqueci de falar um detalhe importante: a lista de ação e reação deve ser salva no mesmo diretório do código PL e com o nome de mensagens.txt


    Sobre o exemplo, o fórum quebrou a formatação... Era para ser:
    forum(TAB)invaders
    kaao lindo

    Última edição por guedes.acp; 10 Dec 2012 às 09:39.

  7. #7
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Muito bom ver que se interessou e que pode incrementar.

    Que tal agora desenvolver mais. Criar um delay para não estressar o servidor nem consumir sua banda.
    Fazer uma interface grafica.
    Gerador de log, para guardar as conversas.
    Um sistema para apontar se ficará como monitor, bot ou um sistema externo de interação com o chat.
    Fazer uma interface entre o bot e um robot online como o robo ed, assim ele pode passar o dia todo conversando,
    ou ate mesmo desenvolver um AI, perl tem modulos para AI.

    Bom trabalho, parabens.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  8. #8
    Membro Avançado ingresso
    Data de Ingresso
    Dec 2011
    Localização
    !/usr/bin/env perl
    Posts
    868
    Post Thanks / Like
    Aqui vai uma nova versão com algumas novidades interessantes =]


    • Agora é possível enviar comandos enquanto o bot roda (lista dos comandos mais abaixo)
    • Gravação das mensagens
    • Visualização das mensagens melhorada


    Link para o código


    Desenvolvi os seguintes comandos:
    • c ->Enviar uma mensagem para o chat
    • lar -> Comandos referentes a lista de ação-reação
      • reload -> Relê o arquivo da ista de ação-reação
      • list -> Listar os itens nas variáveis de ação-reação

    • logs -> Comandos referentes aos logs
      • delete -> Apaga o arquivo de log
      • list -> Listar o conteúdo do arquivo de logs




    Várias pessoas me ajudaram um pouco no desenvolvimento dessa nova versão:
    Bluedevil, Solos, Wap, rdxdt, acpguedes

  9. #9
    Veterano ingresso
    Data de Ingresso
    Jan 2011
    Localização
    Pguá ~ PR
    Posts
    2.363
    Post Thanks / Like
    KeplerBR, futuramente pretende se aventurar a criar um gestor gráfico para o projeto?
    bye

  10. #10
    Membro Avançado ingresso
    Data de Ingresso
    Dec 2011
    Localização
    !/usr/bin/env perl
    Posts
    868
    Post Thanks / Like
    Não, pois estou com diversos projetos que desejo trabalhar, e não da certo colocar mais um.

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •