Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как решить текстовую капчу автоматически

Катя Пушкарёва
Катя Пушкарёва

Технический специалист

Причины поиска решения для автоматизации обхода

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

Для автоматизации обхода требуется применение продвинутых моделей машинного обучения или API сервисов, что добавляет сложности в автоматизацию. Приводим полные инструкции для наиболее распространенных язык программирования.

Типы текстовых капч

Существует два основных типа текстовых капч, которые решаются по-разному:

1. Текстовые вопросы (Text CAPTCHA)

Это капчи, которые содержат текстовый вопрос, на который нужно ответить. Например:

  • "Если завтра суббота, какой день сегодня?"
  • "Сколько будет 2 + 2?"
  • "Введите слово 'привет' наоборот"

Для решения таких капч используется метод text() с передачей текста вопроса.

2. Капчи с изображениями (Normal CAPTCHA / ImageToTextTask)

Это классические капчи в виде изображений с искаженным текстом (буквами, цифрами или их комбинацией). Пользователь должен распознать и ввести текст с картинки.

Для решения таких капч используется метод normal() или ImageToTextTask с передачей изображения в формате Base64.

В этой статье мы рассмотрим оба типа.


Решение текстовых вопросов (Text CAPTCHA)

PHP

  1. Установка пакета:

Используйте Composer для установки библиотеки:

bash Copy
composer require 2captcha/2captcha
  1. Настройка клиента:
php Copy
require 'vendor/autoload.php';

use TwoCaptcha\TwoCaptcha;

$solver = new TwoCaptcha('ВАШ_API_KEY');
  1. Решение текстовой капчи:
php Copy
try {
    $result = $solver->text([
        'text' => 'Если завтра суббота, какой день сегодня?',
        'lang' => 'ru', // Опционально: указать язык
    ]);
    echo 'Капча решена: ' . $result->code;
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Python

  1. Установка пакета:

Используйте pip для установки библиотеки:

bash Copy
pip install 2captcha-python
  1. Настройка клиента:
python Copy
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('ВАШ_API_KEY')
  1. Решение текстовой капчи:
python Copy
try:
    result = solver.text('Если завтра суббота, какой день сегодня?', lang='ru')
    print('Капча решена:', result['code'])
except Exception as e:
    print('Ошибка:', e)

Go

  1. Установка пакета:

Используйте go get для установки библиотеки:

bash Copy
go get -u github.com/2captcha/2captcha-go
  1. Настройка клиента:
go Copy
package main

import (
    "github.com/2captcha/2captcha-go"
)

func main() {
    client := api2captcha.NewClient("ВАШ_API_KEY")
    // Дополнительная настройка при необходимости
}
  1. Решение текстовой капчи:
go Copy
package main

import (
    "fmt"
    "log"
    "github.com/2captcha/2captcha-go"
)

func main() {
    client := api2captcha.NewClient("ВАШ_API_KEY")

    cap := api2captcha.Text{
        Text: "Если завтра суббота, какой день сегодня?",
        Lang: "ru", // Опционально: указать язык
    }

    code, err := client.Solve(cap.ToRequest())
    if err != nil {
        log.Fatal("Ошибка:", err)
    }

    fmt.Println("Капча решена:", code)
}

C#

  1. Установка пакета:

Используйте NuGet для установки библиотеки:

powershell Copy
Install-Package TwoCaptcha
  1. Настройка клиента:
csharp Copy
using TwoCaptcha;

var solver = new TwoCaptcha("ВАШ_API_KEY");
  1. Решение текстовой капчи:
csharp Copy
using System;
using TwoCaptcha.Captcha;

class Program
{
    static void Main()
    {
        var solver = new TwoCaptcha("ВАШ_API_KEY");

        var captcha = new Text
        {
            Text = "Если завтра суббота, какой день сегодня?",
            Lang = "ru" // Опционально: указать язык
        };

        try
        {
            solver.Solve(captcha).Wait();
            Console.WriteLine("Капча решена: " + captcha.Code);
        }
        catch (AggregateException e)
        {
            Console.WriteLine("Ошибка: " + e.InnerException.Message);
        }
    }
}

Java

  1. Установка пакета:

Добавьте зависимость в ваш pom.xml:

xml Copy
<dependency>
    <groupId>com.github.2captcha</groupId>
    <artifactId>2captcha-java</artifactId>
    <version>1.0.0</version>
</dependency>
  1. Настройка клиента:
java Copy
import com.twocaptcha.TwoCaptcha;

TwoCaptcha solver = new TwoCaptcha("ВАШ_API_KEY");
  1. Решение текстовой капчи:
java Copy
import com.twocaptcha.TwoCaptcha;
import com.twocaptcha.captcha.Text;

public class Main {
    public static void main(String[] args) {
        TwoCaptcha solver = new TwoCaptcha("ВАШ_API_KEY");

        Text captcha = new Text();
        captcha.setText("Если завтра суббота, какой день сегодня?");
        captcha.setLang("ru"); // Опционально: указать язык

        try {
            solver.solve(captcha);
            System.out.println("Капча решена: " + captcha.getCode());
        } catch (Exception e) {
            System.out.println("Ошибка: " + e.getMessage());
        }
    }
}

JavaScript (Node.js)

  1. Установка пакета:

Используйте npm для установки библиотеки:

bash Copy
npm install @2captcha/captcha-solver
  1. Настройка клиента:
javascript Copy
const { Solver } = require('@2captcha/captcha-solver');
const solver = new Solver('ВАШ_API_KEY');
  1. Решение текстовой капчи:
javascript Copy
(async () => {
    try {
        const result = await solver.text({
            text: 'Если завтра суббота, какой день сегодня?',
            lang: 'ru' // Опционально: указать язык
        });
        console.log('Капча решена:', result);
    } catch (error) {
        console.error('Ошибка:', error.message);
    }
})();

Решение капч с изображениями (Normal CAPTCHA / ImageToTextTask)

Для капч в виде изображений с искаженным текстом используется другой подход — метод normal() или задача типа ImageToTextTask.

Процесс решения

  1. Получить изображение капчи — через браузер или HTTP-запрос
  2. Закодировать в Base64 — для передачи в API
  3. Отправить задачу — через эндпоинт createTask
  4. Опрашивать результат — через getTaskResult
  5. Использовать решение — ввести распознанный текст в форму

Параметры API

Обязательные параметры

Параметр Тип Описание
type string Всегда "ImageToTextTask"
body string Изображение капчи в формате Base64

Опциональные, но рекомендуемые параметры

Параметр Тип Описание
numeric integer 0 — любые символы (по умолчанию), 1 — только цифры, 2 — только буквы
case boolean true — учитывать регистр (настоятельно рекомендуется)
math boolean true — если капча требует вычисления математического выражения
minLength integer Минимальная ожидаемая длина ответа
maxLength integer Максимальная ожидаемая длина ответа
comment string Дополнительные инструкции для работников
languagePool string Установите "ru" для русского, "en" для английского и т.д. (опционально)

Примеры JSON-запросов

Запрос на создание задачи

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "ImageToTextTask",
        "body": "BASE64_ENCODED_IMAGE",
        "case": true,
        "numeric": 2,
        "minLength": 4,
        "maxLength": 6,
        "comment": "Вводите только буквы, учитывать регистр"
    }
}

Запрос на получение результата

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "taskId": "TASK_ID_FROM_CREATE_TASK"
}

Успешный ответ

json Copy
{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "text": "aBcDeF"
    },
    "cost": "0.0005",
    "createTime": 1692808229,
    "endTime": 1692808234
}

Примеры кода для капч с изображениями

Python (через requests)

python Copy
import time
import requests
import base64

API_KEY = "YOUR_API_KEY"
API_HOST = "api.rucaptcha.com"

def solve_image_captcha(image_path):
    # Конвертируем в Base64
    with open(image_path, "rb") as f:
        captcha_base64 = base64.b64encode(f.read()).decode('utf-8')
    
    # Создаем задачу
    create_response = requests.post(
        f"https://{API_HOST}/createTask",
        json={
            "clientKey": API_KEY,
            "task": {
                "type": "ImageToTextTask",
                "body": captcha_base64,
                "case": True,
                "numeric": 2
            }
        }
    )
    
    task_id = create_response.json()["taskId"]
    
    # Ждем результат
    while True:
        time.sleep(3)
        
        result_response = requests.post(
            f"https://{API_HOST}/getTaskResult",
            json={
                "clientKey": API_KEY,
                "taskId": task_id
            }
        )
        
        result = result_response.json()
        
        if result.get("status") == "ready":
            return result["solution"]["text"]
        elif result.get("errorId") != 0:
            raise Exception(f"Ошибка: {result.get('errorDescription')}")

# Использование
if __name__ == "__main__":
    solution = solve_image_captcha("captcha.png")
    print(f"Решение: {solution}")

Python (через официальный SDK)

python Copy
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('ВАШ_API_KEY')

try:
    result = solver.normal(
        'path/to/captcha.jpg',
        case=True,
        numeric=2
    )
    print(f"Решено: {result['code']}")
except Exception as e:
    print(f"Ошибка: {e}")

PHP

php Copy
require 'vendor/autoload.php';

use TwoCaptcha\TwoCaptcha;

$solver = new TwoCaptcha('ВАШ_API_KEY');

try {
    $result = $solver->normal([
        'file' => 'path/to/captcha.jpg',
        'case' => true,
        'numeric' => 2
    ]);
    echo 'Капча решена: ' . $result->code;
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

JavaScript (Node.js)

javascript Copy
const { Solver } = require('@2captcha/captcha-solver');
const solver = new Solver('ВАШ_API_KEY');

(async () => {
    try {
        const result = await solver.normal({
            file: 'path/to/captcha.jpg',
            case: true,
            numeric: 2
        });
        console.log('Капча решена:', result);
    } catch (error) {
        console.error('Ошибка:', error.message);
    }
})();

Интеграция с Selenium

python Copy
from selenium import webdriver
from selenium.webdriver.common.by import By
from twocaptcha import TwoCaptcha
import time

def solve_captcha_selenium(driver, api_key):
    # Делаем скриншот элемента капчи
    captcha_element = driver.find_element(By.CSS_SELECTOR, ".captcha-image")
    captcha_element.screenshot("temp_captcha.png")
    
    # Решаем через API
    solver = TwoCaptcha(api_key)
    result = solver.normal("temp_captcha.png", case=True)
    captcha_text = result['code']
    
    # Вводим решение
    input_field = driver.find_element(By.ID, "captcha-input")
    input_field.clear()
    input_field.send_keys(captcha_text)
    
    # Отправляем форму
    driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
    time.sleep(2)

# Использование
driver = webdriver.Chrome()
try:
    driver.get("https://example.com/login")
    solve_captcha_selenium(driver, "ВАШ_API_KEY")
finally:
    driver.quit()

Лучшие практики

1. Включайте учет регистра

Большинство текстовых капч чувствительны к регистру. Всегда устанавливайте case: true, чтобы API возвращал точные заглавные и строчные буквы, которые требуются.

2. Указывайте типы символов

Если вы знаете, что капча содержит только цифры, установите numeric: 1. Если только буквы — numeric: 2. Это предотвратит путаницу работников между цифрой 0 и буквой O, или 1 и I.

3. Задавайте ограничения по длине

Указание minLength и maxLength помогает работникам проверять свой ввод. Если капча всегда содержит 5 символов, установка обоих параметров в 5 значительно снизит количество ошибок.

4. Давайте четкие инструкции

Используйте параметр comment, чтобы дать конкретные подсказки. Например: "Только буквы, без цифр" или "Математическое выражение, вычислите результат".

5. Реализуйте логику повторных попыток

Иногда капчи бывают слишком искаженными. Если решение отклоняется целевым сайтом, получите новую капчу и попробуйте снова.

python Copy
def solve_with_retry(image_path, max_attempts=3):
    for attempt in range(max_attempts):
        try:
            return solve_image_captcha(image_path)
        except Exception as e:
            print(f"Попытка {attempt + 1} не удалась: {e}")
            time.sleep(2)
    raise Exception("Не удалось решить капчу после нескольких попыток")

6. Проверяйте качество изображения

Убедитесь, что изображение четкое, не обрезано и в поддерживаемом формате (JPEG, PNG, GIF). Максимальный размер файла — 100 КБ.


Отчеты о правильности решения

Если решение капчи оказалось неверным или вы хотите сообщить о корректном решении, используйте систему отчетов 2Captcha. Это помогает улучшить качество распознавания и обучает работников.

Когда отправлять отчеты

Отправьте reportIncorrect, если:

  • Распознанный текст не соответствует изображению капчи
  • Решение было отклонено сайтом
  • Работник допустил очевидную ошибку

Отправьте reportCorrect, если:

  • Решение было правильным, но система пометила его как неверное
  • Вы хотите подтвердить высокое качество решения

Параметры отчетов

Параметр Тип Описание
clientKey string Ваш API-ключ
taskId string ID задачи из createTask

Пример отправки отчета

python Copy
import requests

API_KEY = "YOUR_API_KEY"
API_HOST = "api.rucaptcha.com"

def report_incorrect(task_id):
    """Сообщить о неверном решении капчи"""
    response = requests.post(
        f"https://{API_HOST}/reportIncorrect",
        json={
            "clientKey": API_KEY,
            "taskId": task_id
        }
    )
    
    result = response.json()
    
    if result.get("errorId") == 0:
        print("Отчет о неверном решении принят")
        return True
    else:
        print(f"Ошибка: {result.get('errorDescription')}")
        return False

def report_correct(task_id):
    """Сообщить о верном решении капчи"""
    response = requests.post(
        f"https://{API_HOST}/reportCorrect",
        json={
            "clientKey": API_KEY,
            "taskId": task_id
        }
    )
    
    result = response.json()
    
    if result.get("errorId") == 0:
        print("Отчет о верном решении принят")
        return True
    else:
        print(f"Ошибка: {result.get('errorDescription')}")
        return False

Важные моменты для отчетов

  1. Отправляйте отчеты своевременно — чем быстрее вы сообщите о проблеме, тем лучше
  2. Не злоупотребляйте отчетами — отправляйте их только при реальной необходимости
  3. Проверяйте taskId — убедитесь, что используете правильный ID задачи
  4. Сохраняйте taskId — храните ID задач в состоянии вашего приложения для возможной отправки отчетов

Решение частых проблем

Неверное распознавание

Решения:

  • Включите case: true
  • Укажите правильное значение numeric (1 для цифр, 2 для букв)
  • Добавьте точные инструкции в параметр comment
  • Улучшите качество изображения перед отправкой

Низкий процент успеха

Решения:

  • Используйте изображения с более высоким разрешением (избегайте сильного сжатия)
  • Добавьте параметры minLength и maxLength
  • Проверьте, что используете правильный эндпоинт API
  • Убедитесь, не требует ли капча математического вычисления (установите math: true)

Таймауты

Решения:

  • Установите разумный таймаут в вашем цикле опроса (например, 60-120 секунд)
  • Реализуйте логику повторных попыток для крайних случаев
  • Проверьте интернет-соединение
  • Убедитесь, что на балансе достаточно средств

Итоги

Капчи остаются одним из самых барьерв препятствий при сборе данных из открытых источников и мешают доступности. Поэтому, важно провести оптимизацию способов обхода.

В статье рассмотрены способы решения на разных языках программирования для обоих типов текстовых капч:

  • Текстовые вопросы — используйте метод text() с передачей текста вопроса
  • Капчи с изображениями — используйте метод normal() или ImageToTextTask с передачей изображения в Base64

Ключевые выводы:

  1. Для текстовых вопросов используйте solver.text() с параметром text
  2. Для капч с изображениями используйте solver.normal() с параметром body (Base64)
  3. Всегда включайте case: true для капч с изображениями
  4. Используйте numeric, minLength и maxLength, чтобы направлять работников
  5. Реализуйте reportIncorrect и reportCorrect для поддержания высокого качества решений
  6. Обрабатывайте ошибки корректно с помощью логики повторных попыток

Обратите внимание, что в каждом примере необходимо заменить 'ВАШ_API_KEY' на ваш действующий API-ключ от сервиса RuCaptcha. Дополнительную информацию и примеры использования можно найти в официальной документации RuCaptcha.

Полезные ссылки

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