Il existe un site Web appelé https://www.guidgenerator.com/online-guid-generator.aspx qui génère des identifiants uniques au monde. J'essaie d'utiliser Mechanize de Perl pour publier sur un site Web afin d'extraire le guide. Je me rends compte que c'est basé sur Javascript, mais je me demandais si je pouvais publier le bon message pour extraire les chiffres. Je l'ai tracé à partir du navigateur et j'ai obtenu tous les en-têtes de la requête, mais le code HTML renvoyé ne contient pas le guid.
C'est le résultat d'une course réussie :
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight:bold; Hauteur : 152 px ; Largeur : 421 px ; ">qk5DF22bhkm4C2AwZ5OcZw==</textarea>
Voici mon script :
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight:bold; Hauteur : 152 px ; Largeur : 421 px ; "></textarea>
Voici le formulaire dans la page :
Dans mon script, j'ai vidé le formulaire et les champs de saisie obligatoires suivants :
my @forms = $mech->forms; foreach my $form (@forms) { my @inputfields = $form->param; print Dumper \@inputfields; }
Résultats
$VAR1 = [ '__EVENTTARGET', '__EVENTARGUMENT', '__LASTFOCUS', '__VIEWSTATE', '__VIEWSTATEGENERATOR', '__EVENTVALIDATION', 'txtCount', 'chkUppercase', 'chkBrackets', 'chkHypens', 'chkBase64', 'chkRFC7515', 'chkURL', 'LocalTimestampValue', 'btnGenerate', 'txtResults' ];
C'est le message
my $mainpage = "https://www.guidgenerator.com/online-guid-generator.aspx"; $mech->post( "$mainpage", fields => { 'txtCount' => "1", 'chkBase64' => "on", 'LocalTimestampValue' => "Date%28%29.getTime%28%29", 'btnGenerate' => "Generate+some+GUIDs%21", 'txtResults' => "", '__EVENTTARGET' => 'on', '__EVENTARGUMENT', => 'on', '__LASTFOCUS', => 'on', '__VIEWSTATEGENERATOR' => "247C709F", '__VIEWSTATE' => 'on', '__EVENTVALIDATION' => 'on', 'chkUppercase' => 'off', 'chkBrackets' => 'off', 'chkHypens' => 'off', 'chkRFC7515' => 'off', 'chkURL' => 'off', }, );
Lorsque je trace sur le site Web, j'obtiens les en-têtes, mais il y a un autre onglet appelé "Payload". Celui-ci contient la plupart des champs répertoriés ci-dessus. J'ai essayé de saisir les champs dans un POST, mais je ne sais pas si je dois le faire différemment ou si cela n'a pas d'importance puisqu'il s'agit de javascript ?
Je sais que cela représente beaucoup d’informations. Je ne suis même pas sûr que la mécanisation de Perl puisse extraire cette information. Toute aide serait grandement appréciée. S'il vous plaît laissez-moi savoir toute autre donnée que vous souhaiteriez que je publie ici.
Vous pouvez utiliser la fonctionnalité intégrée de Mech pour ce faire. Pas besoin de soumettre des champs ou des en-têtes supplémentaires.
Cela affichera ce qui suit :
La clé ici est que vous ne pouvez pas utiliser
$mech- >submit
因为这不会提交提交按钮的值。这有点烦人。因此,您必须使用$mech->click
, qui prétend que le bouton de soumission par défaut du formulaire par défaut est cliqué et que par conséquent la valeur est également soumise. C'est ainsi que fonctionnent les boutons sur un formulaire, dans ce cas le backend vérifie les valeurs pour voir sur laquelle on a cliqué.Vous pouvez ensuite utiliser
$mech->value
$mech->value
获取字段值。您可能想要split
pour obtenir la valeur du champ. Vous souhaiterez peut-êtrediviser
pour le traiter davantage.Le JavaScript de cette page n'a en fait absolument rien à voir avec la fonctionnalité. Tout ce qu'il fait, c'est enregistrer et restaurer les paramètres que vous avez sélectionnés dans le cookie afin que lorsque vous reviendrez, les mêmes cases soient cochées. C'est bien, mais il serait peut-être préférable d'utiliser le stockage local sur le frontend pour le moment. Cependant, vous n'avez pas du tout besoin de traiter avec JS pour supprimer cette page. La fonctionnalité principale est le backend.
Vous pourriez également être intéressé par
$mech->dump_forms
, une excellente aide au débogage qui imprime tous les formulaires avec des champs et des valeurs. Une autre aide précieuse au débogage lors de l'utilisation de Mech (ou de toute classe basée sur LWP) est LWP::ConsoleLogger::Everywhere. C'est ce que j'utilise pour comparer les requêtes du programme avec les requêtes du navigateur pour trouver les champs de formulaire de bouton manquants.Avertissement : je suis le responsable de WWW::Mechanize et j'ai écrit LWP::ConsoleLogger::Everywhere.