Вы не отправляете имя кнопки отправки, на которую нажимали; Я подозреваю, что код на другом конце проверяет наличие этой переменной в запросе, чтобы увидеть, была ли отправлена форма или нет.
Как указывает PacoRG, кнопка отправки является изображением; таким образом, отправка по нажатию этой кнопки в браузере приведет к отправке полей с именами «login.x» и «login.y» вместе с «login».
Хороший способ избежать подобных проблем - использовать WWW :: Mechanize , чтобы выполнить большую часть работы за вас, например:
my $mech = WWW::Mechanize->new;
$mech->get('http://www.example.com/login.html');
$mech-submit_form(
with_fields => {
profid => $username,
password => $password,
},
);
Выше будет запрашивать страницу входа, найти соответствующую форму и отправить ее.
Кроме того, как уже говорили другие, если запросы из вашего сценария обрабатываются по-разному в соответствии с запросами из вашего браузера, лучший способ отладки - это получить полный HTTP-запрос, который одновременно отправляет, и искать соответствующие различия. Для браузера вы можете использовать расширение, такое как FireHox LiveHTTPHeaders или плагины Tamper Data, или использовать что-то вроде Wireshark для захвата запроса по мере его отправки. Для сценария вы можете легко вывести отправляемый запрос.
Например, для скрипта, использующего LWP :: UserAgent или WWW :: Mechanize (который подкласс LWP :: UserAgent), вы можете добавить:
$mech->add_handler("request_send", sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });
Это выведет необработанный отправленный запрос вместе с необработанным ответом от сервера. (Измените $mech
на любое другое значение, в котором находится ваш объект LWP :: UserAgent / WWW :: Mechanize - $browser
в вашем примере.)