Аутентификация формы для . NET-сайты с использованием Perl

Мы новичок в написании сценариев Perl и хотели пройти аутентификацию сайта .NET. У нас есть код для аутентификации, специфичный для сайтов Sharepoint, фрагмент кода ниже:

my $ua = new LWP::UserAgent('keep_alive' => '1');
print "$url \n";
$ua->credentials("$uname", "$pwd");
my $response =$ua->get($url);
my $cde = $response->code();

Мы хотели настроить код так, чтобы он работал конкретно для аутентификации сайтов .NET. Мы использовали WWW::Mechanize, см. фрагмент кода ниже:

my $mech = WWW::Mechanize->new();
$mech->cookie_jar(HTTP::Cookies->new());
$mech->get($url);
$mech->form_name('Login');
$mech->field("UserName", $username);
$mech->field("Password", $password);
$mech->click();

Но при запуске программы выдается ошибка: "В sample.pl нет формы с именем "Войти"". Любые мысли о том, как аутентифицировать формы, специфичные для сайтов .NET?

Добавление: Фрагмент кода HTML-формы...

<div id="loginArea">        
        <div id="loginMessage" class="groupMargin">Sign in with your account</div>
        <form method="post" id="Login" autocomplete="off" novalidate="novalidate" onkeypress="if (event &amp;&amp; event.keyCode
== 13) Login.submitLoginRequest();" action="">
            <div id="formsAuthenticationArea">
                <div id="userNameArea">
                    <input id="userNameInput" name="UserName" type="email" value="" tabindex="1" class="text fullWidth" spellcheck="false" placeholder="Username" autocomplete="off">     
                </div>
                <div id="passwordArea">
                     <input id="passwordInput" name="Password" type="password" tabindex="2" class="text fullWidth" placeholder="Password" autocomplete="off">                            

                </div>
                <div id="kmsiArea" style="display:none">
                    <input type="checkbox" name="Kmsi" id="kmsiInput" value="true" tabindex="3">
                    <label for="kmsiInput">Keep me signed in</label>
                </div>
                <div id="submissionArea" class="submitMargin">
                    <span id="submitButton" class="submit" tabindex="4" onkeypress="if (event &amp;&amp; event.keyCode == 32) Login.submitLoginRequest();" onclick="return Login.submitLoginRequest();">Sign in</span>
                </div>
            </div>
        </form>
    </div>

person Charli    schedule 22.04.2015    source источник


Ответы (1)


Обычно этот код работает для сайтов .NET:

$mech->submit_form(
    with_fields => {
        login => "somelogin",
        pass  => "somepass",
    },
    button => "submit_button_name",
);

Но у вас странное сообщение об ошибке: вы выбираете форму "Войти", но $mech ищете "loginForm"... Можете ли вы показать фактический HTML-код формы?

Также нет необходимости делать $mech->cookie_jar(...), потому что $mech делают это по умолчанию.

ОБНОВЛЕНИЕ Попробуйте этот код (Login – это id вашей формы, но не name):

$mech->submit_form(
    with_fields => {
        UserName => "somelogin",
        Password  => "somepass",
    },
);
person gangabass    schedule 22.04.2015
comment
Спасибо за это @gangabass. Извините, я не могу опубликовать скриншот фактической формы, так как я новичок в stackoverflow и у меня недостаточно очков репутации. Форма входа аналогична типичным формам входа, которые вы можете увидеть в Интернете: два текстовых поля для имени пользователя и пароля. И кнопка с именем Sign On. Я также отредактировал сообщение об ошибке, имя формы на «Вход». - person Charli; 27.04.2015
comment
@Charli Я говорил о HTML-коде формы, а не о снимке экрана. - person gangabass; 27.04.2015
comment
Ничего, если я опубликую только фрагмент кода HTML-формы? - person Charli; 28.04.2015
comment
@Чарли да, это все, что мне нужно - person gangabass; 28.04.2015
comment
Привет, @gangbass, я добавил фрагмент кода HTML-формы в исходный вопрос, который у меня был выше, так как он слишком длинный, чтобы публиковать его здесь. - person Charli; 28.04.2015
comment
У нас есть еще один вопрос, касающийся прохождения страницы входа. Поскольку мы не можем пройти через страницу входа, мы попытались использовать 'require $mech.pm; ‘ непосредственно перед $mech-›submit_form(…..); Но после выполнения кода мы получили следующее сообщение об ошибке: 'WWW::Mechanize=HASH(0x3812504).pm in @INC (@INC содержит: C:/Perl/site/lib C:/Perl/lib . ) в ADS.pl, строка 44, ‹$input›, строка 1.' Нужен ли нам установщик для успешного запуска? Или какие-то другие варианты? - person Charli; 28.04.2015