{-# LANGUAGE OverloadedStrings #-} module HTTP.ThirdParty.FakeUserAgent (getBrowserStrings, getLatestBrowserString) where import Control.Lens ((^?)) import Data.ByteString.Lazy (ByteString, unpack) import Data.Char (chr) import Network.Wreq (get, responseBody) import Text.HTML.TagSoup (parseTags, innerText, Tag(TagOpen, TagClose), (~/=)) getVersionsList :: [Tag ByteString] -> [Tag ByteString] getVersionsList tags = let tags1 = (drop 1 . dropWhile (~/= TagOpen ("div" :: String) [("id", "liste")])) tags in takeWhile (~/= TagClose ("div" :: String)) tags1 getVersions :: [Tag ByteString] -> [ByteString] -> [ByteString] getVersions [] accum = reverse accum getVersions tags accum = let tags1 = (drop 1 . dropWhile (~/= TagOpen ("li" :: String) [])) tags match = takeWhile (~/= TagClose ("li" :: String)) tags1 tags2 = (drop 1 . dropWhile (~/= TagClose ("li" :: String))) tags1 in case match of [] -> getVersions tags2 accum _ -> getVersions tags2 ((innerText match):accum) getBrowserStrings :: String -> IO [String] getBrowserStrings name = do resp <- get ("http://useragentstring.com/pages/" ++ name ++ "/") let Just body = resp ^? responseBody let tags = parseTags body let versions = getVersions (getVersionsList tags) [] return $ map ((map (chr . fromEnum) . unpack)) versions getLatestBrowserString :: String -> IO String getLatestBrowserString name = do latest:strings <- getBrowserStrings name return latest