Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Отображение в скрипте


Автор: Grig 17.7.2006, 16:16
Здравствуйте!
я захожу на сайт скриптом:
http://autosunrise.ru/cgi-bin/content.pl
Код

my $ua = LWP::UserAgent->new;
$ua->conn_cache(LWP::ConnCache->new);
$ua->cookie_jar({file => "./cookies.txt", autosave => 1,});
my $response = $ua->post('http://auctions.tokidoki.ru/index.php?p=project',
    [
        'username' => 'ru11196',
        'password' => 'qqqwwweee',
    ],
);
$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/?p=project/auctcompanies');
$req->header('Accept' => 'text/html,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png');
$res = $ua->request($req);
$p = $res->content;
print $p;


Специально прописываю так:
Код

$req->header('Accept' => 'text/html,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png');


Но при его запуске, он не отображает рисунки, а они мне позарез нужны!!
Видать сервер их как-то хитро блочит.
Скажите как можно прикинутся, чтобы обойти эту беду?
Еще я много раз читал про то, что народ каким-то образом парсит ответ от сервера, может объясните мне как это сделать?
Заранее большое спасибо!!
  

Автор: Nab 17.7.2006, 16:51
Рисунки отображает браузер, а не скрипт

А вы запросили эти рисунки? В документе который Вы запросили скорее всего ссылки на рисунки.
Вам нужно их выдернуть оттуда и закачать каждую картинку отдельным запросом.

HTML же в первом приближении графику содержать не может.

Accept означает всего лишь что ваш агент умеет работать с рисунками, и при их наличии они будут пересылаться если вы их запросите. К примеру текстовые броузеры типа links lynx и т.д. не имеют такой возможности и в строке accept не содержат перечисления графических типов файлов.

Иногда это указание серверному скрипту, чтобы он генерировал страницу без дизайнерских включений графики, конечно если он это умеет....
 

Автор: Grig 17.7.2006, 17:07
Странно и непонятно...
Меняю эту строчку:
Цитата(Grig @  17.7.2006,  16:16 Найти цитируемый пост)
$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/?p=project/auctcompanies');


На эту:
Код

$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/img/embl-small.gif');


Картинка загружается, но неполностью ((
С чем это может быть связано?

Вот сравните:
http://autosunrise.ru/cgi-bin/img.pl
и
http://auctions.tokidoki.ru/img/embl-small.gif
 

Автор: Nab 17.7.2006, 19:58
Код

hdr> HTTP/1.0 200 OK
hdr> Server: Microsoft-IIS/6.0
hdr> Unrecognized escape \h passed through at D: \USR\Grig\wwwroot\cgi-bin\img.pl line 49.
hdr> X-Powered-By: ASP.NET
hdr> Date: Mon, 17 Jul 2006 16:54:26 GMT
hdr> Connection: close
RequestDone Error = 0
StatusCode = 200

Это ответ сервера

Где у Вас указано что это картинка... скорее всего оно обрабатывается как текст 
И вона еще одна ошибочка в 3 строке

Добавлено @ 20:00 
Да и вообще заголовок сильно неправильный, того чего нужно нет, а чего не нужно так валом smile
Длины сообщения и типа не хватает как минимум... 

Автор: nitr 17.7.2006, 23:23
а ещё картинка бинарный файлик ;)
пример: binmode(FILEHANDLE); 

Автор: Grig 23.7.2006, 12:54
Nab, а каким должен быть ответ сервера, чтобы он позволял видеть картинки?

nitr, к сожалению, не все так просто. Картинки которые мне нужны не имеют статичного адреса.
Их, блин, тоже как-то зашифровывают ((

Вот например, мне нужны картинки с этого адреса:
Цитата

http://auctions.tokidoki.ru/?p=project/auctlot&id=2746220


Которые я пытаюсь получить таким образом:
Код

#!/usr/bin/perl -w
use LWP::ConnCache;
use LWP::UserAgent;
use LWP::Simple;
use HTML::LinkExtor;
use URI::URL;
my $ua = LWP::UserAgent->new;
$ua->conn_cache(LWP::ConnCache->new);
$ua->cookie_jar({file => "./cookies.txt", autosave => 1,});
my $response = $ua->post('http://auctions.tokidoki.ru/index.php?p=project',
    [
        'username' => 'ru11196',
        'password' => 'qqqwwweee',
    ],
         'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)',
         'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*',
         'Accept-Charset' => 'iso-8859-1,*,utf-8',
         'Accept-Language' => 'en-US',
);
$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/?p=project/auctlot&id=2746220');
$req->header('Accept' => 'text/html,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png');
$res = $ua->request($req);
$p = $res->content;
print $p;


Хотя бы отобразить их...
Подозреваю, что надо как-то обмануть сервер, поэтому и спрашиваю, что еще надо прописать в заголовок....
Помогите, пожалуйста!!! 

Автор: Nab 23.7.2006, 13:11
А почему бы Вам не проанализировать заголовок который отдает сервер, с которого Вы берете картинку.
Ведь там вполне корректные заголовки, вот можно их запросто подставить в свой скрипт.

А по поводу binmode, то что мешеает выходной поток перевести в бинарный ежим?

Код

$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/?p=project/auctlot&id=2746220');    
$req->header('Accept' => 'text/html,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png');    
$res = $ua->request($req);    
$p = $res->content;    
binmode(STDOUT);
print $p;


Добавлено @ 13:19 
Вот корректный заголовок с вашего сервера:
Код

md> GET /img/embl-small.gif HTTP/1.0
cmd> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
cmd> Referer: http://localhost/
cmd> User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)
cmd> Host: auctions.tokidoki.ru
cmd> Authorization: Basic YWRtaW46a2FybWVu
cmd> Cookie: CGISESSID=b0a0dd1e39f9ff848eef1915383ee19d
cmd> 
hdr> HTTP/1.0 200 OK
hdr> Date: Mon, 17 Jul 2006 16:53:57 GMT
hdr> Server: Apache/2.0.46 (Red Hat)
hdr> Last-Modified: Sat, 18 Mar 2006 06:48:41 GMT
hdr> ETag: "237a059-7f6-50df2440"
hdr> Accept-Ranges: bytes
hdr> Content-Length: 2038
hdr> Content-Type: image/gif
hdr> Connection: close
RequestDone Error = 0
StatusCode = 200


Добавлено @ 13:20 
там две части
та что cmd> это мой запрос

Вас интересует только hdr> 

Автор: Grig 23.7.2006, 13:58
Возвращает с помощью такого скрипта:
Код

$ua = LWP::UserAgent->new;
$req = HTTP::Request->new (HEAD => 'http://auctions.tokidoki.ru/?p=project/auctlot&id=2746220');
$res = $ua->request($req);
$responce = $res->as_string;
print $responce;


вот это:
Цитата

HTTP/1.1 200 OK 
Cache-Control: post-check=0, pre-check=0 
Connection: close 
Date: Sun, 23 Jul 2006 10:54:45 GMT 
Pragma: no-cache 
Accept-Ranges: bytes 
Server: Apache/2.0.46 (Red Hat) 
Content-Type: text/html 
Expires: Mon, 26 Jul 1997 05:00:00 GMT 
Last-Modified: Sun, 23 Jul 2006 10:54:45 GMT 
Client-Date: Sun, 23 Jul 2006 10:54:51 GMT 
Client-Peer: 84.252.156.254:80 
Client-Response-Num: 1 
X-Powered-By: PHP/4.3.11 


Каким образом можно добавить в этот заголовок нужные записи и убрать ненужные?
Ссылка на многострадальческий скрипт:
http://autosunrise.ru/cgi-bin/content.pl 

Автор: Nab 23.7.2006, 14:10
блин, ниче не понял  smile 

Это ссылка на страницу, а не на картинку....
и заголовок вполне корректный.

что нужно то? 

Автор: Grig 23.7.2006, 14:17
это ссылка не на страницу, а на скрипт который выкачивает эту страницу.
Вот, например, http://autosunrise.ru/content.txt
Надо, чтобы скрипт загружал мне эту страничку с картинками..
Конечно в конечном итоге, мне надо, чтобы скрипт сохранял изображения, но пока хотя бы так..
 

Автор: Nab 23.7.2006, 14:29
Блин, прикалуетесь?

Объясняю на пальцах:

Броузер когда его просят открыть страницу, сначала ее закачивает одним запросом...
Потом проанализировав страничку, видит что на ней есть тег IMG берет его src и запрашивает эту картинку, еще одним отдельным запросом. И только потом ее отображает.
Прочитайте я писал про текстовые броузеры раньше, которые не работая с графикой, не запрашивают картинок.

В одном документе html НЕЛЬЗЯ сразу отдать и картинку и страничку, у них разные URL, да и все разное, в том числе и режим передачи. HTTP протокол так устроен что отдает один документ за раз.

Чтобы у Вас на странице была картинка, блин не качайте ее, а просто возьмите ее урл и вставьте в результирующую страничку как <img src="URL">.

Это самый простой вариант:
Если Вы хотите контролировать полностью весь контент, то там должна быть ссылка не на оригинальную картинку а на Ваш скрипт который только и будет делать что вытаскивать реальные картинки и отдавать их.

А вообще, почитайте немного о HTTP, HTML,  чего то Вы таки не доучили  smile  

Автор: Grig 23.7.2006, 14:51
мда, спасибо большое!
Цитата(Nab @  23.7.2006,  14:29 Найти цитируемый пост)
В одном документе html НЕЛЬЗЯ сразу отдать и картинку и страничку, у них разные URL, да и все разное, в том числе и режим передачи. HTTP протокол так устроен что отдает один документ за раз.

Какого же тогда лешего, все остальные страницы с изображениями в скрипте отображаются нормально, а на этом сайте - нет.
Ладно, вот например берем на которую ссылается одна из картинок:
http://auctions.tokidoki.ru/pic.php?lot_id=2746220&pic_id=1
Может быть я правда чего-то не понимаю, но только загрузить ее все равно не могу.
В исходном тексте отображается всякая фигня, адрес рисунка не посмотреть ((. Как отобразить его все-таки?!?!
Тут висящий в петле и посиневший смайлик
 

Автор: Nab 23.7.2006, 15:09
Цитата(Grig @ 23.7.2006,  14:51)
мда, спасибо большое!
Какого же тогда лешего, все остальные страницы с изображениями в скрипте отображаются нормально, а на этом сайте - нет.

Потому как скорее всего на остальных страницах абсолютные ссылки на картинки, а на этой относительные, что в принципе более правильно.
Цитата

Ладно, вот например берем на которую ссылается одна из картинок:
http://auctions.tokidoki.ru/pic.php?lot_id=2746220&pic_id=1
Может быть я правда чего-то не понимаю, но только загрузить ее все равно не могу.

В исходном тексте отображается всякая фигня, адрес рисунка не посмотреть ((. Как отобразить его все-таки?!?!
Тут висящий в петле и посиневший смайлик


Скорее всего Вам прийдется делать преобразование линков в документе, либо задать базовый урл в начале HTML для всех относительных.Для этого смотрите тег <base>
Ну или для преобразования, надо распарситьполученный HTML и в тех местах где есть такие неполные ссылки, дополнить их полным именем с http:// ну и все остальное. 
Если картинки тоже только через пароль отдаются, то надо написать свой скрипт которые таким же макаром забирали бы картинки. А в самом HTML опять же заменить все эти короткие линки, на такие же но к своему скрипту, который и будет выдергивать картинки с реальных адресов.

Вообще то что Вы пишите называется CGI-proxy, и поверьте это очень не тривиальная вещь smile
в особенности если используется JavaScript, а у Вас вообще тяжелый вариант, я там еще Ajax засек smile
Как по мне то это монстр получиться smile И написать такое.... блин задача не на один месяц smile

 

Автор: Grig 23.7.2006, 15:17
Nab, да я уже понял, что задачка не из легких ((
и к тому же это у меня первая работа на Перл, но по-моему дело не в этом, а в том, что там действительно защит стоит дофигища.
Тебе спасибо большое за желание помочь!!

Добавлено @ 15:23 
Да вот еще:
хорошо бы если б рисунки содержали ссылки на самих себя, а то ведь они ссылаются на скрипт, который генерит отображение рисунка, а исходный текст странички посмотреть не представляется возможным...
задачка.  smile  smile  

Автор: Nab 23.7.2006, 15:27
Так а что Вам мешает подставлять эти же ссылки, но правильным образом измененные...?  

Автор: Grig 23.7.2006, 15:40
Nab, я уже пытался так сделать:
рисунок в HTML так ссылается:
Код

<img src="pic.php?lot_id=2732298&amp;pic_id=1" width="320" border="0" vspace="1" style="border:1px solid gray">

а загрузить страничку http://auctions.tokidoki.ru/pic.php?lot_id=2732298&pic_id=1 LWP-агентом
у меня не получается.
Когда я пытаюсь вручную посмотреть, что там находится в исходном коде, в надежде увидеть наконец-то ссылку на КОНКРЕТНЫЙ рисунок, получаю примерно вот такую фигню:
Цитата

юь?‹X6gR“АћР<'>Јц%»XcФЖѓ¤Z­ьVлq!†G2ЙЅё±дґ¦ЮA·‘Мк?і7мл¬ЯЮjъчмя
  

Автор: Nab 23.7.2006, 15:54
А с какой стати там будет ссылка?

ты получаешь уже рисунок, так и должно быть.... 

PS: А сайт этот что-то вообще здох smile 

Автор: Grig 23.7.2006, 16:01
А нельзя ли как-нить сохранить этот рисунок, имея эту ссылку?
(упрямый я все-таки smile ) 

Автор: Nab 23.7.2006, 16:05
Да пожалуйста, сохрани его в файл, а потом будешь без редиректа, но все одно, это не изменяет того факта, что ссылки прийдется по всему HTML парсить и изменять... 

Автор: Grig 23.7.2006, 16:09
Цитата(Nab @  23.7.2006,  16:05 Найти цитируемый пост)
Да пожалуйста, сохрани его в файл, а потом будешь без редиректа

[censored] smile 
Цитата(Nab @  23.7.2006,  16:05 Найти цитируемый пост)
ссылки прийдется по всему HTML парсить и изменять

Эта ерунда по сравнению с мировой революцией.  

Автор: Nab 23.7.2006, 16:14
Ну блин, ты даешь smile
Ты же уже сам почти все сделал, и написал

Код

$req = HTTP::Request->new(GET => 'http://auctions.tokidoki.ru/?p=project/auctlot&id=2746220');    
$req->header('Accept' => 'text/html,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png');    
$res = $ua->request($req);    
$p = $res->content;    

open (F, ">picture.jpg") || die "Нифига записать в файл не получается $@";
binmode(F);
print F $p;
close F;

  

Автор: Grig 23.7.2006, 16:25
ура!!!
Блин, извините товарищи, за такую пулеметную очередь тупых вопросов.
Я тут просто в ступор похоже впадал..
Все заработало!!
Зашибись...

Добавлено @ 16:26 
надеюсь через 2-3 месяца, над всем что здесь написал, буду смеятся как ребенок.. smile  

Автор: Nab 23.7.2006, 16:29
Я конечно рад за тебя smile

Но боюсь что задача твоя так просто не решиться smile

в ступоре тебе прийдется еще не раз побывать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)