IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Php en perl, probleme html::parser


Sujet :

Langage Perl

  1. #21
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Merci pour toutes ces explications claires.

    voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     #!/usr/bin/perl -w
        use strict;
        use LWP::UserAgent;
        use HTML::Form;
        use warnings;
        use HTML::Parser;
        use Data::Dumper;
     
        # les paramètres personnels
        my ( $user, $pass ) = qw( login pass );
        my $base = 'http://XXXXX/cgi-bin/top.cgi';
     
        # initialisation de l'agent
        my $ua = LWP::UserAgent->new();
     
        # création de la requête
        my $req = HTTP::Request->new( GET => $base );
     
        # exécute la requête et reçoit la réponse
        my $res = $ua->request($req);
        die $res->status_line if not $res->is_success;
     
     
        # le formulaire de login est le premier formulaire de la page
        my $form = ( HTML::Form->parse( $res->content, $base ) )[0];
     
        # remplit les champs
        $form->find_input("txtAuthLoginUser")->value($user);
        $form->find_input("txtAuthLoginPassword")->value($pass);
     
     
        # valide et renvoie le formulaire
        #$ua->request( $form->click );
     
        my $validate = $ua->request( $form->click );
        my @page = $validate->content;
        print @page;
     
     
        my $gSSS;
        my $gRRR;
     
    	foreach my $l (@page){
          if($l =~ /\<input type/){
                ($gSSS) = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                ($gRRR) = $l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                print $l."\n".$gSSS."\n".$gRRR;
          }
    	}
    Maintenant mon objectif est d'activer le bouton suivant :




    Pour ce faire, j'ai écrit ce code ( juste avant ##valide et renvoie le formulaire
    #my $validate = $ua->request( $form->click ) )
    qui va sur la bonne page et prend ces valeurs normalement une fois le bouton ok activé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
          # remplit les champs
        $form->find_input("gPage")->value("maintenance");
        $form->find_input("gMode")->value("shutdown");
        $form->find_input("gType")->value("reboot");
     
    # trouve le champ nommé 'password'
        my $input1 = $form->find_input("txtAuthLoginUser")->value;
        my $input2 = $form->find_input("txtAuthLoginPassword")->value;
        my $input3 = $form->find_input('gPage')->value;
        my $input4 = $form->find_input("gMode")->value;
        my $input5 = $form->find_input("gType")->value;
        my $input6 = $form->find_input("gKey")->value;
        my $input7 = $form->find_input("gSSS")->value;
        my $input8 = $form->find_input("gRRR")->value;
        my $input9 = $form->find_input("hiddenDummyText")->value;
     
       #Affichage des variables
        print $input1. ' / '  .$input2.   ' / '   .$input3.  ' / '    .$input4.  ' / '   .$input5. ' / '  .$input6.   ' / '   .$input7.  ' / '    .$input8.  ' / ' .$input9;
    Mais le probleme c'est que le reboot ne se lance pas.

    Les variables input me donnent:

    login / pass / maintenance / shutdown / reboot / / / / dummy

    voici les valeurs affichés par print @page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    input type="hidden" id="gPage" name="gPage" value="maintenance" />
    <input type="hidden" id="gMode" name="gMode" value="" />
    <input type="hidden" id="gType" name="gType" value="shutdown" />
    <input type="hidden" id="gKey"  name="gKey"  value="" />
    <input type="hidden" id="gSSS"  name="gSSS"  value="" />
    <input type="hidden" id="gRRR"  name="gRRR"  value="" />

    valeurs recuperer via wireshark et fonctionnel en php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #<input type="hidden" id="gPage" name="gPage" value="maintenance" />
    #<input type="hidden" id="gMode" name="gMode" value="shutdown" />
    #<input type="hidden" id="gType" name="gType" value="reboot" />
    #<input type="hidden" id="gKey"  name="gKey"  value="" />
    #<input type="hidden" id="gSSS"  name="gSSS"  value="464e3f2XXXXXX031c298d0a938a9" />
    #<input type="hidden" id="gRRR"  name="gRRR"  value="4517625XXXXXX1739" />
    ce code est générer eu moment du reboot donc je comprend pas pourquoi cela ne marche pas avec mon code Perl.?

  2. #22
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Bonjour,

    A priori l'attribut "gMode" prend pas de valeurs et "gType" prend la valeur "shutdown".

    Du coup la valeur "reboot" disparait.

    Normalement, une fois qu'on clique sur le bouton "OK" du reboot, on est redirigé vers une page affichant le texte suivant :

    Restarting the LinkStation now
    Dans mon code PHP, je vérifiais cela en faisant un if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (eregi('Restarting the LinkStation now.',$page)){
            print "Good job :) ";
    }else{
            print "Echec redemrrage";
    }
    Dans mon cas en Perl, je peux utiliser quelle méthode pour recherche cela dans la page svp?

  3. #23
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    je dirais une petite boucle dans le même principe que ce que tu faisais avant...
    En concidérant un variable @page qui contiendrait toutes les lignes de ta page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my $restart=0;
     
    foreach my $p (@page){
          if($p =~ /Restarting the LinkStation now/){
                print "Good job";
                $restart=1;
          }
    }
    if($restart == 0){
          print "Echec redemarrage";
    }

  4. #24
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Merci du test, cela met "echec redemarrage"

    Cela est normal car print @page me renvoi toujours la page de connexion lorsque je regarde tout le code, il y a uniquement les valeur du input qui change:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <div id="divAuthLogin">
    <div id="divAuthLoginTitle"><div class="set_headder">Please Provide your User Name and Password</div><br /><br /></div>
    <div id="divAuthLoginItem">
      <div id="divAuthLoginUser"><div class="set_name30">User Name</div><div class="set30box_1">
        <input type="text" id="txtAuthLoginUser" name="txtAuthLoginUser" value="" size="40" maxlength="255" />
      </div></div><div class="non"></div><br />
      <div id="divAuthLoginPassword"><div class="set_name30">Password</div><div class="set30box_1">
        <input type="password" id="txtAuthLoginPassword" name="txtAuthLoginPassword" value="" size="40" maxlength="255" />
      </div></div><div class="non"></div><br />
    </div>
    </div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" id="gPage" name="gPage" value="maintenance" /><input type="hidden" id="gMode" name="gMode" value="" /><input type="hidden" id="gType" name="gType" value="shutdown" /><input type="hidden" id="gKey"  name="gKey"  value="" /><input type="hidden" id="gSSS"  name="gSSS"  value="" /><input type="hidden" id="gRRR"  name="gRRR"  value="" />
    Il faut donc que j'arrive a rester connecter avec mon login/pass et me déplcaer sur la bonne page. Mais comment faire?

  5. #25
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Yes ca marche!!!

    J'ai ajouté ceci a la suite de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Positionne la page sur Maintenance et lance le reboot
        $form->find_input("gPage")->value("maintenance");
        $form->find_input("gMode")->value("shutdown");
        $form->find_input("gType")->value("reboot");
        $form->find_input("gKey")->value("");
        $form->find_input("gSSS")->value($gSSS);
        $form->find_input("gRRR")->value($gRRR);
     
        my $validate2 = $ua->request( $form->click );
        my @page2 = $validate->content;
    Donc, je récupère mon login/pass par mes deux variables gSSS et gRRR, le reboot marche bien.

    J'ai du enlever la boucle car il n'y avait pas le message "Restart.." qui apparaisait dans @page.

    Merci a vous tous pour votre aide et vos explications.

    Je mets le code pour les personnes intéressé pour rebooter un Nas buffalo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     #!/usr/bin/perl -w
        use strict;
        use LWP::UserAgent;
        use HTML::Form;
        use warnings;
        use HTML::Parser;
        use Data::Dumper;
     
        # les paramètres personnels
        my ( $user, $pass ) = qw( login pass );
        my $base = 'http://adresseIPduNAS/cgi-bin/top.cgi';
     
        # initialisation de l'agent
        my $ua = LWP::UserAgent->new();
     
        # création de la requête
        my $req = HTTP::Request->new( GET => $base );
     
        # exécute la requête et reçoit la réponse
        my $res = $ua->request($req);
        die $res->status_line if not $res->is_success;
     
     
        # le formulaire de login est le premier formulaire de la page
        my $form = ( HTML::Form->parse( $res->content, $base ) )[0];
     
        # remplit les champs
        $form->find_input("txtAuthLoginUser")->value($user);
        $form->find_input("txtAuthLoginPassword")->value($pass);
     
        # valide et renvoie le formulaire
        #$ua->request( $form->click );
     
        my $validate = $ua->request( $form->click );
        my @page = $validate->content;
        #print @page;
     
        # Récupérer les 2 variables stockant le login/pass
        my $gSSS;
        my $gRRR;
     
    	foreach my $l (@page){
          if($l =~ /\<input type/){
                ($gSSS) = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                ($gRRR) = $l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                #print $l."\n".$gSSS."\n".$gRRR;
          }
    	}
     
         # Positionne la page sur Maintenance et lance le reboot
        $form->find_input("gPage")->value("maintenance");
        $form->find_input("gMode")->value("shutdown");
        $form->find_input("gType")->value("reboot");
        $form->find_input("gKey")->value("");
        $form->find_input("gSSS")->value($gSSS);
        $form->find_input("gRRR")->value($gRRR);
     
        my $validate2 = $ua->request( $form->click );
        my @page2 = $validate->content;
        #print @page2;

  6. #26
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    comment passer en paramettre de mno fichier l'adresse IP du nas?

    nom du fichier "reboot_nas.pl"

    je voudrais faire reboot_nas.pl @adresseIPduNAS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        my $host= '.$1.";
     
        # les paramètres personnels
        my ( $user, $pass ) = qw( login pass );
        my $base = "http://".$host."/cgi-bin/top.cgi";
    $1 récupère le parametre passé au fichier non?

  7. #27
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    c'est bon, j'ai trouvé je faisait une erreur de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    use strict;
        use LWP::UserAgent;
        use HTML::Form;
        use warnings;
     
        my $host=$ARGV[0];
        # les parametres personnels
        my ($user,$pass) = qw(login pass);
        my $base = "http://".$ARGV[0]."/cgi-bin/top.cgi";
    Maintenant cela marche : reboot_nas.pl adresseIPduNAS

  8. #28
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Non pour récupérer les arguments passés dans la ligne de commande tu dois utiliser le tableau @ARGV

    Si tu lances ton programme :
    ./reboot_nas.pl 192.168.0.1
    Alors ton adresse IP sera la première variable du tableau @ARGV à récupéré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $ip = $ARGV[0];
    Mais je te conseille de tester au début de ton programme la longueur du tableau etc. pour gérer le cas où il n'y a pas de paramaètres, trop de paramètres etc.
    Ex si tu ne veux qu'un paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(@ARGV != 1){
      die "reboot.pl <adresse_ip>\n\n";
    }
    Edit : bon ben la prochaine fois je répondrai plus rapidement

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. perl probleme affichage avec HTML
    Par Pierrot2612 dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2007, 16h23
  2. Réponses: 1
    Dernier message: 26/04/2007, 20h51
  3. [Sécurité] Script PHP pour valider du HTML
    Par marcha dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2005, 14h57
  4. Utilisation de HTML::Parser
    Par mobscene dans le forum Web
    Réponses: 6
    Dernier message: 27/10/2005, 13h57
  5. execution php dans perl
    Par rdams dans le forum Web
    Réponses: 7
    Dernier message: 11/10/2005, 20h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo