Как автоматизировать вход в систему и резервное копирование с помощью Perl - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь войти в панель веб-конфигурации устройства (для теста я использую мой маршрутизатор) и создать резервную копию.Модуль WWW :: Scripter.Страница использует JavaScript.Я думаю, что я не передаю параметры должным образом, потому что он возвращает ошибку:

No such field 'userName' at /home/angel/perl5/lib/perl5/WWW/Mechanize.pm line 750.

Функция JS на веб-странице:

function CheckUserPswInvalid()
{
var userName = $("userName");
var pcPassword = $("pcPassword");   
if(!CheckUserPswChars(userName.value))
{
    userName.select();
    userName.focus();
    return false;   
}

if(!CheckUserPswChars(pcPassword.value))
{
    pcPassword.select();
    pcPassword.focus();
    return false;   
}

return true;
}

Мой код:

use WWW::Scripter;
use HTTP::Cookies;
my $url  = 'http://192.168.0.1/';
my $username = 'username';
my $pass = 'password';
my $agent = new WWW::Scripter;

$agent->use_plugin('JavaScript');
$agent->get('http://192.168.0.1/');
$agent->cookie_jar(HTTP::Cookies->new);
$agent->form_name("loginForm");
$agent->field('userName' => $username);
$agent->field("pcPassword" => $pass);
$agent->submit();

РЕДАКТИРОВАТЬ: Добавление части HTML:

` <div class="loginBox">    
    <div class="noteDiv">
        <span id="note"></span>
        <span id="tip"></span>
    </div>
    <div class="panelThre" align="center">
        <div align="center" class="picDiv" align="center">
            <ul>
                <li id="unLi" class="unLi"><input class="text" id="userName" type="text" maxlength="15" /></li>
                <li class="blank"></li>
                <li id="pwLi" class="pwLi"><input class="text" id="pcPassword" type="password" maxlength="15"/></li>
            </ul>
            <label id="loginBtn" class="loginBtn" onclick="PCSubWin()"/></label>
            <div>
            <label id="copyright">Copyright &copy; 2016 TP-LINK Technologies Co., Ltd. All rights reserved. </label>            
            </div>
        </div>
    </div>
</div>
<form action="/userRpm/LoginRpm.htm" method="get" id="loginForm" enctype="multipart/form-data">
    <input type="hidden" value="Save" name="Save" />
</form>

`

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Попробуйте DOM и отправьте с помощью обратного вызова:

$agent->document->getElementById('userName')->value($username);
$agent->document->getElementById('pcPassword')->value($pass);
$agent->eval('PCSubWin()');
0 голосов
/ 16 апреля 2019

Я уверен, что WWW :: Mechanize не будет работать для этого:

  1. Нет формы (нет тега <form> в HTML);
  2. Поле вводане имеет имени и $agent->field принимает имя поля в качестве параметра, а не ID.

JavaScript, вероятно, выдает запрос Ajax.Я предлагаю найти запрос Ajax в консоли разработки браузера и воспроизвести его (для этого вам не нужен WWW::Mechanize, должен сделать LWP::UserAgent).НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...