recherche

Maison  >  Questions et réponses  >  le corps du texte

Requête POST pour extraire le GUID du site Web .aspx à l'aide de Mechanize

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.

P粉564192131P粉564192131234 Il y a quelques jours532

répondre à tous(1)je répondrai

  • P粉714890053

    P粉7148900532024-04-03 09:56:29

    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.

    use strict;
    use warnings;
    use feature 'say';
    
    use WWW::Mechanize;
    
    my $mech = WWW::Mechanize->new;
    $mech->get('https://www.guidgenerator.com/online-guid-generator.aspx');
    $mech->field( txtCount => 10 );
    $mech->click;
    
    say $mech->value('txtResults');
    

    Cela affichera ce qui suit :

    $ perl mech.pl                                  
    211b3cad1665483ca303360bdbda0c61
    ecc3348d83cb4bb5bdcb11c6148c5ae1
    0a3f2fe5748946a1888a4a5bde8ef2e6
    acb26deb9fda4411aa64638cdd1ec5f1
    2afe609c355b4a10b6a0ae8c74d3aef1
    30fd89ab170147cfb24f131346a203e3
    2301d258e1d045aa8f0682f2ea14464c
    f064507ca3e14a4eb860b0a30ba096ed
    9a42b15d5c79420c921dcc07c306459b
    5bea2e345f75453caaf795681963866a

    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-être diviser 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.

    répondre
    0
  • Annulerrépondre