Es gibt eine Website namens https://www.guidgenerator.com/online-guid-generator.aspx, die weltweit eindeutige Identifikatoren generiert. Ich versuche, Perls Mechanize zum Veröffentlichen auf einer Website zu verwenden, um den Leitfaden zu extrahieren. Mir ist klar, dass dies auf Javascript basiert, aber ich habe mich gefragt, ob ich den richtigen Beitrag verfassen könnte, um die Zahlen zu ermitteln. Ich habe es über den Browser verfolgt und alle Header in der Anfrage abgerufen, aber der zurückgegebene HTML-Code enthält nicht die GUID.
Das ist das Ergebnis eines erfolgreichen Laufs:
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight:bold; Höhe: 152px; Breite: 421px; ">qk5DF22bhkm4C2AwZ5OcZw==</textarea>
Das ist mein Drehbuch:
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight:bold; Höhe: 152px; Breite: 421px; "></textarea>
Dies ist das Formular auf der Seite:
In meinem Skript habe ich die folgenden erforderlichen Formular- und Eingabefelder abgelegt:
my @forms = $mech->forms; foreach my $form (@forms) { my @inputfields = $form->param; print Dumper \@inputfields; }
Ergebnisse
$VAR1 = [ '__EVENTTARGET', '__EVENTARGUMENT', '__LASTFOCUS', '__VIEWSTATE', '__VIEWSTATEGENERATOR', '__EVENTVALIDATION', 'txtCount', 'chkUppercase', 'chkBrackets', 'chkHypens', 'chkBase64', 'chkRFC7515', 'chkURL', 'LocalTimestampValue', 'btnGenerate', 'txtResults' ];
Das ist der Beitrag
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', }, );
Wenn ich die Website verfolge, erhalte ich die Header, aber es gibt eine weitere Registerkarte namens „Payload“. Dieses enthält die meisten der oben aufgeführten Felder. Ich habe versucht, die Felder in einen POST einzugeben, bin mir aber nicht sicher, ob ich das anders machen soll oder ob es keine Rolle spielt, da es Javascript ist?
Ich weiß, das sind viele Informationen. Ich bin nicht einmal sicher, ob Perls Mechanisierung diese Informationen extrahieren kann. Jede Hilfe wäre sehr dankbar. Bitte teilen Sie mir alle weiteren Daten mit, die ich hier veröffentlichen soll.
您可以使用 Mech 的内置功能来执行此操作。无需提交任何额外的字段或标头。
这将输出如下内容:
这里的关键是你不能使用
$mech- >submit
因为这不会提交提交按钮的值。这有点烦人。因此,您必须使用$mech->click
,它假装单击了默认表单的默认提交按钮,因此也提交了该值。这就是按钮在表单上的工作方式,在本例中,后端检查值以查看单击了哪一个。然后您可以使用
$mech->value
获取字段值。您可能想要split
来进一步处理它。该页面中的 JavaScript 实际上与功能完全无关。它所做的只是保存和恢复您在 cookie 中选择的设置,这样当您回来时,相同的复选框将被选中。这很好,但现在在前端使用本地存储可能会更好。然而,你根本不需要处理 JS 来抓取这个页面。主要功能是后端。
您可能还对
$mech->dump_forms
,这是一个很好的调试辅助工具,可以打印出所有带有字段和值的表单。使用 Mech(或任何基于 LWP 的类)时另一个很好的调试辅助工具是 LWP::ConsoleLogger ::无处不在。这就是我用来将程序的请求与浏览器的请求进行比较以找到丢失的按钮表单字段的方法。免责声明:我是 WWW::Mechanize 的维护者,我编写了 LWP::ConsoleLogger::Everywhere。