2010-11-29 7 views
0

Notre client a une configuration simple.Soumission automatique de formulaire avec PERL - débogage!

La page A a un formulaire qui soumet à la page B qui affiche les résultats de la requête. Malheureusement, il n'y a pas d'autre accès API ou DB pour obtenir les données.

Puisque nous avons besoin de faire cette requête souvent, nous avons décidé d'automatiser cette soumission avec Perl.

J'ai déterminé les paires valeur/clé de formulaire de la page A avec un renifleur et répliqué le code. Cependant, lors de l'exécution de la page du programme, B génère une erreur HTTP 500 sans autre explication significative.

Des pointeurs pour déboguer ce code? Code en lui-même est simple:

 
use strict; 
    use warnings; 
    use LWP; 
    my $browser = LWP::UserAgent->new; 

    my $url = "targeturl.asp" 
    my $response = $browser->post($url, 
    [ 
    "HisSort" => "1", 
    "RTsort" => "", 
    "chkHisRun" => "on", 
    "chkRTRun" => "on", 
    "optAdHoc" => "on", 
    "optHist" => "", 
    "optServer" => "servername", 
    "optStatus" => "", 
    "optWhat" => "H", 
    "txtEnd" => "", 
    "txtFields" => "1,0,10,17,11,18,24,19,21,25,1", 
    "txtHEnd" => "11/3/2010", 
    "txtHStart" => "11/1/2010", 
    "txtServer" => "", 
    "txtStart" => "", 
    ] 
); 

Note: Je n'ont pas accès à la source de la page A ou page B

+0

Vous devriez probablement fournir une URL complète. – Benoit

+0

Si vous envoyez une requête identique, vous obtiendrez une réponse identique. Par conséquent, vous devez savoir où votre demande est différente de celle du navigateur. Y a-t-il des cookies, par exemple? Votre script Perl ne semble pas essayer de définir des en-têtes correspondant aux navigateurs. La page B ne parvient peut-être pas à analyser l'agent utilisateur, par exemple. –

+0

Il peut également s'agir d'une chaîne UserAgent ($ browser-> agent ("...")) ou d'un cookie reçu plus tôt ... – gangabass

Répondre

0

Team, Cela a été résolu. Il s'est finalement avéré que le problème n'était pas avec les en-têtes mais avec les paires de valeurs clés que j'envoyais. La page B ne faisait pas de validations sur les champs et les branchait directement sur une requête.

J'ai dû essayer quelques combinaisons de force brute (en testant avec la page A) pour arriver à ce que la page B attendait exactement.

Merci à tous ceux qui se sont portés volontaires pour aider.

1

Tout d'abord, je suggère à la recherche à WWW::Mechanize qui est un wrapper autour LWP plus conviviale. Deuxièmement, si votre client HTTP reçoit 500 erreurs, il devrait y avoir quelque chose de plus significatif dans les journaux d'erreurs du serveur Web. Et finalement, comme Matthew l'a mentionné, vous devez examiner de près la demande envoyée par le navigateur et déterminer en quoi elle diffère de la requête que votre programme Perl envoie.

+0

Matthew/Davorg - merci pour vos contributions. Je suis contraint par ce que je peux installer sur le serveur, mais je verrai si Mechanize est déjà là. Je suis en quelque sorte aveuglé à comprendre ce que B attend. Y at-il de toute façon je peux mettre quelque chose entre A et B pour voir les en-têtes de la sortie de A? Toutes les pages de renifleur que j'ai rencontrées semblent prendre une page Web et afficher ses en-têtes et dans les circonstances qui ne m'aident pas beaucoup. – deepakkt

+0

Pouvez-vous installer Wireshark n'importe où pour surveiller le trafic vers B? –

Questions connexes