use Socket;
use Cwd;
use HTTP::Request::Common;
sub host2ip
{
my $host = shift;
return inet_aton($host) if /(\d+.){3}\d+/;
return gethostbyname($host);
}
$dir = getcwd;
opendir D, $dir or die "cant open dir: $!";
@flist = grep { !/^\./ } readdir D;
for (@flist)
{
next if (-d or /getnew/i or /temp/ or /my/);
/\[(.+)\]\s(.+)\s-\s(\d*)(.+)/;
$team = $1;
$name = $2;
if ($episode < $3) {$episode = $3};
#last; # ========= тут
}
$episode++;
closedir D;
print "Trying to get:\t\[$team\] $name - $episode\n";
$addr = gethostbyname('www.nyaatorrents.org');
$paddr = sockaddr_in (80, $addr);
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname(tcp)) or die "cant make socket because $!";
connect (SOCK, $paddr) or die "cant connect $!";
send SOCK, HTTP::Request->new(GET => "http:\/\/www\.nyaatorrents\.org\/\?page=search\&term=$name\&cat=0_0")->as_string(), 0;
while(<SOCK>)
{
if (/href\s*=\s*\"([^\&]+)\&([^\&]+)\"\stitle=\"\[$team\]\s$name\s-\s$episode/) # и тут
{
$urlsub1 = $1;
$urlsub2 = $2;
#shutdown SOCK, 0;
last;
}
}
$URL="$urlsub1\&$urlsub2";
print "URL:\t\t$URL\n";
close SOCK;
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname(tcp)) or die "cant make socket because $!";
connect (SOCK, $paddr) or die "cant connect $!";
#=pod
#unlink "temp.html" or die "cant delete temp file temp.html: $!\ndelete it manually -_-";
open F, ">temp.html" or die "cant create/open: $!\n";
send SOCK, HTTP::Request->new(GET => "$URL")->as_string(), 0;
while(<SOCK>)
{
print F $_;
}
close F;
close SOCK;
#=cut
[PERL] Regexp и socket
Каждую неделю мне приходилось руками искать и качать новую серию аниме, и я подумал: "почему бы не написать скрипт, который ето делает?". И у меня почти получилось, но возникла пара вопросов, ответы на которые я не могу найти :confused: Надеюсь, вы мне подскажете, где я не прав.
Вот мой скрипт, который ищет в папке серию с самым большим номером, создает сокет с одним трекером, посылает туда запрос на поиск торрента и выпарсивает урл:
Код:
Вообще, он работает почти как надо:
Код:
Trying to get: [Leopard-Raws] To Aru Kagaku no Railgun - 22
URL: http://www.nyaatorrents.org/?page=torrentinfo&tid=117395
URL: http://www.nyaatorrents.org/?page=torrentinfo&tid=117395
Проблема возникает, когда в папке несколько серий. Например так:
[Leopard-Raws] To Aru Kagaku no Railgun - 20
[Leopard-Raws] To Aru Kagaku no Railgun - 21
[Leopard-Raws] To Aru Kagaku no Railgun - 22
В етом случае нужно раскомментировать last(сверху там помечен "тут"). А ето приводит к тому, что регексп в строке(помечена "и тут") перестает правильно обрабатываться. Точнее, в $urlsub1 и $urlsub2 вообще ничего не записывается. Вот ето я и не могу никак понять...
И еще маленький вопрос про сокеты.
Я хочу послать send новый http запрос в сокет, но для етого мне приходиться закрывать старый сокет и открывать его еще раз. Если етого не делать, то при получении ответа, я получаю то, на чем остановился в прошлый раз. В коде у меня закомменчена строчка "shutdown SOCK, 0;", которая дожна прекращать чтение данных из сокета, но не прекращает. Или я использую не ту. Я уверен, есть какое-то простое решение )