Автор Тема: cхватить куки...  (Прочитано 3056 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Elenka

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 83
  • +0/-0
  • 0
    • Просмотр профиля
    • http://soccercleats.blogs.sapo.pt
cхватить куки...
« : 01 Июня 2005, 02:01:03 »
требуется залогиниться на сайте, при логине сервер дает куки, надо их взять и посылать далее уже запросы на сервер с этими куками...

как реализовано:

с логином все ясно, HTTP::Request::Form

далее

use HTTP::Cookies;
$cookie_jar = HTTP::Cookies->new();

#сами куки экстрактим тут:

$my_cookie=$cookie_jar->extract_cookies( $response );

#затем выясняется, что данная переменная хранит весь хеадер, а сами куки запрятаны аж тут:

@{@{@{$my_cookie{_headers}}{\'set-cookie\'}}}

#данные в виде: cookie_name=blabla;expires=...;path=/
# далее парсим это дело, дабы вытащить все как надо


И куки готовы к употреблению.

НО
больно уж утомителен процесс и при хорошей нагрузке по-моему больно трудоемок, может существует другой способ попроще ?:confused:

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
cхватить куки...
« Ответ #1 : 01 Июня 2005, 10:56:44 »
Проще (когда куки идут не совсем стандартно - особенно на IIS серваках) работать с хэдерами на прямую руками. Помница я писал скрипт для спамеров (было дело - каюсь) - так вот там был просто тихий ужас с заголовками - (я работал через LWP и набор модулей HTTP) - в конце концов остановил свой выбор на собственном парсинге заголовков. Потому что извлекать из хэша хэшей массивов и т.п структур эти кукисы - действительно иногда утомительно (и учитывая скудную документацию по LWP).
Ворота в perl - perlmonks.org.ru

Оффлайн Elenka

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 83
  • +0/-0
  • 0
    • Просмотр профиля
    • http://soccercleats.blogs.sapo.pt
cхватить куки...
« Ответ #2 : 01 Июня 2005, 12:34:23 »
cr4ck3r
my $r=$response->headers;
@{@{$r}{\'set-cookie\'}}

это имелось в виду ?
или как их еще взять руками ?

Цитировать
Помница я писал скрипт

а глянуть можно ?:)

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
cхватить куки...
« Ответ #3 : 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 striptohtml
{
    ($_) = @_;
    s/\\n//g;
    s/\\t//g;
    s/\\s\\s+/ /g;
    s/\\    s/\\>/\\>\\n/sg;
    return($_);
}

# парсим форму для логина
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)  и с отловом сессии.

Работать с куками руками я предпочел так (примерно):

#!/usr/bin/perl

use LWP::UserAgent;

$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);
# дальше работаем с заголовком

foreach (split/\\n/,$header) {
            push(@cookies,$_) if /^Set-Cookie/;
}
# выводим кукисы
foreach (@cookies) {
print $_,"\\n";
}



или так:

!/usr/bin/perl

use LWP::UserAgent;

$url=\'http://forums.webscript.ru/\';
$ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
$header= $res->headers;

@cookies=@{$header->{\'set-cookie\'}};

foreach (@cookies) {
print $_,"\\n";
}


Что в результате получилось значительно надежнее в моем варианте. Хотя возможно просто нехватка толковой документации по модулю.
« Последнее редактирование: 01 Июня 2005, 16:22:57 от cr4ck3r »
Ворота в perl - perlmonks.org.ru

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28