Как установить версию HTTP с помощью запроса Haskell

Я прорабатываю первую итерацию лекций Plutus Pioneer Lectures, и код лекции 6, который получает обменный курс от coinmarketcap.com, возвращает ошибку 403:

      getExchangeRate = runReq defaultHttpConfig $ do
    v <- req
        GET
        (https "coinmarketcap.com" /: "currencies" /: "cardano")
        NoReqBody
        bsResponse
        mempty
    let priceRegex      = "priceValue___11gHJ\">\\$([\\.0-9]*)" :: ByteString
        (_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString])
        d               = read $ unpack bs :: Double
        x               = round $ 1_000_000 * d
    liftIO $ putStrLn $ "queried exchange rate: " ++ show d
    return x 

если я попробую тот же URL-адрес в curl с параметром -L, чтобы следовать перенаправлениям, он сработает:

      curl -i -L 'https://coinmarketcap.com/currencies/cardano'

Единственное различие, которое я вижу, заключается в том, что запрос кода Haskell HTTP/1.1, но запрос curl отправляется с HTTP/2

Я хотел бы изменить версию HTTP, которую отправляет библиотека Haskell, чтобы проверить, не в этом ли проблема. Однако я относительно новичок в Haskell, поэтому мне не удалось выяснить, есть ли способ с помощью модуля Haskell Network.HTTP.Req установить версию HTTP.

Есть ли способ сделать это?

TIA

1 ответ

Я считаю, что coinmarketcap.com блокирует запросы, у которых нет User-Agentуказан заголовок. Сделать это можно так:

      getExchangeRate = runReq defaultHttpConfig $ do
    v <- req
        GET
        (https "coinmarketcap.com" /: "currencies" /: "cardano")
        NoReqBody
        bsResponse
        (header "User-Agent" "my-app/0.1.0.0")
    let priceRegex      = "priceValue___11gHJ\">\\$([\\.0-9]*)" :: ByteString
        (_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString])
        d               = read $ unpack bs :: Double
        x               = round $ 1_000_000 * d
    liftIO $ putStrLn $ "queried exchange rate: " ++ show d
    return x 

С этим кодом запрос завершается правильно, но я сталкиваюсь с ошибкой сопоставления с шаблоном. Кажется, priceValue___11gHJ регулярное выражение больше не работает.

Другие вопросы по тегам