problème formulaire envoie d'un get au lieu d'un post...

problème formulaire envoie d'un get au lieu d'un post... - Perl - Programmation

Marsh Posté le 12-10-2009 à 14:13:25    

Bonjour,
 
J'ai un petit problème avec le module HTTML::Form. Je me connecte tout d'abord en http sur une adresse qui demande un login et un mot de passe. Je récupère le formulaire et le renvoie complété.  
Suite à cela, le serveur me renvoie bien la page que j'ai spécifié dans l'url ($base). Mais cette page, récupérée dans la variable $res2, correspond en fait à un formulaire que j'aimerai compléter dans mon script. J'ai donc écris cette ligne : my $form2 = HTML::Form->parse( $res2->content ); mais le shell me donne l'erreur suivante : HTML::Form::parse: No $base_uri provided at scriptHttp2qua.pl line 39
 
Je sais bien qu'il faut normalement préciser l'url, mais c'est inutile dans ce cas et sur le site des mongueurs, ils l'écrivent aussi de cette manière : http://articles.mongueurs.net/maga [...] mag56.html (à la fin, dans gestion des formulaires complexes).  
 
Si je précise l'url, j'ai l'erreur suivante : Can't call method "value" on an undefined value at scriptHttp2qua.pl line 40.
 
Est ce que quelqu'un peut m'aider à récupérer le deuxième formulaire contenu dans $res2 (qui comprend l'en-tête+formulaire) ?
 
De plus, le cookies ne s'efface pas à la fin de mon script. Quelqu'un sait-il pourquoi ? Faut-il fermer la connexion plus proprement ?
 
Voici le code afin que vous puissiez voir ce que je cherche à faire :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use LWP::UserAgent;
  4. use HTML::Form;
  5. use HTTP::Cookies;
  6. use LWP::Simple;
  7. # les paramètres personnels
  8. my ( $user, $pass ) = qw( nom mdp );
  9. my $base = 'http://X.X.X.X/RTIR/Create.html?Queue=Incidents';
  10. my $req;
  11. my $cookies = 'cookies.txt';
  12. # initialisation de l'agent
  13. my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.14)',
  14. cookie_jar => HTTP::Cookies->new(
  15.     file           => $cookies,
  16.             autosave       => 1,
  17.             ignore_discard => 1 )
  18. );
  19. # création de la requête
  20. $req = HTTP::Request->new( GET => "$base" );
  21. # exécute la requête et reçoit la réponse
  22. my $res = $ua->request($req);
  23. die $res->status_line if not $res->is_success;
  24. # formulaire de login
  25. my $form = ( HTML::Form->parse( $res->content, $base ) );
  26. # remplit les champs
  27. $form->find_input('user')->value($user);
  28. $form->find_input('pass')->value($pass);
  29. # valide et renvoie le formulaire
  30. my $res2 = $ua->request( $form->click );
  31. print $res2->content;
  32. my $form2 = HTML::Form->parse( $res2->content );


 
Merci d'avance,
 
Emmanuelle


Message édité par manuche59 le 14-10-2009 à 15:45:31
Reply

Marsh Posté le 12-10-2009 à 14:13:25   

Reply

Marsh Posté le 12-10-2009 à 16:15:53    

:hello: Bonjour,  
WWW::Mechanize ne serait il pas plus adapté a votre problème? L'auteur de l'article sur le site des mongueurs mentionne d'ailleurs ce module dans sa conclusion, en annonçant un exemple de son emploi dans un article ultérieur.
 
Sinon, pourquoi ne pas avoir essayé avec:
my $form2 = HTML::Form->parse( $res2->content, $base);
ça semblerait assez logique, à priori.
 
Si vous ne voulez pas garder les cookies, pourquoi avoir fait: "autosave       => 1" dans les paramètres de création du cookie.
Vous pouvez toujours tout nettoyer avec un appel à $cookie_jar->clear(); [qui est parfaitement documenté dans HTTP::Cookies]
 
A+,


Message édité par gilou le 12-10-2009 à 16:24:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-10-2009 à 09:55:55    

Bonjour !
 
Oui c'est vrai qu'il y a WWW::Mechanize. Je vais regarder si ce n'est pas plus simple avec ce module.
 
Sinon j'avais un bug hier quand j'ajoutais l'url $base : my $form2 = HTML::Form->parse( $res2->content, $base); c'est pour ca que j'ai posté un message parce que je ne savais plus comment faire. Mais c'est good en fait, l'erreur venait d'une autre ligne. Ca marche donc comme cela :)  
 
Pour les cookies, j'ai arrêté de les enregistrer :)  
Par contre, si je les enregistre, il faut que je fasse un test pour ouvrir directement la connexion avec le cookies si il est présent c'est ca ? Je n'arrive pas à faire correctement ce test, même avec l'article des mongueurs, j'ai des bugs ensuite. Il me dit que "value" dans la recherche de données dans le formulaire est "undefined". Enfin, je pense que je ne vais pas sauvegarder les cookies comme ca ce sera plus simple.
 
Merci pour ton aide, ca m'a remis les idées en place :). A force de développer, je me perds un peu...
En cas de problème, je te redemanderai de l'aide, si tu veux bien, bien sur :)
 
Merci !

Reply

Marsh Posté le 13-10-2009 à 12:00:06    

:hello:  
Pas de pb, si c'est dans mes cordes.

Citation :

Oui c'est vrai qu'il y a WWW::Mechanize. Je vais regarder si ce n'est pas plus simple avec ce module.


C'est un module qui permet facilement (entres autres) d'automatiser le connexion à un serveur web dans lequel on doit renvoyer des formulaires remplis.  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-10-2009 à 15:23:02    

Bonjour,
 
Donc, sur tes conseils, j'ai utilisé Mechanize. C'est super, ca marche bien et c'est plus facile à utiliser.
Voici le nouveau code :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use WWW::Mechanize;
  4. use HTTP::Cookies;
  5. my $cookies = 'cookies.txt';
  6. my $bot = WWW::Mechanize->new(
  7. agent => 'Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.14)',
  8. cookie_jar => HTTP::Cookies->new(
  9.     file           => $cookies,
  10.             autosave       => 0,
  11.             ignore_discard => 1
  12. )
  13. );
  14. my $response = $bot->get('http://X.X.X.X/');
  15. die $bot->res->status_line if not $bot->success;
  16. $bot->set_fields( user => 'moi', pass => 'mdp' );
  17. $bot->click();
  18. $bot->follow_link( text_regex => qr/RTIR/);
  19. $bot->follow_link( text_regex => qr/Incidents/);
  20. $bot->follow_link( text_regex => qr/New Incident/);
  21. $bot->set_fields ( Subject => 'test2', Description => 'test2', Classification => 'System Compromise', IP => 'X.X.X.X' );
  22. $bot->click();


 
J'ai sniffer les paquets avec Wireshark pour voir ce qui ce passait en http en filtrant sur l'adresse ip. Tout ce passe bien pour le premier formulaire de Login (apparition d'une action post dans wireshark). Ensuite je me ballade sur le site jusqu'au lien New Incident. Sur cette page New Incident se trouve un formulaire que j'aimerai remplir et poster ensuite. J'ai pu constater grace à wireshirk que je recevez bien en réponse le deuxième formulaire. Je remplie donc les champs et c'est juste apres, au moment de la validation du formulaire que ca coince (j'avais la meme chose avec lwp) ... En effet, le formulaire n'est pas posté sur le site et dans l'analyse de wireshark, je constate la chose suivante :
 
328 4.156855 mon@ip X.X.X.X HTTP GET /RTIR/index.html?NewSearch=1&Queue=Incidents&q=&Subject=test2&IP=X.X.X.X&Classification=System+Compromise&Description=test2 HTTP/1.1  
 
J'ai une requête get et non post ! C'est sur que ca ne peut pas fonctionner... Je trouve ca assez étrange... Et je n'ai aucune idée pour résoudre ce pb...
Ca marche sans souci pour le premier formulaire et pas pour un autre...
Comment se fait-il que mon programme envoie une requête GET au lieu de POST ??
 
Je commence à désespérer... Ca serait cool si tu pouvais encore m'aider :) Le peux - tu ?
Si quelqu'un a une idée, je suis preneuse !


Message édité par manuche59 le 14-10-2009 à 15:52:52
Reply

Marsh Posté le 14-10-2009 à 17:08:40    

:hello: Bonjour,
 
Quand on fait un click() WWW:Mechanize fait un GET ou un POST suivant une heuristique proprio, que je ne connais pas, mais qui en général marche. A priori, en utilisant mech-dump, on doit savoir ce qu'il va invoquer, si j'ai bien compris la FAQ: http://search.cpan.org/dist/WWW-Me [...] correctly?
 
Une suggestion: essayer $bot->post() sinon, essayer avec $bot->submit_form( ... ) avec les bons paramêtres.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed