#затем выясняется, что данная переменная хранит весь хеадер, а сами куки запрятаны аж тут:
@{@{@{$my_cookie{_headers}}{\'set-cookie\'}}}
#данные в виде: cookie_name=blabla;expires=...;path=/ # далее парсим это дело, дабы вытащить все как надо
И куки готовы к употреблению.
НО больно уж утомителен процесс и при хорошей нагрузке по-моему больно трудоемок, может существует другой способ попроще ?:confused:
Название: cхватить куки...
Отправлено: cr4ck3r от 01 Июня 2005, 10:56:44
Проще (когда куки идут не совсем стандартно - особенно на IIS серваках) работать с хэдерами на прямую руками. Помница я писал скрипт для спамеров (было дело - каюсь) - так вот там был просто тихий ужас с заголовками - (я работал через LWP и набор модулей HTTP) - в конце концов остановил свой выбор на собственном парсинге заголовков. Потому что извлекать из хэша хэшей массивов и т.п структур эти кукисы - действительно иногда утомительно (и учитывая скудную документацию по LWP).
Название: cхватить куки...
Отправлено: Elenka от 01 Июня 2005, 12:34:23
cr4ck3r my $r=$response->headers; @{@{$r}{\'set-cookie\'}}
это имелось в виду ? или как их еще взять руками ?
Цитировать
Помница я писал скрипт
а глянуть можно ?:)
Название: cхватить куки...
Отправлено: cr4ck3r от 01 Июня 2005, 16:10:51
глянуть можно - но у меня тут только не дописанный вариант остался, остальное дома. Здесь я как раз заморачивался с объектами от LWP.
#!/usr/bin/perl -w $|=1; use strict; use LWP::UserAgent; use HTTP::Cookies; #use URI::URL; use CGI::Carp qw/fatalsToBrowser/; use HTML::LinkExtor; use CGI qw(Vars param header); #################### Основные установки ############### my $user=\'rpk74@uzhe.net\'; my $pass=\'131313\'; # основной url my $url_main="http://www.careerbuilder.com"; # url логин-скрипта my $login_page="http://www.careerbuilder.com/Share/Login.aspx"; # url формы для поиска. my $search_form="http://www.careerbuilder.com/JobPoster/Resumes/ResumeSearchAdv.aspx"; # # форма для логина my %form1=( \'login:cbsys_login_email\' => $user, \'login:cbsys_login_password\' => $pass, \'__VIEWSTATE\' => undef, ); # форма для поиска my %Vars=(); # массив для хранения ссылок my @LINKS=(); ### переменная для хранения поля Location my $location; ########### HTML ############################### print header(-charset=>\'windows-1251\'); if(!param()) { require \'./html.pm\';# подключаем модуль содержащий одну функцию вывода html print show_first(); # <- вот она exit 0; } else { print qq(Принимаю данные из формы................); %Vars=Vars;# дампим все переменные переданные из формы в хэш print qq(...OK ); } ################################################ my $ua=LWP::UserAgent->new(); $ua->cookie_jar({ });# храним в памяти куки # запрашиваем страницу с логином print qq(Запрашиваю страницу для авторизации.....); my $log=$ua->get("$login_page"); print qq(...OK ); #if ($log->code eq \'302\') { # если ответ 302, то... print qq(Перехожу по редиректу.........); $location=$log->previous->headers->{location}; # переходим по редиректу $log=$ua->get("$url_main$location"); print qq(...$location ); #} # сохраняем полученную страницу для парсинга элементов формы my $form=$log->content; print qq(Обрабатываю скрытые поля................); $form1{\'__VIEWSTATE\'}=get_viewstate($form); print qq(...OK ); # авторизуемся print qq(Авторизуюсь.............................); $log=$ua->post("$url_main$location",\\%form1); print qq(...OK ); $location=$log->header(\'location\'); $log=$ua->get("$url_main$location"); print $log->content; exit 0; print qq(Авторизация прошла успешно ); ### вставить сюда запрос формы для поиска ########### print qq(Запрашиваю форму для поиска.............); $log=$ua->get("$search_form");# запрашиваем форму для поиска print qq(...OK ); #if ($log->code eq \'302\') {# если ответ не 200 (а к примеру 302) то отлавиливаем поле location $location=$log->header(\'location\');# ловим location print qq(Перемещаюсь на $location........); $log=$ua->get("$url_main$location");# еще разик запрашиваем пагу print qq(...OK ); $search_form=$url_main.$location; #} $form=$log->content;# сохраняем пагу для извлечения viewstate поля #print $form and exit 0; # Меняем значение поля viewstate print qq(Извлекаю скрытые поля...................); $Vars{\'__VIEWSTATE\'}=get_viewstate($form);# print qq(...$Vars{\'__VIEWSTATE\'} ); ######### Начинаем поиск #################### print qq(Отправляю поисковый запрос на $search_form......); # делаем запрос к нужной странице (возможно опять придется изгалятся с location) $log=$ua->post("$search_form",\\%Vars); print qq(...OK ); #unless ($log->is_success) {# если ответ не 200 (а к примеру 302) то отлавиливаем поле location print qq(Перемещаюсь на $location........); $location=$log->header(\'location\');# ловим location $log=$ua->get("$url_main$location");# еще разик запрашиваем пагу print qq(...OK ); #} # создаем временный файл print qq(Создаю временный файл....................); open(TMP,">","./tmp/search.html") || die "Can\'t create temp file: $!\\n"; print qq(...OK ); if ($log->is_success) { print qq(Записываю результаты запроса во временный файл...); print TMP $log->content; # будем сохранять результат запроса во временный файл print qq(...OK ); } else { print qq(Запрос неудачный!); die $log->status_line; } close(TMP); print qq(Извлекаю ссылки из временного файла....); # дальше будем парсить файл, отбирать нужные линки, и складывать их в массив. my $parser=HTML::LinkExtor->new(\\&get_it,$url_main); $parser->parse_file("./tmp/search.html"); # функция callback на вызов LinkExtor sub get_it { my($tag, %links) = @_; if($tag=~/^a/) { my (undef,$str)=split(/\\s+/,"@{[%links]}"); push(@LINKS,$str) if($str=~m|/jobposter/resumes/resumedetails.aspx|i);# только линки на скрипты с параметрами } } # сюда мы по идее должны прийти с полным массивом @LINKS print qq(...OK ); if(scalar @LINKS <1) { print qq(По вашему запросу ничего не найдено ); } print qq(Создаю временный файл для хранения ссылок.....); open(TMP,">","./tmp/links.html") || die "Can\'t create temp file: $!\\n"; print qq(...OK ); foreach my $linkz (@LINKS) { print TMP $linkz,"\\n"; } close(TMP); print qq(Файл записан успешно! ); print qq(Приступаю к многопоточной обработке ссылок ); exit;
# парсим форму для логина sub get_viewstate { my $form=shift; $form=striptohtml($form); # делаем хтмл более убодоваримым for my $line (split(/\\n/,$form)) { if ($line =~ /for my $element (split / /,$line) { $element =~ s/[<>\\"]//g;# вырезаем тэги # если элемент содержит поле value считываем его в хэш для формы if($element=~/^value/) { $element=substr($element,6); $element=~s/^\\"//; $element=~s/\\"$//; return $element; } } } } }
Даю код как есть. то есть сайт реальный. Огромный гимор на этом сайте был с постоянными редиректами (поэтому приходилось отлавливать поле Location) и с отловом сессии.
Работать с куками руками я предпочел так (примерно):
$url=\'http://forums.webscript.ru/\'; $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); ($header)=split(/\\n\\n/,$res->as_string); # дальше работаем с заголовком