Forum Webscript.Ru
Программирование => Perl => Тема начата: Loiso от 07 Ноября 2001, 22:42:14
-
С помощью libwww, методом get (post, head) пытаюсь забрать содержимое сервера, но получаю страничку такого содержания:
Method Not Implemented
get to /xwww/proxy.htm not supported.
Invalid method in request get /xwww/proxy.htm HTTP/1.0
--------------------------------------------------------------------------------
Apache/1.3.19 Server at http://www.samair.ru Port 80
Я думал что CGI полностью эмулирует клиента. Т.е. любой сервер будет на 100% уверен,что к нему кто-то зашел через IE (NN). Какой метод использует IE при доступе к страничкам? Можно как-нибудь обмануть сервер?
-
а скриптик покажешь?
-
Вот:
#!c:/perl/bin/perl.exe
use CGI;
use LWP::UserAgent;
$ua=new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);
$req = HTTP::Request -> new (\'get\',\'http://www.samair.ru/xwww/proxy.htm\');
$req->content_type(\'application/x-www-form-urlencoded\');
$req->content(\'match=www&errors=0\');
$ua->request($req, "samara.htm");
print "Content-type: text/plain\\n\\n";
open (PROXY, "< samara.htm");
$i=0;
while ($prx=) {
if ($prx=~/[0-9\\.:]{11,20}/) {
$i++;
$prx=~/([0-9\\.:]{11,20})/;
print $i." ".$1."\\n";
}
}
close (PROXY);
Кстати, у меня по этому скриптику есть еще один вопросик...
Когда я писал этот скрипт, мой броузер перестал определать файл как cgi-скрипт (спрашивает запустить файл или сохранить его на диске)! Другие скрипты работали нормально! Я решил выяснить причину, ей оказалась строка print $i." ".$1."\\n"; (которая в конце скрипта). Точнее только эта ее часть: $i." ".$1."\\n"; Когда ее убираешь, все начинает работать нормально. Но если ее убрать, запустить скрипт на выполнение, потом добавить строку обратно и нажать в броузере рефрешь - все будет работать! Почему может быть такая фигня? Может это просто какой-то глюк???
-
твой браузер воспринимает выводимую скриптом инфу как текстовый файл попробуй вместо print "Content-type: text/plain\\n\\n";
вставь print "Content-type: text/html\\n\\n";
должно заработать
Я думал что CGI полностью эмулирует клиента. Т.е. любой сервер будет на 100% уверен,что к нему кто-то зашел через IE (NN). Какой метод использует IE при доступе к страничкам?
Вот это я как понял, ты бездумно выдернул из хелпа :)
$ua->agent("AgentName/0.1 " . $ua->agent);
Эта строчка и указывает агента :)
Аааа вообще весь кусок из хелпа... дык метод get для твоего случая не проще использовать?
-
Во-первых: там get, http и т.д. не поддерживается. Если написать, например, http://www.webscript.ru/ , то все будет ок. Всю страничку он тебевыплюнет.
Во-вторых: пропиши нормальный юзер-агент, наример, Mozilla/5.0.
В-третьих: какой контент тип пишешь? "application/x-www-form-urlencoded". Нельзя ли обойтись "text/html"?
-
твой браузер воспринимает выводимую скриптом инфу как текстовый файл попробуй вместо print "Content-type: text/plain\\n\\n";
вставь print "Content-type: text/html\\n\\n";
должно заработать
Не... это не из-за этого... Мне и нужно чтобы он выводил не html, а текст. С другими серверами все работает отлично и с plain. Не работает только с этим сайтом!
Вот это я как понял, ты бездумно выдернул из хелпа
$ua->agent("AgentName/0.1 " . $ua->agent);
Точно!!! Так дело и было... Не очень догнался чего там вообще писать можно...
Аааа вообще весь кусок из хелпа... дык метод get для твоего случая не проще использовать?
А я чего использовал???
Во-первых: там get, http и т.д. не поддерживается. Если написать, например, http://www.webscript.ru/ , то все будет ок. Всю страничку он тебевыплюнет.
Чего-то я не очень понял... Можно поподробнее?
Попробовал последовать вашим советам (насколько я их понял). У меня получилось что-то вроде:
#!c:/perl/bin/perl.exe
use CGI;
use LWP::UserAgent;
$ua=new LWP::UserAgent;
$ua->agent("Mozilla/5.0");
$req = HTTP::Request -> new (\'get\',\'http://www.samair.ru/\');
$req->content_type(\'text/html\');
$req->content(\'match=www&errors=0\');
$res=$ua->request($req);
open (SAMARA, "> samara.htm");
print SAMARA $res->content;
close SAMARA;
print "Content-type: text/plain\\n\\n";
open (PROXY, "< samara.htm");
$i=0;
while ($prx=) {
if ($prx=~/[0-9\\.:]{11,20}/) {
$i++;
$prx=~/([0-9\\.:]{11,20})/;
print $i." ".$1."\\n";
}
}
close (PROXY);
Да, кстати, то что метод get не поддерживается он пишет не в результате выполнения программы, а в файле samara.htm