Anek.pm: fix rare case when fetched response is unparsable
This commit is contained in:
@@ -19,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;
|
||||||
|
|||||||
Reference in New Issue
Block a user