Использование AC-Service (Anti Captcha)

Недавно столкнулся с необходимостью использовать AC-Service, для некоторых нужд, решил поделиться кодом, да и себе сложить в копилку.
| 1 2 3 4 |         define('CAPTCHA_KEY', 'c4100005b02bd89f288125675ddf8ae1'); // Ключ AC Service, находиться в профиле           define('TMP_FOLDER','./tmp/'); // Временная директория, для скачивания файлов каптчи, на неё нужно поставить права 0777 | 
Коды ошибок
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |         $GLOBALS['gl_captcha_errors'] = Array( 'ERROR_KEY_DOES_NOT_EXIST'          => 'AC Service: Вы использовали неверный captcha ключ в запросе',                                                  'ERROR_NO_SLOT_AVAILABLE'           => 'AC Service: Все работники в данный момент заняты, попробуйте позже',                                                  'ERROR_ZERO_CAPTCHA_FILESIZE'       => 'AC Service: Размер капчи которую вы закачиваете (либо указываете через url) равен нулю',                                                  'ERROR_TOO_BIG_CAPTCHA_FILESIZE'    => 'AC Service: Ваша капча превышает лимит в 30 кб',                                                  'ERROR_WRONG_FILE_EXTENSION'        => 'AC Service: Разрешение вашей капчи неверное, разрешены только форматы gif,jpg,png',                                                  'ERROR_KEY_DOES_NOT_EXIST'          => 'AC Service: Вы использовали неверный captcha ключ в запросе',                                                  'ERROR_WRONG_ID_FORMAT'             => 'AC Service: ID капчи, который вы передаете не является числом',                                                  'ERROR_NO_SUCH_CAPCHA_ID'           => 'AC Service: Капчи с таким ID не существует в базе',                                                  'ERROR_URL_METHOD_FORBIDDEN'        => 'AC Service: URL метод убран из-за периодических перегрузок системы',                                                  'CAPCHA_NOT_READY'                  => 'AC Service: Капча еще не разгадана',                                                  'OK_REPORT_RECORDED'                => 'AC Service: Только для функции reportbad : ваша жалоба на капчу записана',                                                  'ERROR_ZERO_BALANCE'                => 'AC Service: Недостаточно денег на счету'           ); | 
Функция от AC-Service
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |             private function GetCaptchaAPI($filename, $apikey, $is_verbose = true, $rtimeout = 5, $mtimeout = 120, $is_phrase = 0, $is_regsense = 0, $is_numeric = 1, $min_len = 0, $max_len = 0) { // функция получения каптчи с сервиса antigate.com               /*                  $filename - полный путь к файлу                  $apikey   - ключ для работы                  $rtimeout - задержка между опросами статуса капчи                  $mtimeout - время ожидания ввода капчи                  включить/выключить verbose mode (комментирование происходящего):                      $is_verbose - false(выключить),  true(включить)                  дополнительно (дефолтные параметры править не нужно без необходимости):                      $is_phrase - 0 либо 1 - флаг "в капче 2 и более слов"                      $is_regsense - 0 либо 1 - флаг "регистр букв в капче имеет значение"                      $is_numeric -  0 либо 1 - флаг "капча состоит только из цифр"                      $min_len    -  0 (без ограничений), любая другая цифра указывает минимальную длину текста капчи                      $max_len    -  0 (без ограничений), любая другая цифра указывает максимальную длину текста капчи                  пример:                      $text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",true);                      $text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",false);  //отключено комментирование                      $text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",false,1,0,0,5);  //отключено комментирование, капча состоит из двух слов, общая минимальная длина равна 5 символам              */                   if (!file_exists($filename))                   {                       if ($is_verbose) echo "file $filename not found\n";                       return false;                   }                   $postdata = array(                       'method'    => 'post',                       'key'       => $apikey,                       'file'      => '@'.$filename, //полный путь к файлу                       'phrase'    => $is_phrase,                       'regsense'    => $is_regsense,                       'numeric'    => $is_numeric,                       'min_len'    => $min_len,                       'max_len'    => $max_len,                   );                   if (!$ch=curl_init()) trigger_error("Couldn't initialize a cURL handle", E_USER_ERROR );                   curl_setopt($ch, CURLOPT_URL,               'http://www.anti-captcha.com/in.php');                   curl_setopt($ch, CURLOPT_RETURNTRANSFER,    1);                   curl_setopt($ch, CURLOPT_TIMEOUT,           60);                   curl_setopt($ch, CURLOPT_POST,              1);                   curl_setopt($ch, CURLOPT_POSTFIELDS,        $postdata);                   $result = curl_exec($ch);                   if (curl_errno($ch)) {                       if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n";                       return false;                   }                   curl_close($ch);                   if (strpos($result, "ERROR")!==false) {                       if ($is_verbose) echo "server returned error: $result\n";                       return false;                   } else {                       $ex = explode("|", $result);                       $captcha_id = $ex[1];                       if ($is_verbose) echo "captcha sent, got captcha ID $captcha_id\n";                       $waittime = 0;                       if ($is_verbose) echo "waiting for $rtimeout seconds\n";                       sleep($rtimeout);                       while(true) {                           $result = file_get_contents('http://anti-captcha.com/res.php?key='.$apikey.'&action=get&id='.$captcha_id);                           if (strpos($result, 'ERROR')!==false) {                               if ($is_verbose) echo "server returned error: $result\n";                               return false;                           }                           if ($result=="CAPCHA_NOT_READY") {                               if ($is_verbose) echo "captcha is not ready yet\n";                               $waittime += $rtimeout;                               if ($waittime>$mtimeout) {                                   if ($is_verbose) echo "timelimit ($mtimeout) hit\n";                                   break;                               }                               if ($is_verbose) echo "waiting for $rtimeout seconds\n";                               sleep($rtimeout);                           } else {                               $ex = explode('|', $result);                               if (trim($ex[0])=='OK') return trim($ex[1]);                           }                       }                       return false;                 }               } /* --------------------------- */ | 
Функция получения каптчи по url
| 1 2 3 4 5 6 7 8 9 10 11 12 |             public function GetCaptcha($image_url, $configs=Array(), $dext='.jpg', $sleep=0) {                   $ext = substr($image_url, strrpos($image_url,'.'));                   if ($ext!=$dext) $ext=$dext;                   $filename = TMP_FOLDER.md5($image_url).$ext;                   if ($this->GetFile($image_url, $filename, $configs, $sleep=0)) {                       $ret = $this->GetCaptchaAPI($filename, CAPTCHA_KEY);                       unlink($filename);                   }                   return $ret;               } /* --------------------------- */ | 
Функция получения файла каптчи и сохранения его во временную папку
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |             private function GetFile($url, $filename, $configs=Array(), $sleep=0) {                   if (!$ch=curl_init($url)) trigger_error("Couldn't initialize a cURL handle", E_USER_ERROR );                   $ret = true;                   if (!$fp = fopen($filename, "w")) {                           trigger_error('Can not create file: '.$filename.' ( '.$url.' )', E_USER_ERROR );                       } else {                       curl_setopt($ch, CURLOPT_FILE, $fp);                       curl_setopt($ch, CURLOPT_HEADER, 0);                       if (is_array($configs))                           curl_setopt_array($ch, $configs);                       curl_exec($ch);                       if (curl_error($ch)) $ret = false;                       curl_close($ch);                       fclose($fp);                   }                   return $ret;               } /* --------------------------- */ | 
Ну, и напоследок сам вызов получения каптчи:
| 1 2 3 4 5 6 |     ob_start();       $rep = $this->GetCaptcha($captcha['image'], $configs); // пробуем её получить       $ACmsg = ob_get_clean();       foreach ($GLOBALS['gl_captcha_errors'] as $err=>$msg) if (strpos($ACmsg, $err )!==false) {die($msg); break;} | 
Если все пройдет гладко, то в $rep будет числовой код каптчи, если нет, то скрипт остановится с описнаием ошибки от AC-Service
Author: | Rating: / | Tags:
 
                    
                 
                    
                 
                    
                
9 comments.
Write a comment