Как обойти ALTCHA
Введение
ALTCHA (Automated Logical Turing Test of Human Attention) — это современная капча на основе криптографического Proof-of-Work (PoW), которая не требует от пользователя решать визуальные задачи. Вместо этого браузер вычисляет специальное значение nonce, подтверждающее, что запрос инициирован реальным человеком.
В этом руководстве вы узнаете:
- Как работает технология ALTCHA
- Какие параметры требуются для решения через API
- Пошаговый процесс интеграции с примерами кода
- Как обрабатывать ошибки и оптимизировать запросы
Важно: В отличие от традиционных капч, ALTCHA не содержит изображений, текста или интерактивных элементов — вся проверка строится на математическом подтверждении.
Как работает ALTCHA
| Характеристика | Описание |
|---|---|
| Тип проверки | Proof-of-Work (криптографическая задача) |
| Визуальные элементы | Отсутствуют |
| Механизм | Сервер выдаёт challenge, клиент вычисляет nonce |
| Валидация | Сервер проверяет корректность решения математически |
| Результат | Токен для передачи в целевой запрос |
Ключевые особенности:
-
Proof-of-Work вместо визуальных задач
Сервер отправляет клиенту JSON с параметрами: challenge, difficulty, salt, algorithm. Браузер перебирает значения nonce, пока хеш не удовлетворит условию сложности. -
Верификация без хранения состояния
Проверка происходит исключительно на основе математики: сервер может независимо проверить предоставленный nonce без сессий или куки. -
Асинхронное выполнение
Вычисления выполняются в фоне (через Web Worker), не блокируя интерфейс. -
Простая интеграция
Вся логика основана на обмене 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-данные
- Откройте целевой сайт в браузере с включёнными DevTools (F12)
- Перейдите на вкладку Network → включите Preserve log
- Найдите в исходном коде страницы элемент
<altcha-widget>:
html
<altcha-widget
challenge_url="https://example.com/api/altcha/challenge?sitekey=abc123"
...>
</altcha-widget>
- Скопируйте значение атрибута
challenge_url
Альтернатива: выполните запрос к challenge_url вручную и скопируйте ответ в формате JSON:
json
{
"algorithm": "SHA-256",
"challenge": "eab91764d3f9d0c0e8fd...",
"difficulty": 24,
"salt": "random_salt_value",
"max_number": 1000000
}
Шаг 2: Отправьте задачу на решение
Эндпоинт создания задачи: https://api.2captcha.com/createTask
Пример запроса с challengeURL (AltchaTaskProxyless):
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"task": {
"type": "AltchaTaskProxyless",
"websiteURL": "https://example.com/",
"challengeURL": "https://example.com/api/altcha/challenge?sitekey=abc123"
}
}
Пример запроса с challengeJSON и прокси (AltchaTask):
json
{
"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
{
"errorId": 0,
"taskId": "1234567890"
}
Сохраните taskId для опроса результата.
Шаг 4: Запросите результат
Эндпоинт получения результата:
https://api.2captcha.com/getTaskResult
Запрос:
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"taskId": "1234567890"
}
Успешный ответ:
json
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiZWFiOTE3NjRkM2Y5ZDBjMGU4ZmR..."
},
"cost": "0.0012",
"createTime": 1754563182,
"endTime": 1754563190
}
Шаг 5: Используйте токен
Добавьте полученный токен в целевой запрос к сайту. Обычно он передаётся в теле или заголовке запроса:
javascript
// Пример добавления токена в тело 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
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
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 | Капча не может быть решена | Проверьте актуальность параметров, попробуйте другой прокси |
Рекомендации по стабильности
-
Используйте свежие challenge-данные
Challenge имеет ограниченное время жизни. Извлекайте его непосредственно перед отправкой задачи. -
Оптимальный интервал опроса
Опрос статуса задачи каждые 5-10 секунд — баланс между скоростью и нагрузкой на API. -
Ротация прокси при использовании AltchaTask
Чередуйте прокси, чтобы избежать блокировок по IP при массовых запросах. -
Логирование для отладки
ФиксируйтеtaskId, время создания/получения решения и ошибки — это упростит диагностику проблем. -
Таймауты и повторные попытки
Если решение не получено за 60-90 секунд, считайте задачу просроченной и создавайте новую.
Полезные ссылки
Заключение
ALTCHA — это современный подход к защите от автоматизированных запросов: вместо визуальных заданий используется криптографическое доказательство работы, что делает механизм незаметным для пользователей и более устойчивым к простым формам автоматизации.
Для корректной интеграции важно:
- обеспечивать точную передачу параметров, связанных с challenge
- учитывать контекст использования, включая websiteURL и другие связанные данные
- корректно обрабатывать ответы системы и использовать полученные токены в рамках предусмотренного сценария
Ключевой момент: стабильность работы напрямую зависит от актуальности и корректности передаваемых данных. Даже при корректной реализации важно предусмотреть обработку ошибок и повторные попытки.