Ne v kontakte Antisocial programmer's blog

Пишем простой авторегистратор. Часть 4 - подключаем антикапчу.

    articles     howto     regsubmitter     code

Содержание

  1. Инструментарий
  2. Основы
  3. Боремся с капчей
  4. Подключаем антикапчу
  5. Подтверждение по email
  6. Пишем модуль для RegSubmitter

В прошлой статье я писал о том, как бороться с капчей в формах регистрации. Однако тогда мы были вынуждены вводить ее руками. Сегодня я расскажу, как можно переложить эту работу на специально обученных обезьянок сервис антикапча.

Что из себя представляет антикапча?

Антикапча - это сервис по ручному распознаванию капчи. Иными словами, сотни китайцев школьников сидят и за копейки распознают капчу, которые им подсовывают. Я не представляю, где они находят столько дураков, готовых за $1 распознавать 1000 капч, но меня это и не волнует.

Механизм работы сервиса простой:

  1. Вы отправляете картинку на сервис и она встает в очередь на прием к обезьянкам.
  2. Раз в 5 секунд вы запрашиваете статус картинки.
  3. Если картинка не распозналась, ждете еще 5 секунд. Если ожидание затянулось - значит не судьба, спустя некоторое время картинка выпадает.
  4. Если картинка распозналась, то вы получаете текст, который по мнению обезьянки на ней написан.

На счет мнения обезьянки надо сказать отдельно. Среди них попадаются откровенные халтурщики, которые вводят заведомую херню. Поэтому чтобы минимизировать шанс нарваться на такую сволочь, надо в запросе на добавление картинки максимально точно описать параметры текста.

Техническая сторона.

Антикапча предоставляет несложный API для взаимодействия с ней, однако уже написаны функции для PHP, Python, C++, Perl, C#, Delphi и даже VB и Asm, чем мы и будем пользоваться. В нашем случае, я воспользуюсь PHP-версией с curl. В архив я включил слегка измененную для более удобного вывода процесса версию этого скрипта, но с тем же успехом можно работать и с оригинальным.

Инвайты на антикапчу.

Регистрация на этом сервисе требует инвайта. К сожалению, эти хитрецы не позволяют иметь больше одного не активированного инвайта, поэтому я публикую здесь только один: a9bcd1d903 45914dfa51. Кому надо еще - пишите на почту . (См. UPD1 в конце поста) Теперь инвайты на антикапчу можно получить в автоматическом режиме.

Пишем код.

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

**<?php**
header('Content-Type: text/html; charset=UTF-8');
**function** register1()
{
    // Особая, curl-ная магия
    $ch = curl_init(); // Инициализируем сессию
    curl_setopt($ch, **CURLOPT_URL**,"http://moemesto.ru/register/"); // задаем адрес формы
    curl_setopt($ch, **CURLOPT_RETURNTRANSFER**, 1); // Результат нам нужно вернуть в переменную, а не на экран
    curl_setopt($ch, **CURLOPT_FOLLOWLOCATION**, 1); // Переходить по редиректам
    curl_setopt($ch, **CURLOPT_COOKIEJAR**, 'cookie.txt'); // Указываем файл для хранения кукисов

    // Выполняем запрос
    $result = curl_exec($ch);

    // При помощи простейшего регулярного выражения добываем сессионный ключ
    preg_match('#<input type=hidden name="captchaid" value="([a-f0-9]+)">#i', $result, $key);

    curl_setopt($ch, **CURLOPT_URL**,"http://moemesto.ru/captcha/$key[1]"); // задаем адрес картинки
    $result = curl_exec($ch); // Скачиваем картинку
    curl_close ($ch); // Закрываем сессию

    file_put_contents('captcha.jpg', $result); // Сохраняем

    return $key[1]; // Возвращаем добытый ключ
}

// Функция, производящая регистрацию
**function** register2($login, $email, $password, $captcha, $key)
{
    // Все POST-параметры, которые надо отправить
    $post = array(
        'captchaid' => $key // Передаем сессионный ключ
        'login'     => $login, // Логин
        'email'     => $email, // Емейл
        'password'  => $password, // Пароль
        'captcha'   => $captcha, // А это наш код с картинки
        'do_reg'    => 'Зарегистрироваться', // "Нажимаем" кнопку отправить ;-)
    );

    // Особая, curl-ная магия
    $ch = curl_init(); // Инициализируем сессию
    curl_setopt($ch, **CURLOPT_URL**,"http://moemesto.ru/register/"); // задаем адрес обработчика формы
    curl_setopt($ch, **CURLOPT_POST**, 1); // Указываем, что нам нужно отправить POST-запрос
    curl_setopt($ch, **CURLOPT_POSTFIELDS**, $post); // Передаем POST-параметры
    curl_setopt($ch, **CURLOPT_RETURNTRANSFER**, 1); // Результат нам нужно вернуть в переменную, а не на экран
    curl_setopt($ch, **CURLOPT_FOLLOWLOCATION**, 1); // Переходить по редиректам
    curl_setopt($ch, **CURLOPT_COOKIEJAR**, 'cookie.txt'); // Указываем файл для хранения кукисов. При чем он должен быть тот же, что и в прошлый раз, чтобы кукисы подхватились.

    // Запускаем запрос!
    $result = curl_exec($ch);
    curl_close ($ch); // Закрываем сессию

    // Проверяем на успешность регистрации
    //echo $result;
    if(strstr($result, 'Поздравляем! Вы успешно зарегистрировались!'))
    {
        return **true**;
    }
    else
    {
        return **false**;
    }
}

// Параметры регистрации. Их можно задавать руками, или считывать из файла - на ваше усмотрение.
$login = 'antifrager323';
$email = 'antifrag233@yopmail.com';
$password = 'qwerty';

// Выводим, что мы будем регать
echo "Логин: $login, пароль: $password, email: $email<br/>";

// Получаем капчу и сессионный ключ
$key = register1();

// Подключаем апи антикапчи
require('ac_curl.php');
// Распознаем капчу. Список и значение параметров функции можно узнать в начале файла.
// Чем точнее параметры будут описывать капчу, тем больше точность распознавания
$captcha=recognize("captcha.jpg","ваш_api_key",**true**, 5 120, 0, 0, 1, 4, 6);
// На всякий случай показываем картинку и распознанный текст
echo '<img src="captcha.jpg"><br>Text:'.$captcha.'<br>';

// Регаем
if(register2($login, $email, $password, $captcha, $key))
{
    echo 'Успешно зарегистрирован';
}
else
{
    echo '<b>Ошибка регистрации</b>';
}
echo '<br><a href="'.basename(**__FILE__**).'">Еще раз</a>';
// Все!  ;-)
**?>**

Обратите внимание, что “ваш_api_key” надо заменить на нормальный api key, который есть в панели антикапчи, в разделе настройки. напомню, что в скрипте умышленно допущена пара синтаксических ошибок, чтобы отсеять все тех же обезьянок.

moemesto_ac.zip - архив с самом скриптом и модифицированной библиотекой работы с антикапчей.

UPD1. Завтра сделаю автоматическую выдачу инвайтов, дабы не тормозить очередь :)

UPD2. Сделал.

В следующем выпуске…

… вы узнаете, как подтвердить регистрацию по почте.

P.S. Lunatica — Out!

blog comments powered by Disqus