Тестирование CAPTCHA API с помощью HTTPie

Автор: solvethree3 мин на чтение

Создайте одну задачу с помощью HTTPie, сохраните её ID, затем получите эту же задачу. Запишите requestId до POST-запроса, чтобы тайм-аут подключения не вынудил вас создать новую логическую задачу.

На этой странице

Подготовьте запрос

  • Установите HTTPie и jq и запустите пример в Bash. Эти команды используют исполняемый файл http из HTTPie, а не curl или псевдоним curl в оболочке.
  • Задайте в переменной окружения SOLVETHREE_API_KEY ключ API вашего рабочего пространства. Выполняйте это на доверенном компьютере; не включайте ключ в браузерный код.
  • Настройте в консоли активный профиль для имени хоста целевого сайта. Отправка имени хоста и действия не создаёт профиль. См. Настройка профиля сайта.
  • Замените примеры имени хоста, действия и URL прокси. Используйте URL HTTP- или HTTPS-прокси без пути, строки запроса и фрагмента.
  • Замените заполнитель requestId уникальным ID для этой логической задачи: 1–64 символа из букв ASCII, цифр, символов подчёркивания или дефисов. Сохраните его перед отправкой запроса.

Запрос предназначен для reCAPTCHA Enterprise: значение recaptchaType по умолчанию — enterprise-v3. Нужны site, action и ровно одно из полей proxy или proxyCandidates; в этом примере используется один прокси. Не добавляйте поля type и url.

Создайте задачу и сохраните её ID

HTTPie · создание одной задачи и её получение
set -eu
umask 077
# Install HTTPie and jq. Keep the same request.json for recovery.
cat > request.json <<'JSON'
{
  "site": "accounts.example.com",
  "action": "login",
  "proxy": "http://USER:PASSWORD@PROXY:PORT",
  "requestId": "replace-with-one-unique-logical-task-id"
}
JSON
# This file contains proxy credentials; keep it private.
http --check-status --timeout=30 POST https://api.solvethree.com/v1/tasks \
  Authorization:"Bearer $SOLVETHREE_API_KEY" waitMs==0 < request.json > task.json
TASK_ID=$(jq -r '.id' task.json)
http --check-status --timeout=30 GET "https://api.solvethree.com/v1/tasks/$TASK_ID" \
  Authorization:"Bearer $SOLVETHREE_API_KEY" waitMs==15000
# pending/solving: retrieve the same ID again, within a finite deadline.
# ready: use solution. failed: stop and inspect errorCode/error.
# A timed-out POST is recovered with the unchanged file and requestId.

JSON-строки в кавычках записываются в request.json, который HTTPie читает из stdin. Заголовок Authorization передаёт ваш ключ с использованием аутентификации Bearer. Храните request.json в закрытом доступе, поскольку он содержит учётные данные прокси.

waitMs==0 и waitMs==15000 — параметры строки запроса HTTPie, а не поля тела JSON. POST не запрашивает ожидание; GET использует ожидание 15,000 мс. Отдельный параметр HTTPie --timeout=30 задаёт клиентский тайм-аут в 30 секунд.

Ответ на POST сохраняется в task.json, а jq извлекает из него id для GET. Выполняйте команды по порядку. set -eu останавливает скрипт, если HTTPie сообщает об ошибке, прежде чем неполный ответ будет использован для получения задачи.

Успешный HTTP-ответ не означает готовность задачи

--check-status выявляет неуспешные HTTP-ответы. Обработайте их, прежде чем считать тело успешным ответом с задачей. Успешный HTTP-запрос всё равно может вернуть незавершённую задачу или задачу с ошибкой; следующим шагом проверьте status в JSON.

Что делать в зависимости от статуса задачи
Что делать в зависимости от статуса задачи
СтатусСледующее действие
pending или solvingСнова запросите задачу с тем же ID в пределах выбранного вами конечного срока. Не создавайте новую задачу только потому, что эта ещё не готова.
готовоИспользуйте полученное решение. Только при этом статусе доступно пригодное к использованию решение.
failedПрекратите опрос и проверьте errorCode и error. Средства за неудачные попытки решения возвращаются; не повторяйте вслепую запросы с неизменёнными некорректными входными данными.

Пример выполняет одно получение задачи, а не цикл опроса. При отправке готового решения на предназначенный для него целевой сайт используйте полученные userAgent и secChUa вместе с прокси, через который удалось получить решение. Готовность означает, что solvethree сгенерировал решение, а не то, что ваш прикладной запрос выполнен успешно.

Восстановите POST-запрос после тайм-аута

Клиентский тайм-аут не доказывает, что задача не была создана. Если у вас уже есть ID задачи, получите её. Если POST-запрос завершился по тайм-ауту до получения ID, повторите POST с неизменённым request.json, включая исходный requestId. Те же ID и входные данные задачи возвращают существующую задачу.

Не извлекайте ID из пустого или неполного task.json; сначала восстановите POST-запрос. Не меняйте прокси, действие или другие входные данные задачи при повторном использовании этого requestId — отличающиеся входные данные вызывают конфликт. Используйте новый requestId только тогда, когда намерены создать новую логическую задачу.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Тестирование CAPTCHA API с помощью HTTPie · solvethree