Работа с Капчей и Антикапчей на примере mts.com.ua [в виде урока]

Discussion in 'PHP' started by b3, 15 Jul 2009.

  1. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Статья расчитана на новичков, желающих понять как работать с капчей и сервисом Антикапча. И так делать было нечего, решил посмотреть на сервис Антикапчи, заодно подкину Инвайт: fb9ac24a58. Цель выбрал сайт Украинского Мобильного Оператора MTC, скрипт отправки СМС - http://www.mts.com.ua/ukr/sendsms.php
    Вообщем дальше исходники и коментарии к ним:

    Файл mts.php
    PHP:
    <?php
    $ua 
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
    $ch curl_init('http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_HEADER1);
        
    curl_setopt($chCURLOPT_NOBODY0);
        
    curl_setopt($chCURLOPT_REFERER'http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    $res curl_exec($ch);
    curl_close($ch);
    ### Func ###
    function get_session($var)
    {
    preg_match('#PHPSESSID=(.*);#',$var,$matches);
    $session $matches[1];
    return 
    $session;    
    }
    ############
    $session get_session($res);

    if(
    preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches))
        {
        
    $rnd $matches[2];
        
    $ch curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session);
        
    curl_setopt($chCURLOPT_REFERER'http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    $res curl_exec($ch);
        
    curl_close($ch);
        
    file_put_contents('cap.jpg',$res);
    }

    #######################################
    function recognize($filename$apikey$is_verbose true$rtimeout 3$mtimeout 200$is_phrase 0$is_regsense 0$is_numeric 0$min_len 0$max_len 0)
    {
        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,
            
        );
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL,             'http://ac-service.info/in.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,     1);
        
    curl_setopt($chCURLOPT_TIMEOUT,             60);
        
    curl_setopt($chCURLOPT_POST,                 1);
        
    curl_setopt($chCURLOPT_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 "ID $captcha_id \n";
            
    $waittime 0;
            if (
    $is_verbose) echo "<br>sleep $rtimeout \n";
            
    sleep($rtimeout);
            while(
    true)
            {
                
    $result file_get_contents('http://ac-service.info/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 "<br>captcha is not ready yet\n";
                    
    $waittime += $rtimeout;
                    if (
    $waittime>$mtimeout
                    {
                        if (
    $is_verbose) echo "<br>timelimit ($mtimeout) hit\n";
                        break;
                    }
                    if (
    $is_verbose) echo "<br>waiting for $rtimeout seconds\n";
                    
    sleep($rtimeout);
                }
                else
                {
                    
    $ex explode('|'$result);
                    if (
    trim($ex[0])=='OK') return trim($ex[1]);
                    echo 
    '<br>'.$ex[1];
                }
            }
            
            return 
    false;
        }
    }
    #######################################
    $captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c7453ae....ca85ec7661',true);
    $nocache rand(1,9999999);
    echo 
    '<br>
    <img src="cap.jpg?'
    .$nocache.'"><br>
    <form method="post" enctype="application/x-www-form-urlencoded" action="go.php">
    <input type="text" name="txt" value="'
    .$captcha.'">
    <input type="hidden" name="session" value="'
    .$session.'">
    <input type="hidden" name="captcha" value="'
    .$captcha.'">
    <input type="submit">
    </form>'
    ;    
    exit;    
    ?>
    Файл go.php
    PHP:
    <?php
    $operator 
    '38050';
    $mobile '1234567';
    $ua 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
    $captcha $_POST['captcha'];
    $session $_POST['session'];
    $txt $_POST['txt'];
    ###
    $ch curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_REFERER"http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
        
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session.';');
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_POSTFIELDS"script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
        
    curl_setopt($chCURLOPT_RETURNTRANSFER0);
            
    $res curl_exec($ch);
    curl_close($ch);
    ?>
    Коменты к файлу mts.php:
    PHP:
    $ua 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
    $ch curl_init('http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_HEADER1);
        
    curl_setopt($chCURLOPT_NOBODY0);
        
    curl_setopt($chCURLOPT_REFERER'http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    $res curl_exec($ch);
    curl_close($ch);
    Данную часть кода думаю не стоит коментировать, обыкновенный cURL посредством которого мы заходим на страничку http://www.mts.com.ua/ukr/sendsms.php

    PHP:
    ### Func ###
    function get_session($var)
    {
    preg_match('#PHPSESSID=(.*);#',$var,$matches);
    $session $matches[1];
    return 
    $session;    
    }
    ############
    $session get_session($res);
    Функция получения PHPSESSID при помощи регулярного выражения: '#PHPSESSID=(.*);#' Данная сессия будет использована в процессе всего скрипта, важная чать(!).

    Далее как вы видите в свойстве капчи :
    мы имеем еще помимо PHPSESSID переменную rnd=1998968323, видимо какойто рандомчик, неважно, сейчас мы его отпарсим на всякий случай:
    PHP:
    if(preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches))
        {
        
    $rnd $matches[2];
        
    $ch curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session);
        
    curl_setopt($chCURLOPT_REFERER'http://www.mts.com.ua/ukr/sendsms.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    $res curl_exec($ch);
        
    curl_close($ch);
        
    file_put_contents('cap.jpg',$res);
    }
    Как видите парсим при помощи регулярного выражения:
    И важно парсить страничку уже с нашей сессией которую мы получили при помощи функции get_session($var) :
    PHP:
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session);
    Теперь составляем URL к капче уже с внесенной сессией в ссылку и отпарсеной переменной rnd:
    PHP:
    $ch curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
    Результат (т.е. капчу) сохраняем в отдельный файл:
    PHP:
    $res curl_exec($ch);
        
    curl_close($ch);
        
    file_put_contents('cap.jpg',$res);
    Теперь может открыть папку и увидеть саму капчу в файле cap.jpg
    [​IMG]
    Дальше идет функция от самого сервиса Антикапчи по получению текста с картинки, тут без коментариев:
    PHP:
    function recognize($filename$apikey$is_verbose true$rtimeout 3$mtimeout 200$is_phrase 0$is_regsense 0$is_numeric 0$min_len 0$max_len 0)
    {
        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,
            
        );
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL,             'http://ac-service.info/in.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,     1);
        
    curl_setopt($chCURLOPT_TIMEOUT,             60);
        
    curl_setopt($chCURLOPT_POST,                 1);
        
    curl_setopt($chCURLOPT_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 "ID $captcha_id \n";
            
    $waittime 0;
            if (
    $is_verbose) echo "<br>sleep $rtimeout \n";
            
    sleep($rtimeout);
            while(
    true)
            {
                
    $result file_get_contents('http://ac-service.info/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 "<br>captcha is not ready yet\n";
                    
    $waittime += $rtimeout;
                    if (
    $waittime>$mtimeout
                    {
                        if (
    $is_verbose) echo "<br>timelimit ($mtimeout) hit\n";
                        break;
                    }
                    if (
    $is_verbose) echo "<br>waiting for $rtimeout seconds\n";
                    
    sleep($rtimeout);
                }
                else
                {
                    
    $ex explode('|'$result);
                    if (
    trim($ex[0])=='OK') return trim($ex[1]);
                    echo 
    '<br>'.$ex[1];
                }
            }
            
            return 
    false;
        }
    }
    Функция на офф сайте: http://ac-service.info/curl.txt
    Теперь вызываем саму функцию:
    PHP:
    $captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c74........661',true);
    У нас она принимает параметры - Полный путь к картинке, ключь пользователя Антикапчи, Коментарии(включить/выключить)
    Полное описание параметров принимаемых функцией читайте тут - http://ac-service.info/curl.txt или же ниже =)
    Дальше выводим саму капчу:
    PHP:
    $nocache rand(1,9999999);
    echo 
    '<br>
    <img src="cap.jpg?'
    .$nocache.'"><br>
    Переменная $nocache генерирует случайное число в дипозоне, для того чтоб мы добавили его в путь картинки, ето предотвратит кэширование изображения выводимого в браузер. Теперь при просмотре капчи в браузере ссылка будет примерно такого вида:
    Финальная часть етого файла - это вывод формы отправки СМС:
    PHP:
    <form method="post" enctype="application/x-www-form-urlencoded" action="go.php">
    <
    input type="text" name="txt" value="'.$captcha.'">
    <
    input type="hidden" name="session" value="'.$session.'">
    <
    input type="hidden" name="captcha" value="'.$captcha.'">
    <
    input type="submit">
    </
    form>';    
    exit;    
    ?>
    В поле ввода сообщения будет введет код капчи, тоесть скрипт будет слать на указаный номер код капчи которую он сам распознает при помощи сервиса Антикапча.
    Коменты к файлу go.php:
    PHP:
    $operator '38050';
    $mobile '1234567';
    $ua 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
    $captcha $_POST['captcha'];
    $session $_POST['session'];
    $txt $_POST['txt'];
    Коментарии излишни, единственное ето две перменные:
    Забыл добавить что данный файл ето обработчик формы предыдущего файла.
    Следующая часть кода ето отправка Пост пакета с заполненой формой - оператор, мобильный номер, текст, капча:
    PHP:
    $ch curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
        
    curl_setopt($chCURLOPT_USERAGENT$ua);
        
    curl_setopt($chCURLOPT_REFERER"http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
        
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session.';');
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_POSTFIELDS"script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
        
    curl_setopt($chCURLOPT_RETURNTRANSFER0);
            
    $res curl_exec($ch);
    curl_close($ch);
    Скрипт принимающий заполненую форму:
    PHP:
    $ch curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
    Как видите специфический Реферер, с параметрами:
    PHP:
    curl_setopt($chCURLOPT_REFERER"http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
    Сессия, полученая с предыдущего файла в HIDDEN поле:
    PHP:
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session.';');
    А вот и скрытые поля из формы:
    PHP:
    <input type="hidden" name="session" value="'.$session.'">
    <
    input type="hidden" name="captcha" value="'.$captcha.'">
    В них как видите передается распознаный текст капчи и сессия.
    Далее сам POST пакет:
    PHP:
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_POSTFIELDS"script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
    Вот и все. Надеюсь кому-то поможет в начинаниях при работе с капчей.
     
    #1 b3, 15 Jul 2009
    Last edited: 15 Jul 2009
    8 people like this.
  2. antibiotic

    antibiotic [ таблетка ]

    Joined:
    13 Jul 2009
    Messages:
    620
    Likes Received:
    520
    Reputations:
    245
    клево расписано , надо будет попробовать)
    там разве ограничений по айпи нету?
     
    _________________________
  3. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Помоему нет, я себе штук 15 СМСок точно отправил.
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Вообще то есть класс для работы с антикапчей.
    http://pastebin.com/m77e9cf7
     
  5. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    регулярку
    Code:
    '#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#'
    можна немного оптимизировать
    Code:
    '#PHPSESSID=([a-f0-9]+)&rnd=(\d+)#'
    з.ы.:
    АК на перле от Каими: http://kaimi.ru/2009/05/anticaptcha-perl/
     
  6. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Можно было много чего оптимизировать, но т.к. с расчетом на новичка нестал заморачиваться, а так можно было все сделать на функциях, классе.
     
  7. Gaus

    Gaus Member

    Joined:
    8 Feb 2009
    Messages:
    136
    Likes Received:
    36
    Reputations:
    3
    Писал спаммер\флудер давно, тоже через mts.com.ua ток на перле;)
    З.Ы. Там ограничений вроде нет, пару сотен смс отправил с одного ИП, вроде норм все
     
    #7 Gaus, 17 Jul 2009
    Last edited: 17 Jul 2009
  8. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Спасибо, мне будет очень полезно прочитать.
     
  9. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Ты забыл дописать параметр session в POST запросе. Или нет?
     
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Нет =) Он передается в куках, смотри полностью листинг файла go.php
    PHP:
    curl_setopt($chCURLOPT_COOKIE'PHPSESSID='.$session.';'); 
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    В общем моя ошибка в том, что я попутал твою форму с формою МТС. Только что искал в исходном коде МТС формы hidden поле session, но потом понял, что речь идет о твоем файле mts.php. Сразу же разобрался с вопросом о PHPSESSID. Спасибо в общем, статья норм, а в своей ошибке я разобрался.
     
  12. spamerr

    spamerr New Member

    Joined:
    18 Jul 2008
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Возможно кому то нужен инвайт:
    1)4e2858ea36
     
  13. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    Ну на самом сайте ас есть примеры работы :)
    python - http://anti-captcha.com/om_anti_cap.py
    php с curl - http://anti-captcha.com/curl.txt
    php без curl - http://anti-captcha.com/phpnocurl.txt
    шарпень - http://anti-captcha.com/cnet.txt
    плюсы - http://anti-captcha.com/cplus.cpp

    ps. где то был скрипт на питоне для автоматического получения уинов с http://www.free-uin.org/ с применнием ас.
     
    #13 e4key, 25 Jul 2009
    Last edited: 25 Jul 2009
  14. zed221

    zed221 New Member

    Joined:
    2 Aug 2011
    Messages:
    41
    Likes Received:
    1
    Reputations:
    -11
    Работа с Капчей и Антикапчей на примере mts.com.ua

    Чевото у меня не получилось при проверки смс не приходили наверно мтс уже поменял и скрипт не работает
     
  15. zed221

    zed221 New Member

    Joined:
    2 Aug 2011
    Messages:
    41
    Likes Received:
    1
    Reputations:
    -11
    Люди отпишитесь у кого работает я на двух хостингах пробывал капчу выдаёт а при на жатие на отправить па подаешь на пустой файл go.php разумется с писаным мобильным номерам как указана в скрипте пробовал по всякому на 2хостингах но смс не приходят отпишитесь работает скрипт в наше время или нет??? можно ко мне на почту [email protected]