Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2734 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1931222
manuche59
Posté le 12-10-2009 à 14:13:25  profilanswer
 

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
mood
Publicité
Posté le 12-10-2009 à 14:13:25  profilanswer
 

n°1931263
gilou
Modérateur
Modzilla
Posté le 12-10-2009 à 16:15:53  profilanswer
 

: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é!  --
n°1931397
manuche59
Posté le 13-10-2009 à 09:55:55  profilanswer
 

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 !

n°1931455
gilou
Modérateur
Modzilla
Posté le 13-10-2009 à 12:00:06  profilanswer
 

: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é!  --
n°1931790
manuche59
Posté le 14-10-2009 à 15:23:02  profilanswer
 

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
n°1931831
gilou
Modérateur
Modzilla
Posté le 14-10-2009 à 17:08:40  profilanswer
 

: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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
Problème avec mail() ou alors avec le pop d'hotmailprobleme d'affichage de mon site web
Problème Latex[ASP.NET/VB]Problème Findcontrol
[Résolu] Problème syntaxe xhtmlProbleme dans l'ecriture un bat
Probleme robot google ? Ma source internet ? aidez moi[Résolu] - [XSL] problème avec un xls:for-each
problème crash Excel 2000 après supression d'un ongletProbleme installation CodeBlocks(mingw32)
Plus de sujets relatifs à : problème formulaire envoie d'un get au lieu d'un post...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR