Использование 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: | Tags: /
| Rating:
9 comments.
Write a comment