Looking for international version of our service? Go to 2captcha.com

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

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

Как обойти 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.rucaptcha.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.rucaptcha.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.rucaptcha.com/createTask"
GET_RESULT_URL = "https://api.rucaptcha.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.rucaptcha.com/createTask';
const GET_RESULT_URL = 'https://api.rucaptcha.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 и другие связанные данные
  • корректно обрабатывать ответы системы и использовать полученные токены в рамках предусмотренного сценария

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