Как решить капчу в Zapier и не упереться в таймаут

zapier captcha - How to Solve CAPTCHA in Zapier Without Hitting the Timeout

Шаг с капчей в Zapier падает по причине, которая к капчам отношения не имеет: шагу Code по умолчанию отводится 10 или 30 секунд, а решение занимает больше. Отправите задачу и станете опрашивать результат в одном шаге, получите таймаут. Рабочая схема выглядит так: два шага с задержкой между ними и решатель, доступный с серверов Zapier, то есть режим Server вместо адреса обратной петли. И то и другое правится за пять минут, как только вы поняли, что дело именно в этом.

Что понадобится

  • Аккаунт Zapier на любом тарифе, куда входит Code by Zapier.
  • Запущенный CapSkip в режиме Server на машине, доступной для Zapier, со статическим публичным IP. Смотрите раздел Настройки подключения.
  • Включённая проверка ключа и API-ключ, выданный для этого Zap.
  • Sitekey и URL страницы с защищённой формой, из того шага-триггера, который их отдаёт.

Здесь без режима Server не обойтись

Все остальные руководства в этом блоге запускают решатель на 127.0.0.1:8080, и на вашей собственной машине это именно то, что нужно. Zapier на вашей машине не работает. Ваш Zap выполняется на инфраструктуре Zapier, поэтому запрос на 127.0.0.1 из шага Code попадает в собственный контейнер Zapier и не получает ничего.

В настройках подключения CapSkip для этого есть второй режим. Локально привязывается к 127.0.0.1 и доступен только с этого устройства. Сервер привязывается к вашему сетевому или публичному IP, поэтому облачная платформа может обращаться к нему через тот же API, совместимый с 2captcha. Статический публичный IP рекомендуется, потому что этот адрес попадает в ваш Zap и менять его вам точно не захочется.

Это по-прежнему ваше железо и по-прежнему без тарификации. Режим Server меняет только то, где слушает решатель, а не то, кому он принадлежит и как за него платят. Что действительно меняется, так это открытость наружу, поэтому включите проверку ключа до того, как откроете порт, и выдайте этому Zap отдельный ключ, чтобы его можно было отозвать, не задев остальное.

Таймаут, который определяет устройство вашего Zap

Code by Zapier выполняет ваш Python или JavaScript с потолком по времени. На Starter этот потолок равен 10 секундам. На Pro, Team и Company он равен 30 секундам. Ещё Zapier предлагает расширенное время выполнения, которое поднимает шаг Code до 10 минут и настраивается на самом шаге.

Теперь сравните это со временем решения. Картиночная капча обычно занимает секунды. reCAPTCHA v2 обычно решается за 15-45 секунд, а рекомендация по опросу такая: подождать примерно 15-20 секунд до первой проверки. То есть цикл «отправить и опрашивать» не влезает в 10 секунд, обычно не влезает и в 30, и спокойно влезает в расширенное время выполнения.

Отсюда две схемы, и выбор зависит от того, включено ли расширенное время выполнения:

  • Два шага плюс задержка. Работает на любом тарифе. Отправили, подождали, опросили. История Zap читается ясно, и медленное решение не убивает запуск.
  • Один шаг с расширенным временем выполнения. Меньше подвижных деталей, и всё решение живёт в одном месте. Требует включённого увеличенного времени выполнения на этом шаге.

Шаг 1: отправляем капчу и сохраняем ID

Добавьте действие Code by Zapier и выберите Python, затем передайте в поля ввода шага sitekey и URL страницы. Значения на входе всегда приходят строками в input_data, что здесь не мешает, потому что всё отправляемое и так строки.

# Code by Zapier, Python. requests is available; nothing to install.
SOLVER = "http://YOUR_SERVER_IP:8080"

r = requests.post(SOLVER + "/in.php", data={
    "key": input_data["api_key"],
    "method": "userrecaptcha",
    "googlekey": input_data["sitekey"],
    "pageurl": input_data["pageurl"],
    "json": 1,
})
body = r.json()

if body["status"] != 1:
    raise Exception("Submit rejected: " + body["request"])

# Hand the id to the next step.
output = {"captcha_id": body["request"]}

Если отправку отклонили, лучше всего бросить исключение. Zapier помечает запуск как ошибочный и показывает сообщение в истории Zap, и это лучше, чем тащить строку с ошибкой дальше по цепочке и обнаружить её через три шага.

Шаг 2: задержка, затем опрос токена

Добавьте шаг Delay by Zapier и задайте Delay For с небольшим интервалом. Для reCAPTCHA v2 разумный минимум составляет двадцать секунд, потому что более ранний опрос просто возвращает CAPCHA_NOT_READY и сжигает бюджет вашего шага Code на запросы, которые изначально не могли сработать.

Затем добавьте второй шаг Code, который опрашивает результат. Держите цикл коротким: несколько попыток со сном между ними укладываются в 30 секунд, а если ответ к этому моменту не готов, Zap завершится ошибкой и можно включить Autoreplay вместо того, чтобы сидеть в длинном цикле.

# Code by Zapier, Python. Second step, after Delay For 20 seconds.
import time

SOLVER = "http://YOUR_SERVER_IP:8080"
params = {
    "key": input_data["api_key"],
    "action": "get",
    "id": input_data["captcha_id"],
    "json": 1,
}

token = None
# Five tries at 5s stays inside a 30 second step.
for _ in range(5):
    body = requests.get(SOLVER + "/res.php", params=params).json()
    if body["status"] == 1:
        token = body["request"]
        break
    if body["request"] != "CAPCHA_NOT_READY":
        raise Exception(body["request"])
    time.sleep(5)

if not token:
    raise Exception("Not solved yet. Lengthen the delay ahead of this step.")

output = {"token": token}

CAPCHA_NOT_READY пишется без T, и это написание самого API, а не опечатка в этой статье. Любой другой ответ означает настоящую ошибку и должен останавливать Zap. Полный список приведён в документации CapSkip API.

Вариант в один шаг

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

Одно предостережение против огромного окна: у решённого токена есть свой ограниченный срок жизни. Токен reCAPTCHA одноразовый и перестаёт приниматься примерно через две минуты, поэтому Zap, который решил капчу и потом пять минут простоял в очереди, отправит то, что сайт уже не принимает. Пост про срок жизни токена разбирает точные цифры. Решайте капчу как можно позже в цепочке Zap и ставьте шаг, который использует токен, сразу за ней.

Вариант с Webhooks by Zapier

Отправку можно сделать через Webhooks by Zapier и вообще без кода. Выберите Custom Request или POST, укажите /in.php, и отправьте те же поля как данные формы. Ответ приходит в виде {"status": 1, "request": "<id>"} и Zapier разбирает его на поля, которые можно передавать дальше.

{
  "key": "YOUR_API_KEY",
  "method": "userrecaptcha",
  "googlekey": "YOUR_SITEKEY",
  "pageurl": "https://example.com/page-with-recaptcha",
  "json": 1
}

Неудобства начинаются на опросе. Вебхук делает один запрос, поэтому нужны Delay и Filter, чтобы понять, пришёл ли ответ, а вернуться назад и повторить попытку Zap просто так не умеет. Шаг Code для этой половины читается лучше. Используйте Webhooks для отправки, если вам приятнее кликать, чем печатать, а для опроса в любом случае берите Code.

Частые ошибки и что они означают

Что вы видитеПричинаИсправить
Ваш код превысил время выполненияОтправка и опрос в одном шаге при потолке 10 или 30 секундРазделите на два шага с Delay или включите расширенное время выполнения
Отказ в соединении или зависший запросШаг обращается к 127.0.0.1, а это собственный контейнер ZapierПереведите решатель в режим Server и используйте его публичный IP
ERROR_KEY_DOES_NOT_EXISTПроверка ключа включена, а ключ этого Zap не зарегистрированВыдайте ключ для этого Zap в настройках приложения
CAPCHA_NOT_READY на каждой попыткеОпрос начат слишком рано или цикл слишком короткийУвеличьте Delay перед шагом опроса
ERROR_GOOGLEKEYПоле sitekey пришло из триггера пустымПроверьте привязку в полях ввода шага
Целевой сайт отклонил токенОн устарел между решением и использованиемПеренесите решение ближе к шагу, который его отправляет

FAQ

Можно ли установить CapSkip SDK в шаге Code?

Нет. Code by Zapier работает в песочнице с фиксированным набором библиотек и без установки пакетов, поэтому SDK для Python и Node отпадают. Зато библиотека requests в комплекте есть, а API совместим с 2captcha и состоит из двух эндпоинтов, так что код выше делает всё то же, что сделал бы SDK. Если часть вашего пайплайна работает там, где вы всё контролируете, на странице SDK для распознавания капчи описаны четыре официальных клиента.

Zapier работает в облаке. Как он достучится до решателя на моей машине?

Через режим Server. Решатель привязывается к вашему сетевому или публичному IP вместо адреса обратной петли, и Zapier обращается к нему как к любому публичному API. Дайте ему статический публичный IP, чтобы адрес в вашем Zap оставался рабочим, включите проверку ключа до того, как откроете порт, и выдайте этому Zap собственный ключ.

Какой длины делать шаг Delay?

Начните с 20 секунд для reCAPTCHA v2 и примерно с 5 для GeeTest. Картиночные капчи возвращаются достаточно быстро, чтобы одного шага с опросом раз в секунду обычно хватало. Больше не значит безопаснее, потому что токен начинает стареть с момента выдачи, поэтому уменьшайте задержку, пока не появятся редкие повторы, а не увеличивайте её до полного их отсутствия.

Что выбрать для этого, Zapier или инструмент на своём хостинге?

Zapier подходит, когда остальной рабочий процесс уже живёт там. Если основная работа как раз с капчей, инструмент на собственном хостинге вообще снимает потолок времени выполнения и может общаться с решателем по внутреннему адресу. Разбор n8n описывает такую схему, а у его узла Wait подобного ограничения нет.

Коротко

Запустите решатель в режиме Server, чтобы Zapier мог до него достучаться, отправляйте задачу в одном шаге Code, ставьте задержку около 20 секунд и опрашивайте во втором. Включите расширенное время выполнения, если хотите обойтись одним шагом. Держите всю конструкцию компактной, потому что токен истекает задолго до того, как истечёт история вашего Zap. Расходы не меняются, какую бы схему вы ни выбрали: распознавание капчи на машине, которой вы уже владеете, не берёт плату за каждое решение, поэтому Zap, срабатывающий четыреста раз в день, стоит ровно столько же, сколько срабатывающий четыре раза.