X

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

Недавно столкнулся с необходимостью использовать AC-Service, для некоторых нужд, решил поделиться кодом, да и себе сложить в копилку.

        define('CAPTCHA_KEY', 'c4100005b02bd89f288125675ddf8ae1'); // Ключ AC Service, находиться в профиле  
        define('TMP_FOLDER','./tmp/'); // Временная директория, для скачивания файлов каптчи, на неё нужно поставить права 0777

Коды ошибок

        $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

            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

            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;  
            } /* --------------------------- */

Функция получения файла каптчи и сохранения его во временную папку

            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;  
            } /* --------------------------- */

Ну, и напоследок сам вызов получения каптчи:

    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

Категории: PHP Бездна
Тэги: AC-Service

Комментарии (9)

  • Vitaliy привет! как с тобой с писаться можно ??? тебе видно мой емейл??? отпишись на него ? нужна помощь, сюда не буду писать что именно.

    • Привет! Email твой вижу, но писать не буду, у меня на это сейчас нет времени и вряд ли появится.
      Если у тебя есть срочные проблемы требующие решения, создай проект на weblancer.net там много специалистов готовых решить их в частном порядке.

  • А не подскажете этот код на php без curl, чтобы скриншот капчи отсылался на сервис и приходил уже в форме обычного текста? Спасибо

  • Всё разобрался вот он заветный код)))

    $index = c("combobox1")->itemIndex;
    if ($index==0){
    Run('http://betcityru.com/');
    }
    $index = c("combobox1")->itemIndex;
    if ($index==1){
    Run('http://www.marathonbet.com/ru/live.htm');
    }

    • Отлично, молодец, что сам разобрался. Самостоятельно находить решения - это свойство настоящего программера!

      Только, попробуй использовать такую конструкцию, она уменьшит кол-во твоего кода и упростит поддержку в будущем:

      $index = c("combobox1")->itemIndex;

      switch($index)
      {
      case 0: $url = 'http://betcityru.com/'; break
      case 1: $url = 'ttp://www.marathonbet.com/ru/live.htm'; break
      }

      Run( $url );

  • Привет Иван!

    Честно сказать, я раньше не работал с Devel Studio, я пишу на C#, Delphi и Java, поэтому использовать php для создания десктопных приложений, мне пока не довелось :)

    В C# и Delphi, открыть ссылку в броузере можно командой ShellExecute, в Java есть класс Desktop с методом brower

    Нужно, найти аналог для Devel Studio.

    Далее тебе нужно завести два массива, в первом хранить названия контор, во втором, ссылки по которым надо переходить. Либо вариант посложнее, сделать класс "контора" с полями: имя, ссылка и т.д. И хранить массив таких объектов.

    Далее в список вывести имена и добавить ему событие на выбор элемента: может называться onChange, onSelect или что-то в таком духе..

    Следующим шагом в обработчике этого события, тебе надо определить индекс выбранного элемента и запросить такой же элемент, но уже в массиве ссылок. Таким образом ты получишь ссылку. Останется только перейти по ней с использованием ShellExecute..

    Если не забуду, завтра посмотрю на Devel Studio и отпишу тут с примером кода. Если я правильно понял, сайт программы http://develstudio.ru/ ?

  • Виталий привет, напиши пожалуйста если знаешь какой код Devel studio выпадающий список, мне надо вот в писал я в него все конторы букмекерские, там бет-сити, марафон,пари матч, леон, Bwin.как сделать чтоб например я выбрал бвин у меня раз сайт открылся, выбрал марафон раз марафон открылся, короче чтоб браузер сразу открывал нужный сайт пользуюсь браузером Google crome.создаю не браузер просто выпадающий список с сайтами!

    Помоги весь инет перекопал нет не где этой темы Выпадающий список Devel studio