Эта статья была полезной?
Как решить текстовую капчу автоматически
Технический специалист
Причины поиска решения для автоматизации обхода
Капчи создают барьеры для пользователей с ограниченными возможностями, что требует разработки более инклюзивных решений.
Для автоматизации обхода требуется применение продвинутых моделей машинного обучения или API сервисов, что добавляет сложности в автоматизацию. Приводим полные инструкции для наиболее распространенных язык программирования.
Типы текстовых капч
Существует два основных типа текстовых капч, которые решаются по-разному:
1. Текстовые вопросы (Text CAPTCHA)
Это капчи, которые содержат текстовый вопрос, на который нужно ответить. Например:
- "Если завтра суббота, какой день сегодня?"
- "Сколько будет 2 + 2?"
- "Введите слово 'привет' наоборот"
Для решения таких капч используется метод text() с передачей текста вопроса.
2. Капчи с изображениями (Normal CAPTCHA / ImageToTextTask)
Это классические капчи в виде изображений с искаженным текстом (буквами, цифрами или их комбинацией). Пользователь должен распознать и ввести текст с картинки.
Для решения таких капч используется метод normal() или ImageToTextTask с передачей изображения в формате Base64.
В этой статье мы рассмотрим оба типа.
Решение текстовых вопросов (Text CAPTCHA)
PHP
- Установка пакета:
Используйте Composer для установки библиотеки:
bash
composer require 2captcha/2captcha
- Настройка клиента:
php
require 'vendor/autoload.php';
use TwoCaptcha\TwoCaptcha;
$solver = new TwoCaptcha('ВАШ_API_KEY');
- Решение текстовой капчи:
php
try {
$result = $solver->text([
'text' => 'Если завтра суббота, какой день сегодня?',
'lang' => 'ru', // Опционально: указать язык
]);
echo 'Капча решена: ' . $result->code;
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
Python
- Установка пакета:
Используйте pip для установки библиотеки:
bash
pip install 2captcha-python
- Настройка клиента:
python
from twocaptcha import TwoCaptcha
solver = TwoCaptcha('ВАШ_API_KEY')
- Решение текстовой капчи:
python
try:
result = solver.text('Если завтра суббота, какой день сегодня?', lang='ru')
print('Капча решена:', result['code'])
except Exception as e:
print('Ошибка:', e)
Go
- Установка пакета:
Используйте go get для установки библиотеки:
bash
go get -u github.com/2captcha/2captcha-go
- Настройка клиента:
go
package main
import (
"github.com/2captcha/2captcha-go"
)
func main() {
client := api2captcha.NewClient("ВАШ_API_KEY")
// Дополнительная настройка при необходимости
}
- Решение текстовой капчи:
go
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#
- Установка пакета:
Используйте NuGet для установки библиотеки:
powershell
Install-Package TwoCaptcha
- Настройка клиента:
csharp
using TwoCaptcha;
var solver = new TwoCaptcha("ВАШ_API_KEY");
- Решение текстовой капчи:
csharp
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
- Установка пакета:
Добавьте зависимость в ваш pom.xml:
xml
<dependency>
<groupId>com.github.2captcha</groupId>
<artifactId>2captcha-java</artifactId>
<version>1.0.0</version>
</dependency>
- Настройка клиента:
java
import com.twocaptcha.TwoCaptcha;
TwoCaptcha solver = new TwoCaptcha("ВАШ_API_KEY");
- Решение текстовой капчи:
java
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)
- Установка пакета:
Используйте npm для установки библиотеки:
bash
npm install @2captcha/captcha-solver
- Настройка клиента:
javascript
const { Solver } = require('@2captcha/captcha-solver');
const solver = new Solver('ВАШ_API_KEY');
- Решение текстовой капчи:
javascript
(async () => {
try {
const result = await solver.text({
text: 'Если завтра суббота, какой день сегодня?',
lang: 'ru' // Опционально: указать язык
});
console.log('Капча решена:', result);
} catch (error) {
console.error('Ошибка:', error.message);
}
})();
Решение капч с изображениями (Normal CAPTCHA / ImageToTextTask)
Для капч в виде изображений с искаженным текстом используется другой подход — метод normal() или задача типа ImageToTextTask.
Процесс решения
- Получить изображение капчи — через браузер или HTTP-запрос
- Закодировать в Base64 — для передачи в API
- Отправить задачу — через эндпоинт createTask
- Опрашивать результат — через getTaskResult
- Использовать решение — ввести распознанный текст в форму
Параметры 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
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "ImageToTextTask",
"body": "BASE64_ENCODED_IMAGE",
"case": true,
"numeric": 2,
"minLength": 4,
"maxLength": 6,
"comment": "Вводите только буквы, учитывать регистр"
}
}
Запрос на получение результата
json
{
"clientKey": "YOUR_API_KEY",
"taskId": "TASK_ID_FROM_CREATE_TASK"
}
Успешный ответ
json
{
"errorId": 0,
"status": "ready",
"solution": {
"text": "aBcDeF"
},
"cost": "0.0005",
"createTime": 1692808229,
"endTime": 1692808234
}
Примеры кода для капч с изображениями
Python (через requests)
python
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
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
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
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
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
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
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
Важные моменты для отчетов
- Отправляйте отчеты своевременно — чем быстрее вы сообщите о проблеме, тем лучше
- Не злоупотребляйте отчетами — отправляйте их только при реальной необходимости
- Проверяйте taskId — убедитесь, что используете правильный ID задачи
- Сохраняйте taskId — храните ID задач в состоянии вашего приложения для возможной отправки отчетов
Решение частых проблем
Неверное распознавание
Решения:
- Включите
case: true - Укажите правильное значение
numeric(1 для цифр, 2 для букв) - Добавьте точные инструкции в параметр
comment - Улучшите качество изображения перед отправкой
Низкий процент успеха
Решения:
- Используйте изображения с более высоким разрешением (избегайте сильного сжатия)
- Добавьте параметры
minLengthиmaxLength - Проверьте, что используете правильный эндпоинт API
- Убедитесь, не требует ли капча математического вычисления (установите
math: true)
Таймауты
Решения:
- Установите разумный таймаут в вашем цикле опроса (например, 60-120 секунд)
- Реализуйте логику повторных попыток для крайних случаев
- Проверьте интернет-соединение
- Убедитесь, что на балансе достаточно средств
Итоги
Капчи остаются одним из самых барьерв препятствий при сборе данных из открытых источников и мешают доступности. Поэтому, важно провести оптимизацию способов обхода.
В статье рассмотрены способы решения на разных языках программирования для обоих типов текстовых капч:
- Текстовые вопросы — используйте метод
text()с передачей текста вопроса - Капчи с изображениями — используйте метод
normal()илиImageToTextTaskс передачей изображения в Base64
Ключевые выводы:
- Для текстовых вопросов используйте
solver.text()с параметромtext - Для капч с изображениями используйте
solver.normal()с параметромbody(Base64) - Всегда включайте
case: trueдля капч с изображениями - Используйте
numeric,minLengthиmaxLength, чтобы направлять работников - Реализуйте
reportIncorrectиreportCorrectдля поддержания высокого качества решений - Обрабатывайте ошибки корректно с помощью логики повторных попыток
Обратите внимание, что в каждом примере необходимо заменить 'ВАШ_API_KEY' на ваш действующий API-ключ от сервиса RuCaptcha. Дополнительную информацию и примеры использования можно найти в официальной документации RuCaptcha.
Полезные ссылки
- Документация API: https://rucaptcha.com/api-docs/normal-captcha
- Примеры на GitHub: https://github.com/2captcha
- Центр поддержки: https://rucaptcha.com/support/tickets/new
- Как отправлять отчеты: https://rucaptcha.com/h/how-to-submit-reports
Если заинтересованы в решениях в сфере распознавания, таких как системы для обучения моделей, можете обращаться за дополнительной информацией.