如何使用 perl(和 JS?)登录这个网站?
Posted
技术标签:
【中文标题】如何使用 perl(和 JS?)登录这个网站?【英文标题】:How do I log into this website using perl (and JS?)? 【发布时间】:2021-10-25 10:09:06 【问题描述】:我目前正在尝试使用 perl 自动登录到下面的网站。我曾尝试使用 mechanize,但我相信它需要 JS 功能。我查看了 JavaScricpt Mech 插件,但文档对我来说不是很容易理解。我不知道如何进一步解决这个问题,因为我看不到 md5() 函数,所以我无法在 perl 代码中重建它......
相关位是:
html:
<form method="POST" name="logonForm" onsubmit="encode();document.submitForm.submit();return false;">
<tr class="Element">
<td class="text" id="ID_Text4"><nobr>User name:</nobr></td>
<td class="text" align="left">
<select name="username" style="width:125">
<option value="user" id="ID_Text5">user </option>
<option selected value="admin" id="ID_Text6">admin </option>
</select>
</td>
</tr>
<tr class="Element">
<td class="text" id="ID_Text7"><nobr>Password:</nobr></td>
<td class="text">
<input type="password" size="10" name="password" style="width:125">
</td>
</tr>
<form method="POST" name="submitForm">
<input type="hidden" name="encoded">
<input type="hidden" name="nonceA" value="">
<input type="button" name="goto" value="Log On" onClick="encode();submit();" style="width:125" ID="ID_Button1">
<input type="hidden" name="URL" value="/">
JS:
function encode()
// sets the hidden field value to whatever md5 returns.
document.submitForm.encoded.value = document.logonForm.username.value + ":" + md5(document.logonForm.username.value + ":" + document.logonForm.password.value + ":" + document.submitForm.nonceA.value);
/* Dont used */
document.submitForm.URL.disabled = true;
【问题讨论】:
你试过Selenium::Chrome
吗?另见Spidering websites with Headless Chrome and Selenium
@HåkonHægland 这可能对我有用,但你知道这是否也适用于便携式 chrome 版本?我在运行它的所有系统上都没有安装 chrome...
是的,你需要安装chrome,见Is Chrome installation needed or only chromedriver when using Selenium?
看看 WWW::Mechanize::Chrome。
是否还有不涉及安装非标准windows浏览器的解决方案?
【参考方案1】:
您是否尝试过 Digest::MD5
中的 md5
函数?
use Digest::MD5 qw(md5)
use WWW::Mechanize;
my $encoded = $username . ':' . md5($username . ':' . $password . ':' . $nonce);
$mech->post(
$url,
Content =>
'encoded' => $encoded,
'nonceA' => $nonce,
....
,
);
【讨论】:
【参考方案2】:我注意到从未设置过“nonceA”值,因此我复制了 html 和 js 依赖项并在本地运行 html。我在 html 中使用了window.prompt(document.submitForm.encoded.value);
来查看正在发送的内容。然后我将此值复制到我的 perl 脚本并相应地设置“编码”值:
my $form = $mech->form_name('submitForm');
$form->value('encoded', '<copied here>');
之后我使用:
$mech->submit_form();
这对我有用。
【讨论】:
以上是关于如何使用 perl(和 JS?)登录这个网站?的主要内容,如果未能解决你的问题,请参考以下文章