Forum Webscript.Ru
Программирование => Perl => Тема начата: Grundic от 04 Ноября 2005, 17:19:41
-
Надо по крону ежедневно заливать себе на сайт файл с дружественного HTTP.
По крону - сейчас сижу мануалю. :)
А вот как закачать к себе в какую-нить /dat файл с другого сайта?
Заранее сэнькс всем сочувствующим. (:
-
Возможно, подойдет [p]file_get_contents[/p]
Либо объясните, что за файл.
-
hanslinger
Это в perl6 появилась такая функция?
Grundic
perldoc LWP
man wget
-
NeoNox
тьфу ты =)
-
#!/usr/bin/perl
use Socket;
use IO::Handle;
use strict;
my ($h, $p, $r, $d, $cz, $ltg, $tr, $buf);
my $u = shift or die "specifu url.\\n"; # берём урл из параметров скрипта
my $f = shift or die "specify output file.\\n"; # берём выходной файл отуда же
open(F, ">$f") or die "file."; # открываем выходной файл на чтение
$p = 80; # порт по умолчанию
$r = "/"; # ури по умолчанию
$u =~ s/http\\:\\/\\///; # удаляем из урла лишнее (лишнее для данного скрипта, конечно =))
($h, $p, $r)= ($u=~ m#([^/:]*):?([^/]*)(/.*)?$#i); # парсим так, что вид урла может иметь вид
# [url]www.url.com:8080/dir/page.html?params=value[/url] etc. то есть имеется возможность задать порт
$p = ($p || 80) ; # думаю ясно
$r = ($r || "/") ; # тоже
socket(S,AF_INET,SOCK_STREAM,getprotobyname("tcp")) or die "$!\\n"; # создаём сокет
connect(S,sockaddr_in($p,inet_aton($h))) or die "$!\\n"; # конектимся
S->autoflush(1);
print S "GET $r HTTP/1.1\\r\\nHOST: $h\\r\\n\\r\\n"; шлём GET запрос для сервера, поддерживающего HTTP 1.1
my $ih = 1; #
my ($rp, %hv, $vn, $v);
while ($d = ) { #читаем ответ сервера. Значения из HTTP заголовка заносим в хэш %hv (header values)
if ($d =~ /^\\015?\\012/) {
last;
}
else {
if ($ih == 1) {
$rp = (split(/ /, $d))[1];
$ih = 2;
}
else {
($vn, $v) = $d =~ /(.+?):(.+?)\\r?\\n/;
$hv{$vn} = $v;
}
}
}
if ($hv{\'Transfer-Encoding\'} =~ /chunked/i) { #если параметр HTTP Transfer-Encoding = chunked, то данные читаем
#способом номер раз =) подробнее в RFC
while ($cz = hex() ) {
$ltg = $cz ;
while ($ltg && ($tr = read(S, $d, $ltg)) ) {
print F $d;
$ltg -= $tr ;
}
defined($tr) || die "$!" ;
$_= ;
}
}
elsif ($hv{\'Content-Length\'}) { # иначе и определён параметр Content-Length номер два =) подробнее там же
$ltg = $hv{\'Content-Length\'};
while ($ltg && ($tr = read(S, $d, ($ltg > 16384)?16384:$ltg))) {
print F $d;
$ltg-= $tr ;
}
defined($tr) || die "$!" ;
$ltg && die "Not all data.\\n";
} else { # иначе просто читаем данные по 16384 байт =)
print F $_ while read(S, $_, 16384) ;
}
close S;
# конец =)
-
Kleyster
Постарайся обьяснить что этот код делает, иначе это медвежья услуга. Тем более, что не понятно что за тип данных собирается закачивать человек.
Кстати, есть IO::Socket::INET на нем этот код будет в четыре раза короче.
-
добавил комментарии, а вообще скрипт берёт урл из параметра один ($ARGV[0]) и выходной файл из параметра два ($ARGV[1]) и скачивает данные по этому урлу в аутпут файл =) протокол только HTTP, урл может иметь вид http://host.com:8080/url/url.html?params=value&other=blah
прошу прощения за имена переменных =) варианта с более длинными к сожалению не осталось =)
-
Господа, прошу прощения за тормозной ответ.
Файл для закачки - это xls.
Сейчас сижу рюхаю посты. Спасибо за помощь. :) Если кто чего еще - буду благодарен. :))
ЗЫ: кстати, а как xls распознавать перлом - надо поиск по ячейкам организовать (выводить строку ячеек, содержащюю заданный контент)? :))
-
посмотри этот модуль
http://search.cpan.org/search?query=Spreadsheet&mode=all
-
Господа, всем спасибо. Решил проблему просто и не принужденно. :))
Кому надо - решил проблему так:
exec "wget -O [куда-что] [http://откуда-что]";
или
exec "fetch -o [куда-что] [http://откуда-что]";
Тупо и просто. (:
-
Kleyster Задачу читал?
-
читал, что не так? чем отличается от его решения через exec, прошу прощения? или я всё ещё не догоняю?
как я понял, ему нужно слить с файл по http с какого-то сервака
-
Kleyster Что делает семейство модулей Spreadsheet?
-
ЗЫ: кстати, а как xls распознавать перлом - надо поиск по ячейкам организовать (выводить строку ячеек, содержащюю заданный контент)? )
человек спросил
-
Тфу, блин. Проглядел. Извини.
-
да ничего, бывает =)