Integrations

Power Automate + CaptchaAI: решение CAPTCHA Microsoft Flow

В Power Automate нет отдельного коннектора для CAPTCHA — эту задачу закрывает обычное HTTP-действие. Оно отправляет параметры задачи в API CaptchaAI, дожидается решения в цикле опроса и передаёт готовый токен дальше по потоку, туда, где раньше требовалась ручная отправка формы. Дальше — как собрать это в самом Power Automate: от ручного триггера с sitekey и pageurl до POST-запроса с решённым токеном reCAPTCHA v2.

Когда это нужно: сценарий с порталом поставщика

Финансовому отделу логистической компании, работающей с поставщиками в СНГ и Европе, нужно ежедневно выгружать данные с портала поставщика, закрытого reCAPTCHA v2. Ручная проверка отнимает время у сотрудников и не масштабируется на несколько поставщиков сразу. Поток Power Automate забирает у триггера параметры CAPTCHA (sitekey, pageurl), отправляет их в CaptchaAI, дожидается решения в цикле опроса, а затем использует токен, чтобы авторизоваться на портале и забрать данные — без участия человека.

При таком объёме одного потока обычно достаточно тарифа BASIC ($15/мес, 5 потоков) — этого хватает на параллельный опрос нескольких запущенных экземпляров Power Automate. При росте числа поставщиков логично перейти на STANDARD ($30/мес, 15 потоков).

Если сценарий затрагивает персональные данные, заранее сверьтесь, какие данные вы вправе обрабатывать, — в том числе с точки зрения 152-ФЗ для российских юрлиц.

Шаг 1. Создайте поток Power Automate

В Power Automate создайте Мгновенный облачный поток на основе Ручного триггера — подойдёт и любой другой триггер, если он передаёт нужные параметры дальше по сценарию.

Добавьте входные параметры в триггер

Добавьте в ручной триггер два текстовых поля:

  • sitekey — sitekey reCAPTCHA v2 со страницы с формой;
  • pageurl — адрес страницы, на которой показывается CAPTCHA.

Шаг 2. Отправьте задачу в CaptchaAI

Добавьте действие HTTP (доступно в Premium-коннекторе):

  • Метод: GET
  • URI: https://ocr.captchaai.com/in.php

Query-параметры запроса:

  • key — ваш API-ключ CaptchaAI;
  • methoduserrecaptcha;
  • googlekey@{triggerBody()['text']} (значение sitekey из триггера);
  • pageurl@{triggerBody()['text_1']} (значение pageurl из триггера);
  • json1.

Разберите ответ. После действия HTTP добавьте действие Parse JSON:

Схема:

{
  "type": "object",
  "properties": {
    "status": { "type": "integer" },
    "request": { "type": "string" }
  }
}

Содержимое: @{body('HTTP')}

Шаг 3. Проверьте, что задача принята

Добавьте действие Условие:

  • условие: @{body('Parse_JSON')?['status']} равно 1.

Если нет (CaptchaAI не принял задачу):

  • добавьте действие Завершить со статусом «Сбой» и сообщением Submit error: @{body('Parse_JSON')?['request']}.

Если да — переходите к циклу опроса.

Шаг 4. Постройте цикл опроса

Внутри ветки «Да» добавьте цикл Do Until.

Условие выхода из цикла: @{variables('solveStatus')} не равно pending.

Перед циклом инициализируйте две переменные:

  • solveStatus (строка) = pending;
  • solvedToken (строка) = пусто.

Внутри цикла Do Until добавьте по порядку четыре действия:

  1. Задержка (Delay) — 5 секунд, чтобы не долбить res.php слишком часто.
  2. HTTP — опрос результатаGET на https://ocr.captchaai.com/res.php с query-параметрами key (API-ключ CaptchaAI), action = get, id = @{body('Parse_JSON')?['request']}, json = 1.
  3. Parse JSON — ответ опроса — та же схема, что и в шаге 2.
  4. Условие — проверка статуса@{body('Parse_JSON_2')?['status']} равно 1? Если да (решено) — установите solvedToken = @{body('Parse_JSON_2')?['request']} и solveStatus = solved. Если нет — добавьте ещё одно условие: @{body('Parse_JSON_2')?['request']} не равно CAPCHA_NOT_READY; истина означает реальную ошибку (solveStatus = error), ложь — что решение ещё не готово, и цикл продолжится без изменений.

Ограничьте цикл Do Until:

  • количество итераций: 20;
  • тайм-аут: PT3M (3 минуты).

Шаг 5. Отправьте решённый токен

После цикла добавьте действие Условие по значению @{variables('solveStatus')}.

Если равно solved:

  • используйте @{variables('solvedToken')} в HTTP POST для отправки формы;
  • либо передайте его дальше — по email, в Teams или через любой другой коннектор.

Пример HTTP POST для отправки формы:

  • Метод: POST
  • URI: адрес целевой формы
  • Тело: {"g-recaptcha-response": "@{variables('solvedToken')}", "other_field": "value"}

Если статус не solved:

  • отправьте уведомление об ошибке в Teams или по email.

Целиком собранный поток выглядит так:

[Manual Trigger (sitekey, pageurl)]
    ↓
[Initialize Variables: solveStatus, solvedToken]
    ↓
[HTTP: Submit to CaptchaAI /in.php]
    ↓
[Parse JSON]
    ↓
[Condition: status = 1?]
    ↓ Yes
[Do Until: solveStatus ≠ pending]
    ├── [Delay: 5 seconds]
    ├── [HTTP: Poll CaptchaAI /res.php]
    ├── [Parse JSON]
    └── [Condition: Solved or Error?]
    ↓
[Condition: solveStatus = solved?]
    ↓ Yes
[HTTP: Submit form with token]
    ↓
[Compose: Success response]

Частые вопросы

Как понять, что reCAPTCHA не решилась, а не что поток просто завис?

Ориентируйтесь на поле request из ответа res.php: значение CAPCHA_NOT_READY означает, что решение ещё не готово и цикл должен продолжаться, а любое другое значение при status = 0 — это код реальной ошибки, и цикл должен завершиться с solveStatus = error.

Что делать, если Do Until укладывается в тайм-аут раньше, чем CaptchaAI успевает решить задачу?

reCAPTCHA v2 обычно решается за секунды, но при нагрузке на очередь решение может занять больше времени. Если лимита PT3M и 20 итераций не хватает, увеличьте оба значения — задержку между опросами лучше оставить не меньше 5 секунд, чтобы не создавать лишнюю нагрузку на res.php.

Нужна ли лицензия Power Automate Premium?

Да — действие HTTP относится к Premium-коннекторам. Если у вас бесплатный план, используйте собственный (custom) коннектор или разверните вызов через Azure Functions.

Как безопасно хранить API-ключ CaptchaAI в потоке?

Не прописывайте ключ прямо в действии HTTP. Вынесите его в переменные среды (Environment Variables) Power Automate или подключите коннектор Azure Key Vault — так ключ не попадёт в определение потока и в историю изменений.

Сколько потоков CaptchaAI нужно для параллельных запусков Power Automate?

Каждый одновременно выполняющийся экземпляр потока, ожидающий решения, занимает один поток CaptchaAI. Для одного-двух потоков Power Automate хватает тарифа BASIC ($15/мес, 5 потоков); при регулярном параллельном запуске 10+ экземпляров разумнее сразу взять ADVANCE ($90/мес, 50 потоков).

Поиск неисправностей

Пять типичных проблем при первой сборке потока:

  • Действие HTTP недоступно — в бесплатном плане нет Premium-коннекторов; перейдите на Power Automate Premium или используйте собственный (custom) коннектор.
  • Parse JSON выдаёт ошибку — тело ответа приходит как текст, а не JSON; проверьте, что в query-параметрах передан json=1.
  • Цикл крутится бесконечно — переменная solveStatus не обновляется; сверьте имена переменных в действиях Set Variable, они должны совпадать буквально.
  • Ошибка 403 от CaptchaAI — ограничение по IP или неверный API-ключ; проверьте ключ и убедитесь, включён ли whitelisting по IP в аккаунте.
  • Поток завершается по тайм-ауту — отдельные действия по умолчанию ограничены 2 минутами; тайм-аут Do Until (PT3M) уже это учитывает, при необходимости увеличьте лимит.

Следующие шаги

Комментарии для этой статьи отключены.