мониторинг цен на товары

Реализация на языке perl

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом,лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language — «практический язык для извлечения данных и составления отчётов»[2]. Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом pearl («жемчужина»). Но затем стало известно, что такой язык существует (см. PEARL (англ.)), и букву «a» убрали. Символом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе работа с регулярными выражениями, встроенная в синтаксис. Перл унаследовал много свойств от языков СиAWK, скриптовых языков командных оболочек UNIX.

Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу http://www.cpan.org.

Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}
Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}
Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}
Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}
Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}
Особенности запуска

Для работы нужны две библиотеки 

backportPP.pm - http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.49_01/lib/JSON/backportPP.pm ( ее нужно положить в директорию JSON)

и JSON - http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm

Постановка задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use LWP::UserAgent;
use JSON;

sub dopost {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/api2/';
    my $content = $ua->post($url, $_[1])->decoded_content();
    return decode_json($content);
}

my $data = {
    task => 'price_monitor',
    data => encode_json({
        # ### Задание - это список ассоциативных массивов Ключ-Значение
        data => [
            [  ],
            [  ],
            [  ]
            ],
        param => {}
    })
};

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/

my $res = dopost($apikey, $data);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($res->{success}) {
    print 'ok ',$res->{hash};
} else {
    if (exists $res->{message}) {
        print 'error ',$res->{message};
    } else {
        print 'error';
    }
}
Получение задания
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use LWP::UserAgent;
use JSON;
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use Data::Dumper;

sub doget {
    my $ua = LWP::UserAgent->new();
    my $url = 'http://smartfetch.io/'.$_[0].'/get/'.$_[1];
    my $resp = $ua->get($url);
    my $content = $resp->decoded_content();
    my $code = $resp->code();
    return {code => $code, content => $content}
}

my $apikey = "[API КЛЮЧ]"; # его можно посмотреть на странице http://smartfetch.io/private/profile/
my $hash = ИДЕНТИФИКАТОР;

my $resp = doget($apikey,$hash);

binmode(STDOUT, ":utf8"); #Для вывода utf-8 без варнинга

if ($resp->{code}==200) {
    my $z = new IO::Uncompress::Unzip \$resp->{content}
            or die "unzip failed: $UnzipError\n";
    my $buffer;
    my @columns;
    my $obj;
    while (!$z->eof()) {
        $hdr = $z->getHeaderInfo();
        $z->read($buffer, $hdr->{UncompressedLength});
        if ($hdr->{Name} eq 'column.txt') {
            @columns = split(',', $buffer); # Читаем колонки. В зип-архиве файл column.txt идет первым,
                                            # поэтому список колонок будет доступен при работе с json-файлом ниже.
        } else {
            $obj = decode_json($buffer);
            print Dumper($obj); # Работаем с данными как угодно
        }
        $z->nextStream();
    }
} else {
    print $resp->{content}; # Опять так, по идее сервер должен отдавать json, но отдает html. Переделать на json
                            # не составит никакого труда.
}