antigate-0.1.0: Interface for captcha recognition service.

Safe HaskellNone





 import Text.Recognition.Antigate
 import Data.Default
 import Network
 import Control.Monad
 import Control.Monad.IO.Class
 import Data.ByteString hiding (putStrLn)
 import System.Timeout
 myAntigateKey :: String
 myAntigateKey = "0123456789abcdef0123456789abcdef"
 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 (3*1000000) (3*1000000) myAntigateKey def{phrase=True} "captcha.jpg" bytes m
         res <- liftIO $ answerCaptcha answer m
         unless res $ reportBad myAntigateKey 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"



data CaptchaConf Source




phrase :: Bool
  • False = default value (one word)
  • True = captcha has 2-4 words
regsense :: Bool
  • False = default value (case is not important)
  • True = captcha is case sensitive
numeric :: Maybe Bool
  • Nothing = default value
  • Just True = captcha consists from numbers only
  • Just False = captcha does not have numbers on it
calc :: Bool
  • False = default value
  • True = numbers on captcha must be summed
min_len :: Word
  • 0 = default value
  • >0 = minimum length of captcha text workers required to input
max_len :: Word
  • 0 = default value (unlimited)
  • >0 = maximum length of captcha text workers required to input
is_russian :: Bool
  • False = default value
  • True = captcha goes to Russian-speaking worker
max_bid :: Maybe Double

Default value is set on bids page. This parameter allows to control maximum bid without setting it on the bids page.

data UploadResult Source



result is positive, your captcha is accepted for recognition and its ID follows. You may now attempt to retrieve captcha status with this ID.


user authorization key is invalid (its length is not 32 bytes as it should be)


you have set wrong user authorization key in request


account has zero or negative balance


no idle captcha workers are available at the moment, please try a bit later or try increasing your bid


the size of the captcha you are uploading or pointing to is zero


your captcha size is exceeding 100kb limit


your captcha file has wrong extension, the only allowed extensions are gif,jpg,jpeg,png


Could not determine captcha file type, only allowed formats are JPG, GIF, PNG


Request with current account key is not allowed from your IP. Please refer to IP list section


data CheckResult Source



the captcha is recognized, the guessed text follows


captcha is not recognized yet, repeat request withing 1-5 seconds


you have set wrong user authorization key in request


the captcha ID you are sending is non-numeric


High level



:: (MonadBaseControl IO m, MonadResource m) 
=> Int

how much to sleep while waiting for available slot. Microseconds.

-> Int

how much to sleep between captcha checks. Microseconds.

-> AntigateKey 
-> CaptchaConf 
-> FilePath

image filename (antigate guesses filetype by file extension)

-> ByteString

image contents

-> Manager

HTTP connection manager to use

-> m (CaptchaID, String) 

High level function to solve captcha, blocks until answer is provided (about 2-10 seconds).

throws SolveException or HttpException when something goes wrong.

solveCaptchaFromFile :: (MonadBaseControl IO m, MonadResource m) => Int -> Int -> AntigateKey -> CaptchaConf -> FilePath -> Manager -> m (CaptchaID, String)Source

Same as solveCaptcha, but read contents from a file.

Core functions

uploadCaptcha :: (MonadBaseControl IO m, MonadResource m) => AntigateKey -> CaptchaConf -> FilePath -> ByteString -> Manager -> m UploadResultSource

upload captcha for recognition

throws HttpException on network errors.

checkCaptcha :: (MonadBaseControl IO m, MonadResource m) => AntigateKey -> CaptchaID -> Manager -> m CheckResultSource

retrieve captcha status

throws HttpException on network errors.

checkCaptchas :: (MonadBaseControl IO m, MonadResource m) => AntigateKey -> [CaptchaID] -> Manager -> m [CheckResult]Source

retrieve multiple captcha status

throws HttpException on network errors.

reportBad :: (MonadBaseControl IO m, MonadResource m) => AntigateKey -> CaptchaID -> Manager -> m ()Source

report bad captcha result

throws HttpException on network errors.

getBalance :: (MonadBaseControl IO m, MonadResource m) => AntigateKey -> Manager -> m DoubleSource

retrieve your current account balance

throws HttpException on network errors.

Connection manager

data Manager

Keeps track of open connections for keep-alive. May be used concurrently by multiple threads.

newManager :: ManagerSettings -> IO Manager

Create a Manager. You must manually call closeManager to shut it down.

closeManager :: Manager -> IO ()

Close all connections in a Manager. Afterwards, the Manager can be reused if desired.

withManager :: (MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m) => (Manager -> ResourceT m a) -> m a

Create a new manager, use it in the provided function, and then release it.

This function uses the default manager settings. For more control, use newManager.


parseUploadResult :: String -> UploadResultSource

Parse antigate's upload response

parseCheckResult :: String -> CheckResultSource

Parse antigate's check response

parseCheckResults :: String -> [CheckResult]Source

Parse antigate's multi-check response

parseCheckResultNoOK :: String -> CheckResultSource

Parse antigate's multi-check response

renderUploadResult :: UploadResult -> StringSource

Marshal UploadResult back to its text form

renderCheckResult :: CheckResult -> StringSource

Marshal CheckResult back to its text form