-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Interface for antigate.com captcha recognition API -- -- Haskell interface for antigate.com captcha recognition service and -- other services supporting its API (e.g. captchabot, decaptcher) @package antigate @version 2.0.1 -- | Example: -- --
--   {-# LANGUAGE OverloadedStrings #-}
--   import Text.Recognition.Antigate
--   import Data.Default
--   import Network
--   import Control.Monad
--   import Control.Monad.IO.Class
--   import Data.ByteString.Lazy hiding (putStrLn)
--   import System.Timeout
--   
--   myApiKey :: ApiKey
--   myApiKey = "0123456789abcdef0123456789abcdef"{api_host="antigate.com"}
--   
--   downloadJpegCaptcha :: Manager -> IO ByteString
--   downloadJpegCaptcha = undefined
--   
--   answerCaptcha :: String -> Manager -> IO Bool
--   answerCaptcha = undefined
--   
--   main :: IO ()
--   main = withSocketsDo $ do
--       res <- timeout (30*1000000) $ withManager $ \m -> do
--           bytes <- liftIO $ downloadJpegCaptcha m
--           (id, answer) <- solveCaptcha def myApiKey def{phrase=True} "captcha.jpg" bytes m
--           res <- liftIO $ answerCaptcha answer m
--           unless res $ reportBad myApiKey id m
--           return res
--       case res of
--           Nothing -> do
--               putStrLn "Timed out"
--           Just True -> do
--               putStrLn "Solved successfully"
--           Just False -> do
--               putStrLn "Couldn't solve"
--   
module Text.Recognition.Antigate -- | Antigate API access key paired with service provider's host. At least -- these services claim to support Antigate API: Antigate, Captchabot, -- Decaptcher, ExpertDecoders, ImageTyperz, DeathByCaptcha and Pixodrom. data ApiKey -- | This is a record selector api_key :: ApiKey -> String -- | default: "antigate.com". This is a record selector api_host :: ApiKey -> String type CaptchaID = Int -- | Properties of the captcha to be solved. See -- http://antigate.com/panel.php?action=api data CaptchaConf CaptchaConf :: Bool -> Bool -> Maybe Bool -> Bool -> Word -> Word -> Bool -> Maybe Double -> CaptchaConf -- | phrase :: CaptchaConf -> Bool -- | regsense :: CaptchaConf -> Bool -- | numeric :: CaptchaConf -> Maybe Bool -- | calc :: CaptchaConf -> Bool -- | min_len :: CaptchaConf -> Word -- | max_len :: CaptchaConf -> Word -- | is_russian :: CaptchaConf -> Bool -- | Default value is set on bids page. This parameter allows to -- control maximum bid without setting it on the bids page. max_bid :: CaptchaConf -> Maybe Double data ApiResult a OK :: a -> ApiResult a -- | captcha is not recognized yet, repeat request withing 1-5 seconds CAPCHA_NOT_READY :: ApiResult a -- | user authorization key is invalid (its length is not 32 bytes as it -- should be) ERROR_WRONG_USER_KEY :: ApiResult a -- | the captcha ID you are sending is non-numeric ERROR_WRONG_ID_FORMAT :: ApiResult a -- | you have set wrong user authorization key in request ERROR_KEY_DOES_NOT_EXIST :: ApiResult a -- | account has zero or negative balance ERROR_ZERO_BALANCE :: ApiResult a -- | no idle captcha workers are available at the moment, please try a bit -- later or try increasing your bid ERROR_NO_SLOT_AVAILABLE :: ApiResult a -- | the size of the captcha you are uploading or pointing to is zero ERROR_ZERO_CAPTCHA_FILESIZE :: ApiResult a -- | your captcha size is exceeding 100kb limit ERROR_TOO_BIG_CAPTCHA_FILESIZE :: ApiResult a -- | your captcha file has wrong extension, the only allowed extensions are -- gif,jpg,jpeg,png ERROR_WRONG_FILE_EXTENSION :: ApiResult a -- | Could not determine captcha file type, only allowed formats are JPG, -- GIF, PNG ERROR_IMAGE_TYPE_NOT_SUPPORTED :: ApiResult a -- | Request with current account key is not allowed from your IP. Please -- refer to IP list section ERROR_IP_NOT_ALLOWED :: ApiResult a ERROR_UNKNOWN :: String -> ApiResult a data SolveException SolveExceptionUpload :: (ApiResult ()) -> SolveException SolveExceptionCheck :: CaptchaID -> (ApiResult ()) -> SolveException data SolveConf SolveConf :: [Int] -> [Int] -> (Phase -> Int -> IO ()) -> (CaptchaID -> IO ()) -> SolveConf -- | how much to sleep while waiting for available slot; in microseconds. -- -- Default: [3000000] api_upload_sleep :: SolveConf -> [Int] -- | how much to sleep between captcha checks; in microseconds. -- -- Default: [6000000,2000000,3000000] -- sleep 6 seconds before -- checking, on first retry sleep 2 seconds, then always sleep 3 seconds. -- List can be infinite api_check_sleep :: SolveConf -> [Int] -- | api_counter will be called at the start of each phase -- --
--   api_counter = \phase count -> do
--       if count == 0
--         then putStrLn $ show phase ++ " began"
--         else putStrLn $ show phase ++ " retries: " ++ show count
--   
-- -- Default: _ _ -> return () api_counter :: SolveConf -> Phase -> Int -> IO () -- | This will be called when upload phase finishes api_upload_callback :: SolveConf -> CaptchaID -> IO () data Phase UploadPhase :: Phase CheckPhase :: Phase -- | High level function to solve captcha, blocks until answer is provided -- (about 2-10 seconds). -- -- throws SolveException or HttpException when something -- goes wrong. solveCaptcha :: (Failure HttpException m, MonadIO m, MonadThrow m) => SolveConf -> ApiKey -> CaptchaConf -> FilePath -> ByteString -> Manager -> m (CaptchaID, String) solveCaptchaFromFile :: (Failure HttpException m, MonadIO m, MonadThrow m) => SolveConf -> ApiKey -> CaptchaConf -> FilePath -> Manager -> m (CaptchaID, String) -- | upload captcha for recognition -- -- throws HttpException on network errors. uploadCaptcha :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> CaptchaConf -> FilePath -> ByteString -> Manager -> m (ApiResult CaptchaID) uploadCaptchaFromFile :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> CaptchaConf -> FilePath -> Manager -> m (ApiResult CaptchaID) -- | retrieve captcha status -- -- throws HttpException on network errors. checkCaptcha :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> CaptchaID -> Manager -> m (ApiResult String) -- | retrieve multiple captcha status -- -- throws HttpException on network errors. checkCaptchas :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> [CaptchaID] -> Manager -> m [ApiResult String] -- | report bad captcha result -- -- throws HttpException on network errors. reportBad :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> CaptchaID -> Manager -> m Bool -- | retrieve your current account balance -- -- throws HttpException on network errors. getBalance :: (Failure HttpException m, MonadIO m, MonadThrow m) => ApiKey -> Manager -> m Double -- | Keeps track of open connections for keep-alive. -- -- If possible, you should share a single Manager between multiple -- threads and requests. -- -- Since 0.1.0 data Manager :: * -- | Create a Manager. You may manually call closeManager to -- shut it down, or allow the Manager to be shut down -- automatically based on garbage collection. -- -- Creating a new Manager is a relatively expensive operation, you -- are advised to share a single Manager between requests instead. -- -- The first argument to this function is often -- defaultManagerSettings, though add-on libraries may provide a -- recommended replacement. -- -- Since 0.1.0 newManager :: ManagerSettings -> IO Manager -- | Close all connections in a Manager. -- -- Note that this doesn't affect currently in-flight connections, meaning -- you can safely use it without hurting any queries you may have -- concurrently running. -- -- Since 0.1.0 closeManager :: Manager -> IO () withManager :: (MonadIO m, MonadBaseControl IO m) => (Manager -> ResourceT m a) -> m a -- | Parse antigate's upload response parseUploadResponse :: String -> ApiResult CaptchaID -- | Parse antigate's check response parseCheckResponse :: String -> ApiResult String -- | Parse antigate's multi-check response parseMultiCheckResponse :: String -> ApiResult String -- | Parse antigate's multi-check response parseMultiCheckResponses :: String -> [ApiResult String] -- | Marshal ApiResult back to its text form renderApiResult :: ApiResult String -> String instance Typeable SolveException instance Eq ApiKey instance Ord ApiKey instance Show ApiKey instance Read ApiKey instance Show CaptchaConf instance Read CaptchaConf instance Show a => Show (ApiResult a) instance Read a => Read (ApiResult a) instance Eq a => Eq (ApiResult a) instance Functor ApiResult instance Show SolveException instance Show Phase instance Read Phase instance Eq Phase instance Ord Phase instance Enum Phase instance Bounded Phase instance NFData SolveConf instance Show SolveConf instance Default SolveConf instance NFData Phase instance NFData SolveException instance Exception SolveException instance NFData a => NFData (ApiResult a) instance NFData CaptchaConf instance Default CaptchaConf instance NFData ApiKey instance IsString ApiKey instance Default ApiKey