1

Anek.pm: fix rare case when fetched response is unparsable

This commit is contained in:
eleksir
2021-08-15 23:54:35 +03:00
parent 87c29ac8d3
commit 5e53450221

View File

@@ -6,7 +6,6 @@ use warnings;
use utf8; use utf8;
use open qw (:std :utf8); use open qw (:std :utf8);
use English qw ( -no_match_vars ); use English qw ( -no_match_vars );
use Carp qw (cluck);
use Encode; use Encode;
use HTML::TokeParser; use HTML::TokeParser;
use HTTP::Tiny; use HTTP::Tiny;
@@ -20,53 +19,66 @@ our @EXPORT_OK = qw (Anek);
sub Anek { sub Anek {
my $r; my $r;
my $ret = 'Все рассказчики анекдотов отдыхают'; my $ret = 'Все рассказчики анекдотов отдыхают';
my $got_anek = 0;
# time to time anekdot.ru can give valid but unparsable response
# i've no clue where's err, just fetch another response and try again :)
for (1..3) { for (1..3) {
my $ua = HTTP::Tiny->new (timeout => 3); for (1..3) {
$r = $ua->get ('https://www.anekdot.ru/rss/randomu.html'); my $ua = HTTP::Tiny->new (timeout => 3);
$r = $ua->get ('https://www.anekdot.ru/rss/randomu.html');
if ($r->{success}) {
last;
}
sleep 2;
}
if ($r->{success}) { if ($r->{success}) {
last; my $json;
} my $response_text = decode ('UTF-8', $r->{content});
my @text = split /\n/, $response_text;
sleep 2; while (my $str = pop @text) {
} if ($str =~ /^var anekdot_texts \= JSON/) {
$str = (split /JSON\.parse\(\'/, $str, 2)[1];
if ($r->{success}) { if (defined $str && length ($str) > 10) {
my $json; $json = (split /\';\)/, $str, 2)[0];
my $response_text = decode ('UTF-8', $r->{content}); last;
my @text = split /\n/, $response_text; }
while (my $str = pop @text) {
if ($str =~ /^var anekdot_texts \= JSON/) {
$str = (split /JSON\.parse\(\'/, $str, 2)[1];
if (defined $str && length ($str) > 10) {
$json = (split /\';\)/, $str, 2)[0];
last;
} }
} }
}
if (defined $json && length ($json) > 10) { if (defined $json && length ($json) > 10) {
$json =~ s/\\"/"/g; $json =~ s/\\"/"/g;
$json =~ s/\\\\"/\\"/g; $json =~ s/\\\\"/\\"/g;
chop $json; $json = substr $json, 0, -3;
chop $json;
chop $json;
my $anek = eval { ${JSON::XS->new->relaxed->decode ($json)}[0] };
if (defined $anek) { my $anek = eval { ${JSON::XS->new->relaxed->decode ($json)}[0] };
my @anek = split (/<br>/, $anek);
$ret = join ("\n", @anek); if (defined $anek) {
my @anek = split /<br>/, $anek;
$ret = join "\n", @anek;
if (length ($ret) > 1) {
$got_anek = 1;
}
} else {
$log->warn (sprintf '[WARN] anekdot.ru server returns incorrect json, full response text message: %s', $response_text);
}
} else { } else {
$log->warn (sprintf '[WARN] anekdot.ru server returns incorrect json, full response text message: %s', $response_text); $log->warn (sprintf '[WARN] anekdot.ru server returns unexpected response text: %s', $response_text);
} }
} else { } else {
$log->warn (sprintf '[WARN] anekdot.ru server returns unexpected response text: %s', $response_text); $log->warn (sprintf '[WARN] anekdot.ru server return status %s with message: %s', $r->code, $r->message);
} }
} else { if ($got_anek) {
$log->warn (sprintf '[WARN] anekdot.ru server return status %s with message: %s', $r->code, $r->message); last;
}
} }
return $ret; return $ret;