module HTTP.FakeUserAgent (getBrowserString) 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)
getBrowserString :: String -> IO String
getBrowserString name = do
resp <- get ("http://useragentstring.com/pages/" ++ name ++ "/")
let Just body = resp ^? responseBody
let tags = parseTags body
let versions = getVersions (getVersionsList tags) []
let v:_ = versions
return $ (map (chr . fromEnum) . unpack) v