【问题标题】:How submit that form through perl for Openwrt/LEDE如何通过 perl 为 Openwrt/LEDE 提交该表单
【发布时间】:2018-04-16 04:30:39
【问题描述】:

我有那个表格

<form method="post" action="index.lp" name="authform" id="authform">
<input type="password" name="password" id="password" onkeypress="return enter_submit(event);" />
<input name="enter" class="btn btn-primary" type="button" value="log in" onclick='auth()' />

我可以通过这种方式提交,谢谢 javascript

javascript:document.getElementById("password").value = "password";auth();

现在我需要编写 perl 脚本来自动执行此操作,并在它登录时在页面中执行其他 javascript 函数。 我在电脑上测试,有问题:

1) Perl 需要一个 c 编译器...在我可以在 openwrt 上安装它之后?

2) 我可以尝试两种不同的方法:

第一个也是更快的是使用 WWW::Scripter::Plugin::JavaScript 但我无法安装模块,因为我无法安装 mingw(我在 ppm-shell 中安装了 mingw它返回“ppm 安装失败:找不到任何提供 mingw 的软件包”)。此外,我在Perl package 中看不到 WWW::Scripter。 我写了那个脚本(它可以工作吗?):

  use WWW::Scripter;
  $w = new WWW::Scripter;

  $w->use_plugin('JavaScript');
  $w->get('http://url');
  $w->get('javascript:document.getElementById("password").value = "password";auth();');
  sleep (1);
  $w->get('http://url');
  $w->get('javascript: function();');

第二个是使用WWW:Mechanize。我怎样才能看到输出页面?以及如何将命令发送到第二页?现在使用该脚本,我收到此错误:“D:/Program Files/Perl/lib/HTTP/Response.pm 第 92 行缺少基本参数。”。 (可以吗?)

use WWW::Mechanize;
my $mech = WWW::Mechanize->new();

$mech->get( $url );

$mech->follow_link( url => 'http://url' );

$mech->submit_form(
    form_name => 'authform',
    fields    => { password  => 'password', },
    button    => 'log in'
);

【问题讨论】:

    标签: javascript perl openwrt www-mechanize


    【解决方案1】:

    我会使用 WWW::Mechanize,在没有真正的浏览器引擎的情况下解释依赖 DOM 的 JS 几乎是不可能的。

    $mech-&gt;content() 会从 WWW::Mechanize 的最后获取页面中获取原始 HTML。

    如果您确实有需要自动化的大量 JavaScript 页面并且您想使用 perl,请考虑使用 Selenium 的 WebDriver 来控制“真正的”浏览器(即使它像 phantomjs 一样无头)。

    至于您遇到的错误:确保您的步骤正确运行,并查看D:/Program Files/Perl/lib/HTTP/Response.pm 第 92 行中发生的情况以及预期的情况。

    【讨论】:

    • 哦,对了,对不起,忘记了 OpenWRT。没有它,机械化应该仍然可以工作。如果你遇到 JS,你可以假装它并让 Mechanize 自己发送正确的请求,而不需要解释 JS(看看你的浏览器发送了什么并重播,基本上)。
    • 我不能在 openwrt/LEDE 上使用 selenium,因为他们没有真正的浏览器! Mechanzine 不应该解释 javascript 而只是提交一个表单(你读过我发布的代码吗?)相反 WWW::Scripter::Plugin::JavaScript 可以解释 javascript。你建议我怎么做?你一定认为我需要在 openwrt/LEDE 上使用而不是在其他操作系统上使用
    • 我看了 Http header 但不知道怎么回复!我认为有 md5 加密,我不知道该怎么做……如果可以的话,我们可以使用 teamviewer!在第 92 行我有 return $HTTP::URI_CLASS-&gt;new_abs($base, $req-&gt;uri);
    • 抱歉,我无法通过 Teamviewer 帮助您。如果它在传输密码之前对其进行了操作,则您必须了解它是如何操作的,并在 perl 中做同样的事情。如果您正在使用 AVM 的 fritz box 登录(他们只使用路由器的密码,并且在 JS 中做或做过一些 md5 的事情),请使用您最喜欢的搜索引擎,这个问题之前已经解决了。
    • 我不明白你的意思! WWW:Scripter 不是个好办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多