recaptcha

Тема в разделе "PHP", создана пользователем _king, 30 янв 2009.

Модераторы: latteo
  1. _king

    _king Постоялец

    Регистр.:
    25 июн 2008
    Сообщения:
    120
    Симпатии:
    3
    подскажите плиз, каким образом можно сохранить картинку recaptcha для распознания или как выдрать ссылку из жабаскрипта на эту каритнку
     
  2. Kaimi

    Kaimi

    Регистр.:
    28 окт 2007
    Сообщения:
    257
    Симпатии:
    253
    Парсишь со страницы с капчей значение между challenge?k= и кавычкой,
    идешь по адресу http://api.recaptcha.net/challenge?k= где после k= идет спарсенное значение, далее парсишь значение challenge : и по адресу
    http://api.recaptcha.net/image?c= ,где после c= последнее спарсенное значние, получаешь картинку
     
    asAlbert, EFL, linkall26 и ещё 1-му нравится это.
  3. VadoZ

    VadoZ Постоялец

    Регистр.:
    23 окт 2007
    Сообщения:
    146
    Симпатии:
    55
    Нахрена дергать с жабоскрипта? Грузи айфрейм, в нем все что тебе нужно.
    Хотя ты мог-бы для приличия отключить в своем браузере яваскрипт и посмотреть что произойдет. Уверен - глупых вопросов тогда-б не задавал.
     
    _king нравится это.
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Сам то пробовал отключать js? Рекапча работает, но некоторые сайты не принимают такие данные. Тем более что это намного геморойнее.
    вот
    PHP:
    function preg($i){
     global 
    $result;
     
    preg_match ('|'.$i.'|is' $result$r);
     return 
    $r[1];
    }
     
    $result ch('https://www.livejournal.com/create.bml');
     
    $sid preg('name="lj_form_auth" value="(.*?)"');
     
    $url_js preg('src="(https://api-secure.recaptcha.net.*?)"'); // файл js где хранится ИД картиники
     
    $result ch($url_js.' https://www.livejournal.com/create.bml');
     

     
    $url_pic preg("challenge : '(.*?)'");
     
    $picture ch("http://api.recaptcha.net/image?c=".$url_pic);
     
     
    $fp_p=fopen("recapcha.png",'w');
     
    fwrite($fp_p,$picture);
     
    fclose($fp_p);

     echo 
    '<img src="recapcha.png">';
    Где ch() - это функция curl или сокет, которая коннектится к урлу, отправляет куки и возвращает содержимое
     
    ne0zx нравится это.
  5. _king

    _king Постоялец

    Регистр.:
    25 июн 2008
    Сообщения:
    120
    Симпатии:
    3
    сделал через ифрейм. там из геморра только отправить пост на апи.рекаптча.
    объем кода тотже. на lj работает
     
  6. lolshik

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Написал вот так
    PHP:
    <?php
    function preg($i){
     global 
    $result;
     
    preg_match ('|'.$i.'|is' $result$r);
     return 
    $r[1];
    }
    function 
    ch($site_url) {
    $ch_s curl_init();
    curl_setopt($ch_sCURLOPT_URL$site_url);
    curl_setopt($ch_sCURLOPT_SSL_VERIFYPEERfalse);
    curl_setopt($ch_sCURLOPT_RETURNTRANSFER1);
    $data curl_exec($ch_s);
    curl_close($ch_s);
    return 
    $data;
    }
     
    $result ch('https://www.livejournal.com/create.bml');
     
    $sid preg('name="lj_form_auth" value="(.*?)"');
     
    $url_js preg('src="(https://api-secure.recaptcha.net.*?)"'); // файл js где хранится ИД картиники
     
    $result ch($url_js.' https://www.livejournal.com/create.bml');
     echo 
    $url_js;
     
    $url_pic preg("challenge : '(.*?)'");
     echo 
    $url_pic;
     
    $picture ch("http://api.recaptcha.net/image?c=".$url_pic);
     
    $fp_p=fopen("recapcha.png",'w');
     
    fwrite($fp_p,$picture);
     
    fclose($fp_p);
     echo 
    '<img src="recapcha.png">';
    ?>
    Почему то не заработало. Вот этот код точно рабочий $url_pic = preg("challenge : '(.*?)'");
    У меня echo $url_pic пустоту возвращает.
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    да:ah:, у меня была немного модфицированная-компактная функция курла, строчку
    PHP:
     $result ch($url_js.' https://www.livejournal.com/create.bml'); 
    на
    PHP:
     $result ch($url_js); 
     
    lolshik нравится это.
  8. lolshik

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Вот что в конце концов получилось. Правда так и не завилось почему то. Может кто ткнёт на ошибку? ЖЖ мне показывает в ответ страницу где сказано что все поля не заполнены.

    PHP:
    <?php

    function ch($site_url,$can_get_headers) {
        
    $ch_s curl_init();
        if (
    $can_get_headers == 1) {

            
    curl_setopt($ch_sCURLOPT_COOKIESESSIONTRUE); //новая сессия. Старые куки игнорируются.
            
    curl_setopt ($ch_sCURLOPT_HEADER1); //включаем получение заголовков
            
    $cookie_path dirname(__FILE__).'\test.txt';
            
    curl_setopt($ch_sCURLOPT_COOKIEFILE$cookie_path);
            
    curl_setopt($ch_sCURLOPT_COOKIEJAR$cookie_path);

            }
        
    curl_setopt($ch_sCURLOPT_URL$site_url);
        
    curl_setopt($ch_sCURLOPT_SSL_VERIFYPEERfalse);
        
    curl_setopt($ch_sCURLOPT_SSL_VERIFYHOSTfalse);
        
    curl_setopt($ch_sCURLOPT_RETURNTRANSFER1); //возвращаем результат, вместо вывода результата на экран



        
    $data curl_exec($ch_s);
        
    curl_close($ch_s);
        return 
    $data;
    }


    function 
    send_post_data ($post_url,$post_data) {
        
    // $post_data - PAST которые нужно отправить
        // $get_url - куда отправить ,$coo- строка куков,$refer - якобы откуда пришли, некоторые проверяют
        
    $ch curl_init();
        
    //curl_setopt($ch, CURLOPT_PROXY, "http://192.168.2.600:2323");
        
    curl_setopt($chCURLOPT_URL$post_url);
        
    curl_setopt($chCURLOPT_HEADER,1);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1); //указываем, что результат запроса следует передать в переменную, а не вывести на экран
        
    curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
        
    curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1); // разрешаем перенаправление
        
    curl_setopt($chCURLOPT_REFERER'https://www.livejournal.com/create.bml');
        
    $cookie_path dirname(__FILE__).'\test.txt';
        
    curl_setopt($chCURLOPT_COOKIE,$cookie_path);
        
    curl_setopt($chCURLOPT_POSTtrue);
        
    curl_setopt($chCURLOPT_POSTFIELDS$post_data);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT30);
        
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
        
    curl_setopt($chCURLOPT_VERBOSE,1);
        
    $data curl_exec($ch);
        
    $type=curl_multi_getcontent($ch);
        
    curl_close($ch);
        return 
    $type;


        }



    function 
    preg($i){
     global 
    $result;
     
    preg_match ('|'.$i.'|is' $result$r); // проверка на соотвествие рег.выражению
     
    return $r[1];
    }



    if (isset(
    $_POST[submit])) {
        echo 
    "Отправляем пост запрос<br />";


        
    $_POST['lj_form_auth'] = urlencode($_POST['lj_form_auth']);
        
    $_POST['username'] = urlencode($_POST['username']);
        
    $_POST['email'] = urlencode($_POST['email']);
        
    $_POST['password']= urlencode($_POST['password']);
        
    $_POST['challenge'] = urlencode($_POST['challenge']);
        
    $_POST['capcha'] = urlencode($_POST['capcha']);
        
    $post_data $_POST['lj_form_auth'].'&Widget%5BCreateAccount%5D_user='.$_POST['username'].'&Widget%5BCreateAccount%5D_email='.$_POST['email'].'&Widget%5BCreateAccount%5D_password1='.$_POST['password'].'&Widget%5BCreateAccount%5D_password2='.$_POST['password'].'&Widget%5BCreateAccount%5D_bday_mm=3&Widget%5BCreateAccount%5D_bday_dd=12&Widget%5BCreateAccount%5D_bday_yyyy=1991&Widget%5BCreateAccount%5D_setLiveId=no&Widget%5BCreateAccount%5D_service_agree=on&recaptcha_challenge_field='.$_POST['challenge'].'&recaptcha_response_field='.$_POST['capcha'].'&Widget%5BCreateAccount%5D_submit=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C+%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82';

        echo 
    send_post_data ('https://www.livejournal.com/create.bml',$post_data);



        }

    else {


        
    $result ch('https://www.livejournal.com/create.bml',1);
        
    $sid preg('name="lj_form_auth" value="(.*?)"');
        
    $url_js preg('src="(https://api-secure.recaptcha.net.*?)"'); // файл js где хранится ИД картиники
        
    echo '$sid '.$sid.'<br />';
        echo 
    '$url_js '.$url_js.'<br />';

        
    $result ch($url_js,0);
        
    $url_pic preg("challenge : '(.*?)'");
        echo 
    '$url_pic '.$url_pic.'<br />';
        
    $picture ch("http://api.recaptcha.net/image?c=".$url_pic,0); //берём картинку
        
    $fp_p=fopen("recapcha.png",'r');
        
    fwrite($fp_p,$picture);
        
    fclose($fp_p);





    echo <<<HERE

    <form method="POST" action="
    $_SERVER[SCRIPT_NAME]?submit=1">
    <input type="hidden" name="lj_form_auth" value="
    $sid" />
    <input type="hidden" name="livejournal_cookie" value="
    $sid" />
    <input type="hidden" name="challenge" value="
    $url_pic" />
    Имя пользователя: <input type="text" maxlength="16" value="" size="15" name="username" /><br>
    Адрес email: <input type="text" maxlength="50" value="" size="28" name="email" /> <br>
    Пароль: <input type="text" maxlength="31" value="" size="28" name="password" />  <br>
    Дата рождения:
    <select name="bday_mm">
    <option value="1">Январь</option>
    <option value="2">Февраль</option>
    <option value="3">Март</option>
    <option value="4">Апрель</option>
    <option value="5">Май</option>
    <option value="6">Июнь</option>
    <option value="7">Июль</option>
    <option value="8">Август</option>
    <option value="9">Сентябрь</option>
    <option value="10">Октябрь</option>
    <option value="11">Ноябрь</option>
    <option value="12">Декабрь</option>
    </select>   <br>
    <input type="text" maxlength="2" value="" size="2" name="day"/>
    <input type="text" maxlength="4" value="" size="4" name="year"/>
    Проверка, что вы человек: <br>
    <img src="recapcha.png">     <br>
    <input type="text" name="capcha" value="" /><br>
    <input type="checkbox" checked="checked" value="1" />  <br>
    <input type="submit" name="submit" value="Создать аккаунт" />
    </form>

    HERE;

    }



    ?>
     
  9. Vaka

    Vaka Постоялец

    Регистр.:
    27 июн 2006
    Сообщения:
    86
    Симпатии:
    29
    не получается выпарсить картинку с капчой. Выдается капчу различная чем на станице.
    Можт кто подкинет скриптик сохранения картинки?
     
  10. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Пожалуйста. Вот кусок кода моего рабочего скрипта:

    PHP:
            $query http_build_query($query_arr);
            
    $html $this->curl->post("http://securesignup.net/register_2.php",$query);

            
    preg_match('|src="(http://api.recaptcha.net/noscript\?k=.*?)"|is'$html$out);
            
    $captcha_url $out[1];
            
    $html $this->curl->get($captcha_url);

            
    preg_match('|src="/image\?c=(.*?)"|is'$html$out);
            
    $captcha_url "http://api.recaptcha.net/image?c=".$out[1];
            
    $secure_id $out[1];

            
    $captcha $this->curl->get($captcha_url);
    Разбирайся. Хотя, думаю, тут все понятно. Единственное, что использую свой класс-обертку на curl'ом - функции get, post.