Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[PERL] Regexp и socket

57K
06 марта 2010 года
pururin-chan
1 / / 06.03.2010
Доброе время суток!
Каждую неделю мне приходилось руками искать и качать новую серию аниме, и я подумал: "почему бы не написать скрипт, который ето делает?". И у меня почти получилось, но возникла пара вопросов, ответы на которые я не могу найти :confused: Надеюсь, вы мне подскажете, где я не прав.

Вот мой скрипт, который ищет в папке серию с самым большим номером, создает сокет с одним трекером, посылает туда запрос на поиск торрента и выпарсивает урл:
Код:
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*\"([^\&]+)\&amp;([^\&]+)\"\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

Вообще, он работает почти как надо:
 
Код:
Trying to get:  [Leopard-Raws] To Aru Kagaku no Railgun - 22
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;", которая дожна прекращать чтение данных из сокета, но не прекращает. Или я использую не ту. Я уверен, есть какое-то простое решение )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог