From 2cfede2769d7d9374a7275d43cfeda78b08354b7 Mon Sep 17 00:00:00 2001 From: eleksir Date: Thu, 22 Apr 2021 20:53:02 +0300 Subject: [PATCH] Sometimes xkcd.ru returns redirect to 404 --- lib/BotLib/Xkcd.pm | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/BotLib/Xkcd.pm b/lib/BotLib/Xkcd.pm index 535c3e8..f6cf51d 100644 --- a/lib/BotLib/Xkcd.pm +++ b/lib/BotLib/Xkcd.pm @@ -13,10 +13,25 @@ our @EXPORT_OK = qw (Xkcd); sub Xkcd { my $http = HTTP::Tiny->new (timeout => 5, max_redirect => 0); - my $r = $http->get ('https://xkcd.ru/random/'); + my $location; + my $status = 400; + my $c = 0; - if (defined $r->{headers} && defined $r->{headers}->{location} && $r->{headers}->{location} ne '') { - return sprintf 'https://xkcd.ru/i/%s_v1.png', substr ($r->{headers}->{location}, 1, -1); + do { + my $r = $http->get ('https://xkcd.ru/random/'); + + if (defined $r->{headers} && defined $r->{headers}->{location} && $r->{headers}->{location} ne '') { + $location = substr ($r->{headers}->{location}, 1, -1); + $location = sprintf 'https://xkcd.ru/i/%s_v1.png', $location; + $r = $http->head ($location); + } + + $c++; + $status = $r->{status}; + } while ($c < 3 || $status >= 404); + + if ($status == 200) { + return $location; } return 'Комикс-стрип нарисовать не так-то просто :(';