{-# LANGUAGE OverloadedStrings,TemplateHaskell #-}
module IP2ProxyWebService (WSResult(..), WSConfig, openWS, lookUp, getCredit) where
import Control.Exception
import System.Exit
import Data.Aeson as DA
import Data.Aeson.TH
import Network.HTTP.Client
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Network.HTTP.Types.Status (statusCode)
import Data.Maybe
import Network.URI.Encode as URIE
data WSConfig = WSConfig {
WSConfig -> String
apiKey :: String,
WSConfig -> String
apiPackage :: String,
WSConfig -> Bool
useSSL :: Bool
} deriving (Int -> WSConfig -> ShowS
[WSConfig] -> ShowS
WSConfig -> String
(Int -> WSConfig -> ShowS)
-> (WSConfig -> String) -> ([WSConfig] -> ShowS) -> Show WSConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WSConfig] -> ShowS
$cshowList :: [WSConfig] -> ShowS
show :: WSConfig -> String
$cshow :: WSConfig -> String
showsPrec :: Int -> WSConfig -> ShowS
$cshowsPrec :: Int -> WSConfig -> ShowS
Show)
data WSResult = WSResult {
WSResult -> String
response :: String,
WSResult -> Maybe String
countryCode :: Maybe String,
WSResult -> Maybe String
countryName :: Maybe String,
WSResult -> Maybe String
regionName :: Maybe String,
WSResult -> Maybe String
cityName :: Maybe String,
WSResult -> Maybe String
isp :: Maybe String,
WSResult -> Maybe String
domain :: Maybe String,
WSResult -> Maybe String
usageType :: Maybe String,
WSResult -> Maybe String
asn :: Maybe String,
WSResult -> Maybe String
as :: Maybe String,
WSResult -> Maybe String
lastSeen :: Maybe String,
WSResult -> Maybe String
proxyType :: Maybe String,
WSResult -> Maybe String
threat :: Maybe String,
WSResult -> Maybe String
isProxy :: Maybe String,
WSResult -> Maybe String
provider :: Maybe String
} deriving (Int -> WSResult -> ShowS
[WSResult] -> ShowS
WSResult -> String
(Int -> WSResult -> ShowS)
-> (WSResult -> String) -> ([WSResult] -> ShowS) -> Show WSResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WSResult] -> ShowS
$cshowList :: [WSResult] -> ShowS
show :: WSResult -> String
$cshow :: WSResult -> String
showsPrec :: Int -> WSResult -> ShowS
$cshowsPrec :: Int -> WSResult -> ShowS
Show, WSResult -> WSResult -> Bool
(WSResult -> WSResult -> Bool)
-> (WSResult -> WSResult -> Bool) -> Eq WSResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WSResult -> WSResult -> Bool
$c/= :: WSResult -> WSResult -> Bool
== :: WSResult -> WSResult -> Bool
$c== :: WSResult -> WSResult -> Bool
Eq)
$(deriveJSON defaultOptions ''WSResult)
checkparams :: String -> String -> IO String
checkparams :: String -> String -> IO String
checkparams String
apikey String
apipackage = do
String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
"OK"
openWS :: String -> String -> Bool -> IO WSConfig
openWS :: String -> String -> Bool -> IO WSConfig
openWS String
apikey String
apipackage Bool
usessl = do
String
paramok <- String -> String -> IO String
checkparams String
apikey String
apipackage
WSConfig -> IO WSConfig
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> String -> Bool -> WSConfig
WSConfig String
apikey String
apipackage Bool
usessl)
lookUp :: WSConfig -> String -> IO WSResult
lookUp :: WSConfig -> String -> IO WSResult
lookUp WSConfig
myconfig String
ip = do
let key :: String
key = WSConfig -> String
apiKey WSConfig
myconfig
let package :: String
package = WSConfig -> String
apiPackage WSConfig
myconfig
let usessl :: Bool
usessl = WSConfig -> Bool
useSSL WSConfig
myconfig
String
paramok <- String -> String -> IO String
checkparams String
key String
package
let protocol :: String
protocol = if Bool
usessl Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True
then String
"https"
else String
"http"
Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
Request
httprequest <- String -> IO Request
forall (m :: * -> *). MonadThrow m => String -> m Request
parseRequest (String -> IO Request) -> String -> IO Request
forall a b. (a -> b) -> a -> b
$ String
protocol String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"://api.ip2proxy.com/?key=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
key String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"&package=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
package String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"&ip=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ (ShowS
URIE.encode String
ip)
Response ByteString
httpresponse <- Request -> Manager -> IO (Response ByteString)
httpLbs Request
httprequest Manager
manager
let json :: ByteString
json = Response ByteString -> ByteString
forall body. Response body -> body
responseBody Response ByteString
httpresponse
let Just WSResult
result = ByteString -> Maybe WSResult
forall a. FromJSON a => ByteString -> Maybe a
DA.decode ByteString
json :: Maybe WSResult
WSResult -> IO WSResult
forall (m :: * -> *) a. Monad m => a -> m a
return WSResult
result
getCredit :: WSConfig -> IO WSResult
getCredit :: WSConfig -> IO WSResult
getCredit WSConfig
myconfig = do
let key :: String
key = WSConfig -> String
apiKey WSConfig
myconfig
let package :: String
package = WSConfig -> String
apiPackage WSConfig
myconfig
let usessl :: Bool
usessl = WSConfig -> Bool
useSSL WSConfig
myconfig
String
paramok <- String -> String -> IO String
checkparams String
key String
package
let protocol :: String
protocol = if Bool
usessl Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True
then String
"https"
else String
"http"
Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
Request
httprequest <- String -> IO Request
forall (m :: * -> *). MonadThrow m => String -> m Request
parseRequest (String -> IO Request) -> String -> IO Request
forall a b. (a -> b) -> a -> b
$ String
protocol String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"://api.ip2proxy.com/?key=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
key String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"&check=true"
Response ByteString
httpresponse <- Request -> Manager -> IO (Response ByteString)
httpLbs Request
httprequest Manager
manager
let json :: ByteString
json = Response ByteString -> ByteString
forall body. Response body -> body
responseBody Response ByteString
httpresponse
let Just WSResult
result = ByteString -> Maybe WSResult
forall a. FromJSON a => ByteString -> Maybe a
DA.decode ByteString
json :: Maybe WSResult
WSResult -> IO WSResult
forall (m :: * -> *) a. Monad m => a -> m a
return WSResult
result