LWP(post) не проходит страницу с параметрами

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

05 май 2005, 14:29

Здравствуйте.
Где копать дальше?
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

05 май 2005, 16:57

Используешь не тот урл. У тебя урл формы для логина, а данные надо постить по другому адресу. Посмотри параметр action для этой формы.
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

05 май 2005, 17:27

Вот что про action пишут в этой форме:
<form accept-charset="" id="editObjectsForm" method="POST" action="edit.jsp?mode=editObjects&submode=do" name="editObjectsForm" enctype="application/x-www-form-urlencoded"><input type="hidden" id="editObjectsForm_buttonType" name="editObjectsForm_buttonType" value="">

Переход же происходит на http://www.job.ru/edit.jsp?mode=editObjects&submode=do

Т.е. мне надо постить на этот адрес?
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

05 май 2005, 17:31

на адрес тоже всё по старому.
подскажи, что не так?
или в заголовке чего нет?
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

05 май 2005, 18:11

Отключи куки и посмотри форму еще раз. Там используются сесси.
method="POST" action="edit.jsp;jsessionid=aaa5ApYPdsJfBC?mode=editObjects&submode=do"
Т.е. действия примерно такие. Грузишь editres.html, выцепляешь соответсвующий action и по нему постишь свои данные.
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

24 май 2005, 16:41

Когда есть куки в action нет ссылки на номер сессии. Только адрес:
edit.jsp?mode=editObjects&submode=do
Пробовал вытаскивать сессию по action - не помогает.
Пробовал с куки (текст ниже)
Что то её не нравится? Проверяю полученный ответ - вижу первую страницу. Как до второй добраться?
Ниже скрипт, кто увидит ляпы - подскажите.

use LWP;
use HTTP::Cookies;
$url0='http://www.job.ru/editres.html';
$url ='http://www.job.ru/edit.jsp?mode=editObjects&submode=do';

$cok=HTTP::Cookies->new;

$browser=LWP::UserAgent->new;

$req=HTTP::Request->new(GET => $url0);

$response=$browser->request($req);

$cok->extract_cookies($response);

die "$url0 error:", $response->status_line unless $response->is_success;

теперь постим код и пароль по следующему адресу (поле action);

$req=HTTP::Request->new(POST => $url);

$req->content_type('application/x-www-form-urlencoded');

$req->content("editObjectsForm_objectId" => '12459752');

$req->content("editObjectsForm_password" => 'jobjob');

$req->content("editObjectsForm_objectType" => "resume");

# $req->content("editObjectsForm_buttonType" => ""); - наверно необязательно

$cok->add_cookie_header($req);

$response2 = $browser->request($req);

die "$url error:", $response2->status_line unless $response2->is_success;

open (FILE, "> vac.htm") or die "cant open file:$!" ;

print FILE $response2->content;

print "OK";

close(FILE);
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

24 май 2005, 18:38

Попробуй так

Код: Выделить всё

use strict;
use LWP;
use HTML::TreeBuilder;
my $url = 'http://www.job.ru/editres.html';
my $br = LWP::UserAgent->new();
my $resp = $br->request(HTTP::Request->new(GET => $url));
die unless $resp->is_success;
my $tree = HTML::TreeBuilder->new_from_content($resp->content);
my @forms = $tree->look_down('_tag', 'form');
my $url2 = 'http://www.job.ru/' . $forms[0]->attr('action');
my @content = $forms[0]->look_down('_tag', 'input');
my @post;
foreach my $t (@content) {
  if ($t->attr('type') eq 'hidden') { push @post, $t->attr('name') . '=' . $t->attr('value'); }
}
push @post, "editObjectsForm_objectId=12459752";
push @post, "editObjectsForm_password=jobjob";
$tree->delete();

print $url2, "\n", join('&', @post), "\n"; ## debug info

my $req=HTTP::Request->new(POST => $url2);
$req->content_type('application/x-www-form-urlencoded');
$req->content(join('&', @post));
my $resp2 = $br->request($req);
die unless $resp2->is_success;
open FILE, '>', 'C:/11.html';
print FILE $resp2->content;
close FILE;
У меня работает.
По твоему коду. Метод content заменяет предыдущий, поэтому нужно вызывать add_content. А проще сформировать строку запроса вручную и вызывать content один раз.
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

25 май 2005, 09:51

Да, твой вариант работает. Будем копать дальше. Вообще, с меня пиво, только не знаю как до Латвии доставить. Случайно не в Эксиджен работаешь? Написал бы свой адресок на собака yandex.ru
Ты в теме по сайту job.ru или сейчас только придумал код? Вот ещё вопрос.
Как сократить входящий трафик, который генерится при проходе через три окна редактирования резюме? Заранее известно что и куда надо постить. Если есть куки, то необязательно грузить всю страницу чтобы выцепить action. Можно ли грузить только заголовок страницы что бы получить куки и сразу постить на вторую страницу? И так же со второй: если ничего менять не надо, только перейти по ссылке (Сохранить...)? Понятно ли по моему описанию что предлагается?
kirch
Сообщения: 7
Зарегистрирован: 05 май 2005, 14:26

27 май 2005, 18:29

Требуется очередной совет!
Прошёл две формы, а на третьем окне застрял. Возвращает второе вместо четвёртого.
Кажется, что надо просто пойти по ссылке "Сохранить резюме", но не идёт.
Пробовал вручную проделать: скопировал ссылку и вставил в другое окно - то же вернуло на второе окно.
Может дело в том что создаётся новая сессия агента? Кто подскажет.

#use strict;
my $j=0;
use LWP;
use HTML::TreeBuilder;
my $url = 'http://www.job.ru/editres.html';
my $br = LWP::UserAgent->new();

my $resp = $br->request(HTTP::Request->new(GET => $url));

die unless $resp->is_success;
my $tree = HTML::TreeBuilder->new_from_content($resp->content);
my @forms = $tree->look_down('_tag', 'form');
my $url2 = 'http://www.job.ru/' . $forms[0]->attr('action');
my @content = $forms[0]->look_down('_tag', 'input');
my @post;
foreach my $t (@content) {
if ($t->attr('type') eq 'hidden') { push @post, $t->attr('name') . '=' . $t->attr('value'); }
}
push @post, "editObjectsForm_objectId=12459752";
push @post, "editObjectsForm_password=jobjob";
$tree->delete();

print '2:', $url2, "\n", join('&', @post), "\n"; ## debug info

my $req=HTTP::Request->new(POST => $url2);
$req->content_type('application/x-www-form-urlencoded');
$req->content(join('&', @post));
my $resp2 = $br->request($req);
die unless $resp2->is_success;
open FILE, '>', 'C:/temp/11.html';
print FILE $resp2->content;
close FILE;

my $tree2 = HTML::TreeBuilder->new_from_content($resp2->content);
my @forms2 = $tree2->look_down('_tag', 'form');
my $url3 = 'http://www.job.ru/' . $forms2[0]->attr('action');
my @content2 = $forms2[0]->look_down('_tag', 'input');
my @post2;

foreach my $t2 (@content2) { push @post2, $t2->attr('name') . '=' . $t2->attr('value'); }
$tree2->delete();

my $url4=$url3;
print '3; ', $url3, "\n", join('&', @post2), "\n"; ## debug info

my $req2=HTTP::Request->new(POST => $url3);
$req2->content_type('application/x-www-form-urlencoded');
$req2->content(join('&', @post2));
my $resp3 = $br->request($req2);
die unless $resp3->is_success;
open FILE, '>', 'C:/temp/12.html';
print FILE $resp3->content;
close FILE;



$url4 =~ s/viewaddres/addres/;
$url4 =~ s/=view/=add/;

print '4: ', $url4;

my $resp4 = $br->get( $url4 );
die "Can't get $url4 -- ", $resp4->status_line
unless $resp4->is_success;


if($resp4->content =~ m/его ID: (\d+)/i) {
print "ID=$1"; }
open FILE, '>', 'C:/temp/13.html';
print FILE $resp4->content;
close FILE;
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

30 май 2005, 12:41

Вообщем все правильно, только один нюанс, точнее два. На второй форме помимо input-ов, присутствуют также select-ы и texarea-ы :). Кроме того, русские буквы надо кодировать. Т.е. надо вставить в парсинг второй формы

Код: Выделить всё

my @post2;
my @content2 = $forms2[0]->look_down('_tag', 'input');
foreach my $t2 (@content2) { push @post2, $t2->attr('name') . '=' . urlcode($t2->attr('value')); }
@content2 = $forms2[0]->look_down('_tag', 'select');
foreach my $t2 (@content2) {
  my $opt = $t2->look_down('_tag', 'option', sub { $_[0]->attr('selected') });
  push @post2, $t2->attr('name') . '=' . urlcode($opt->attr('value'));
}
@content2 = $forms2[0]->look_down('_tag', 'textarea');
foreach my $t2 (@content2) { push @post2, $t2->attr('name') . '=' . urlcode($t2->as_text()); }
и описать подпрограмму urlcode

Код: Выделить всё

sub urlcode {
  my $str = shift;
  $str =~ s/([^a-zA-Z0-9 _\-])/sprintf("%%\U%02x", unpack("C", $1))/ge;
  $str =~ s/ /\+/g;
  return $str;
}
Проверил, все работает.
Ответить