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

Как обойти ALTCHA

Введение

ALTCHA (Automated Logical Turing Test of Human Attention) — это современная капча на основе криптографического Proof-of-Work (PoW), которая не требует от пользователя решать визуальные задачи. Вместо этого браузер вычисляет специальное значение nonce, подтверждающее, что запрос инициирован реальным человеком.

В этом руководстве вы узнаете:

  • Как работает технология ALTCHA
  • Какие параметры требуются для решения через API
  • Пошаговый процесс интеграции с примерами кода
  • Как обрабатывать ошибки и оптимизировать запросы

Важно: В отличие от традиционных капч, ALTCHA не содержит изображений, текста или интерактивных элементов — вся проверка строится на математическом подтверждении.


Как работает ALTCHA

Характеристика Описание
Тип проверки Proof-of-Work (криптографическая задача)
Визуальные элементы Отсутствуют
Механизм Сервер выдаёт challenge, клиент вычисляет nonce
Валидация Сервер проверяет корректность решения математически
Результат Токен для передачи в целевой запрос

Ключевые особенности:

  1. Proof-of-Work вместо визуальных задач
    Сервер отправляет клиенту JSON с параметрами: challenge, difficulty, salt, algorithm. Браузер перебирает значения nonce, пока хеш не удовлетворит условию сложности.

  2. Верификация без хранения состояния
    Проверка происходит исключительно на основе математики: сервер может независимо проверить предоставленный nonce без сессий или куки.

  3. Асинхронное выполнение
    Вычисления выполняются в фоне (через Web Worker), не блокируя интерфейс.

  4. Простая интеграция
    Вся логика основана на обмене JSON-данными через стандартные HTTP-запросы.


Подготовка: обязательные параметры

Для решения ALTCHA через API RuCaptcha необходимо передать следующие параметры:

Базовые параметры (для обоих типов задач)

Свойство Тип Обязателен Описание
type String Да Тип задачи: AltchaTask (с прокси) или AltchaTaskProxyless (без прокси)
websiteURL String Да Полный URL страницы, где загружена капча
challengeURL String Да* Значение атрибута challenge_url из элемента <altcha-widget>
challengeJSON String Да* Прямое содержимое challenge-файла в формате JSON

* В запросе должен быть указан один из параметров: challengeURL или challengeJSON.

Параметры прокси (только для типа AltchaTask)

Свойство Тип Обязателен Описание
proxyType String Да Тип прокси: http, https, socks5
proxyAddress String Да IP-адрес или хост прокси-сервера
proxyPort Integer Да Порт прокси-сервера
proxyLogin String Нет Логин для авторизации на прокси
proxyPassword String Нет Пароль для авторизации на прокси

Для типа задачи AltchaTaskProxyless прокси не требуется


Пошаговая инструкция: решение ALTCHA через API

Шаг 1: Извлеките challenge-данные

  1. Откройте целевой сайт в браузере с включёнными DevTools (F12)
  2. Перейдите на вкладку Network → включите Preserve log
  3. Найдите в исходном коде страницы элемент <altcha-widget>:
html Copy
<altcha-widget 
  challenge_url="https://example.com/api/altcha/challenge?sitekey=abc123" 
  ...>
</altcha-widget>
  1. Скопируйте значение атрибута challenge_url

Альтернатива: выполните запрос к challenge_url вручную и скопируйте ответ в формате JSON:

json Copy
{
  "algorithm": "SHA-256",
  "challenge": "eab91764d3f9d0c0e8fd...",
  "difficulty": 24,
  "salt": "random_salt_value",
  "max_number": 1000000
}

Шаг 2: Отправьте задачу на решение

Эндпоинт создания задачи: https://api.2captcha.com/createTask

Пример запроса с challengeURL (AltchaTaskProxyless):

json Copy
{
  "clientKey": "ВАШ_API_КЛЮЧ",
  "task": {
    "type": "AltchaTaskProxyless",
    "websiteURL": "https://example.com/",
    "challengeURL": "https://example.com/api/altcha/challenge?sitekey=abc123"
  }
}

Пример запроса с challengeJSON и прокси (AltchaTask):

json Copy
{
  "clientKey": "ВАШ_API_КЛЮЧ",
  "task": {
    "type": "AltchaTask",
    "websiteURL": "https://example.com/",
    "challengeJSON": "{\"algorithm\":\"SHA-256\",\"challenge\":\"eab91764...\",\"difficulty\":24}",
    "proxyType": "http",
    "proxyAddress": "192.168.1.1",
    "proxyPort": 8080,
    "proxyLogin": "login",
    "proxyPassword": "password"
  }
}

Шаг 3: Получите ID задачи

В успешном ответе вы получите:

json Copy
{
  "errorId": 0,
  "taskId": "1234567890"
}

Сохраните taskId для опроса результата.

Шаг 4: Запросите результат

Эндпоинт получения результата:
https://api.2captcha.com/getTaskResult

Запрос:

json Copy
{
  "clientKey": "ВАШ_API_КЛЮЧ",
  "taskId": "1234567890"
}

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

json Copy
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiZWFiOTE3NjRkM2Y5ZDBjMGU4ZmR..."
  },
  "cost": "0.0012",
  "createTime": 1754563182,
  "endTime": 1754563190
}

Шаг 5: Используйте токен

Добавьте полученный токен в целевой запрос к сайту. Обычно он передаётся в теле или заголовке запроса:

javascript Copy
// Пример добавления токена в тело POST-запроса
fetch("https://example.com/api/protected-endpoint", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    altcha_token: "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiZWFiOTE3NjRkM2Y5ZDBjMGU4ZmR...",
    // остальные данные формы
  })
});

Токен действителен ограниченное время (обычно 2-5 минут) — используйте его немедленно после получения!


Примеры кода

Python (requests)

python Copy
import requests
import time

API_KEY = "ВАШ_API_КЛЮЧ"
CREATE_TASK_URL = "https://api.2captcha.com/createTask"
GET_RESULT_URL = "https://api.2captcha.com/getTaskResult"

def solve_altcha(website_url: str, challenge_url: str = None, challenge_json: str = None, use_proxy: bool = False):
    if not challenge_url and not challenge_json:
        raise ValueError("Укажите challengeURL или challengeJSON")
    
    task = {
        "clientKey": API_KEY,
        "task": {
            "type": "AltchaTaskProxyless" if not use_proxy else "AltchaTask",
            "websiteURL": website_url
        }
    }
    
    if challenge_url:
        task["task"]["challengeURL"] = challenge_url
    if challenge_json:
        task["task"]["challengeJSON"] = challenge_json
    
    if use_proxy:
        task["task"].update({
            "proxyType": "http",
            "proxyAddress": "1.2.3.4",
            "proxyPort": 8080,
            "proxyLogin": "user",
            "proxyPassword": "pass"
        })
    
    # Создаём задачу
    response = requests.post(CREATE_TASK_URL, json=task)
    result = response.json()
    
    if result.get("errorId") != 0:
        raise Exception(f"Ошибка создания задачи: {result}")
    
    task_id = result["taskId"]
    
    # Опрашиваем результат
    while True:
        time.sleep(5)
        res = requests.post(GET_RESULT_URL, json={
            "clientKey": API_KEY,
            "taskId": task_id
        }).json()
        
        if res.get("status") == "ready":
            return res["solution"]["token"]
        elif res.get("errorId") != 0:
            raise Exception(f"Ошибка решения: {res}")

# Использование
token = solve_altcha(
    website_url="https://example.com/",
    challenge_url="https://example.com/api/altcha/challenge?sitekey=abc123"
)
print(f"Получен токен: {token[:50]}...")

Node.js (axios)

javascript Copy
const axios = require('axios');

const API_KEY = 'ВАШ_API_КЛЮЧ';
const CREATE_TASK_URL = 'https://api.2captcha.com/createTask';
const GET_RESULT_URL = 'https://api.2captcha.com/getTaskResult';

async function solveAltcha(websiteURL, challengeURL = null, challengeJSON = null) {
  if (!challengeURL && !challengeJSON) {
    throw new Error('Укажите challengeURL или challengeJSON');
  }

  const task = {
    clientKey: API_KEY,
    task: {
      type: 'AltchaTaskProxyless',
      websiteURL
    }
  };

  if (challengeURL) task.task.challengeURL = challengeURL;
  if (challengeJSON) task.task.challengeJSON = challengeJSON;

  // Создаём задачу
  const { data: createResponse } = await axios.post(CREATE_TASK_URL, task);
  
  if (createResponse.errorId !== 0) {
    throw new Error(`Ошибка: ${JSON.stringify(createResponse)}`);
  }
  
  const taskId = createResponse.taskId;
  
  // Опрашиваем результат
  while (true) {
    await new Promise(resolve => setTimeout(resolve, 5000));
    
    const { data: result } = await axios.post(GET_RESULT_URL, {
      clientKey: API_KEY,
      taskId
    });
    
    if (result.status === 'ready') {
      return result.solution.token;
    }
    if (result.errorId !== 0) {
      throw new Error(`Ошибка решения: ${JSON.stringify(result)}`);
    }
  }
}

// Использование
solveAltcha(
  'https://example.com/',
  'https://example.com/api/altcha/challenge?sitekey=abc123'
).then(token => {
  console.log('Токен:', token);
});

Обработка ошибок и рекомендации

Частые ошибки API

Код ошибки Описание Решение
ERROR_WRONG_USER_KEY Неверный API-ключ Проверьте clientKey в личном кабинете
ERROR_NO_SLOT_AVAILABLE Нет свободных воркеров Повторите запрос через 10-15 секунд
ERROR_CAPTCHA_UNSOLVABLE Капча не может быть решена Проверьте актуальность параметров, попробуйте другой прокси

Рекомендации по стабильности

  1. Используйте свежие challenge-данные
    Challenge имеет ограниченное время жизни. Извлекайте его непосредственно перед отправкой задачи.

  2. Оптимальный интервал опроса
    Опрос статуса задачи каждые 5-10 секунд — баланс между скоростью и нагрузкой на API.

  3. Ротация прокси при использовании AltchaTask
    Чередуйте прокси, чтобы избежать блокировок по IP при массовых запросах.

  4. Логирование для отладки
    Фиксируйте taskId, время создания/получения решения и ошибки — это упростит диагностику проблем.

  5. Таймауты и повторные попытки
    Если решение не получено за 60-90 секунд, считайте задачу просроченной и создавайте новую.


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


Заключение

ALTCHA — это современный подход к защите от автоматизированных запросов: вместо визуальных заданий используется криптографическое доказательство работы, что делает механизм незаметным для пользователей и более устойчивым к простым формам автоматизации.

Для корректной интеграции важно:

  • обеспечивать точную передачу параметров, связанных с challenge
  • учитывать контекст использования, включая websiteURL и другие связанные данные
  • корректно обрабатывать ответы системы и использовать полученные токены в рамках предусмотренного сценария

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