How to use token
После того как getTaskResult вернул status: "ready" и решение в solution, токен нужно доставить на сайт. Ниже способы доставки разделены по типу капчи. Coordinates (CoordinatesTask) здесь не рассматривается - он возвращает координаты клика, а не токен, поэтому доставлять на страницу нечего: вы (или ваша автоматизация) кликаете по картинке в этих координатах.
Важно: наш сервис предоставляет только решение капчи — сам токен (или, в случае GeeTest, набор значений validate/seccode/captcha_output). Способ, которым этот токен нужно передать на целевой сайт, лежит полностью на стороне заказчика: у каждого сайта своя реализация — где-то это скрытое поле формы, где-то callback-функция, где-то оба варианта сразу или что-то ещё более нестандартное. Мы не можем заранее знать, как конкретный сайт ожидает получить токен, поэтому подходящий способ доставки нужно определять самостоятельно — как правило, через анализ разметки страницы и вкладку Network в инструментах разработчика при ручном прохождении капчи. Ниже — только наиболее распространённые варианты для каждого типа капчи, но на конкретном сайте может быть реализовано иначе.
reCAPTCHA v2 / v3#
Для reCAPTCHA v2 и v3 используются:
| Способ | Что используется |
|---|---|
| Скрытое поле формы | g-recaptcha-response |
| JS-объект/callback | grecaptcha.getResponse() заменяется значением токена; либо вызывается callback, заданный в data-callback |
Способ 1 — через скрытое поле формы#
Большинство сайтов кладут токен в скрытый <input> внутри формы и просто отправляют форму. Найдите соответствующее поле в DOM и подставьте значение перед сабмитом:
<textarea id="g-recaptcha-response" name="g-recaptcha-response"></textarea>
document.querySelector('#g-recaptcha-response').value = 'ТОКЕН_ИЗ_SOLUTION';
document.querySelector('form').submit();
Способ 2 — через callback-функцию#
Если виджет инициализирован с data-callback (или JS-параметром callback в grecaptcha.render()), сайт ожидает не сабмит формы, а вызов этой функции с токеном в качестве аргумента. Имя функции у каждого сайта своё — его нужно смотреть в разметке (data-callback="onCaptchaSolved") или в JS-инициализации виджета:
// reCAPTCHA v2/v3 с callback
onCaptchaSolved('ТОКЕН_ИЗ_SOLUTION');
Перед тем как выбирать способ, откройте вкладку Network в инструментах разработчика браузера и пройдите капчу вручную — это покажет, отправляется ли токен как поле формы (POST с g-recaptcha-response в теле) или передаётся в JS-callback без явной отправки формы.
Cloudflare Turnstile#
Для Turnstile используются:
| Способ | Что используется |
|---|---|
| Скрытое поле формы | cf-turnstile-response |
| JS-объект/callback | callback, заданный в data-callback виджета Turnstile или в параметре callback объекта turnstile.render() |
Способ 1 — через скрытое поле формы#
Большинство сайтов кладут токен в скрытый <input> внутри формы и просто отправляют форму. Найдите соответствующее поле в DOM и подставьте значение перед сабмитом:
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
document.querySelector('#cf-turnstile-response').value = 'ТОКЕН_ИЗ_SOLUTION';
document.querySelector('form').submit();
Способ 2 — через callback-функцию#
Если виджет инициализирован с data-callback (или JS-параметром callback в turnstile.render()), сайт ожидает не сабмит формы, а вызов этой функции с токеном в качестве аргумента. Имя функции у каждого сайта своё — его нужно смотреть в разметке (data-callback="onTurnstileSolved") или в JS-инициализации виджета:
// Turnstile с callback
onTurnstileSolved('ТОКЕН_ИЗ_SOLUTION');
Перед тем как выбирать способ, откройте вкладку Network в инструментах разработчика браузера и пройдите капчу вручную — это покажет, отправляется ли токен как поле формы (POST с cf-turnstile-response в теле) или передаётся в JS-callback без явной отправки формы.
Yandex SmartCaptcha#
Для Yandex SmartCaptcha используются:
| Способ | Что используется |
|---|---|
| Скрытое поле формы | smart-token |
| JS-объект/callback | callback, заданный в параметре callback объекта window.smartCaptcha.render() |
Способ 1 — через скрытое поле формы#
Большинство сайтов кладут токен в скрытый <input> внутри формы и просто отправляют форму. Найдите соответствующее поле в DOM и подставьте значение перед сабмитом:
<input type="hidden" name="smart-token" id="smart-token">
document.querySelector('#smart-token').value = 'ТОКЕН_ИЗ_SOLUTION';
document.querySelector('form').submit();
Способ 2 — через callback-функцию#
Если виджет инициализирован с параметром callback в window.smartCaptcha.render(), сайт ожидает не сабмит формы, а вызов этой функции с токеном в качестве аргумента. Имя функции у каждого сайта своё — смотрите его в JS-инициализации виджета на странице:
// Yandex SmartCaptcha с callback
onSmartCaptchaSolved('ТОКЕН_ИЗ_SOLUTION');
Перед тем как выбирать способ, откройте вкладку Network в инструментах разработчика браузера и пройдите капчу вручную — это покажет, отправляется ли токен как поле формы (POST с smart-token в теле) или передаётся в JS-callback без явной отправки формы.
GeeTest v3#
Виджет v3 инициализируется через initGeetest, а после прохождения капчи обычно вызывается метод onSuccess объекта капчи, из которого забирается результат методом getValidate(). Чтобы подставить решение с нашего сервиса, нужно перехватить объект капчи на этапе инициализации и вызвать onSuccess вручную, подменив getValidate() так, чтобы он возвращал значения из solution:
// Пример перехвата инициализации GeeTest v3
window.initGeetest = ((original) => (config, callback) => {
original(config, (captchaObj) => {
captchaObj.getValidate = () => ({
geetest_challenge: 'ЗНАЧЕНИЕ_challenge_ИЗ_SOLUTION',
geetest_validate: 'ЗНАЧЕНИЕ_validate_ИЗ_SOLUTION',
geetest_seccode: 'ЗНАЧЕНИЕ_seccode_ИЗ_SOLUTION'
});
callback(captchaObj);
});
})(window.initGeetest);
Точное имя callback-метода и структура объекта капчи зависят от того, как конкретный сайт обернул стандартный виджет GeeTest — ориентируйтесь на разметку и код инициализации на странице.
GeeTest v4#
Виджет v4 инициализируется через initGeetest4, а результат прохождения передаётся в callback (обычно onSuccess) в виде объекта с полями lot_number, pass_token, gen_time, captcha_output. Аналогично v3, чтобы использовать решение с нашего сервиса, нужно перехватить инициализацию и подменить возвращаемый результат значениями из solution:
// Пример перехвата инициализации GeeTest v4
window.initGeetest4 = ((original) => (config, callback) => {
original(config, (captchaObj) => {
captchaObj.onSuccess = () => {
callback({
lot_number: 'ЗНАЧЕНИЕ_lot_number_ИЗ_SOLUTION',
pass_token: 'ЗНАЧЕНИЕ_pass_token_ИЗ_SOLUTION',
gen_time: 'ЗНАЧЕНИЕ_gen_time_ИЗ_SOLUTION',
captcha_output: 'ЗНАЧЕНИЕ_captcha_output_ИЗ_SOLUTION'
});
};
});
})(window.initGeetest4);
Как и в остальных случаях, конкретная реализация зависит от сайта: часть сайтов ожидает эти значения в скрытых полях формы перед сабмитом, часть — только через callback. Проверяйте оба варианта через Network и код страницы, прежде чем выбирать способ.
Tencent#
Виджет инициализируется через конструктор TencentCaptcha, а результат доставляется в callback-функцию, переданную вторым аргументом:
new TencentCaptcha(CaptchaAppId, myCallbackFunction, options);
Чтобы подставить решение с нашего сервиса, вызовите эту же callback-функцию с объектом, собранным из полей solution (ret, ticket, randstr, appid):
myCallbackFunction({
ret: 'ЗНАЧЕНИЕ_ret_ИЗ_SOLUTION',
ticket: 'ЗНАЧЕНИЕ_ticket_ИЗ_SOLUTION',
randstr: 'ЗНАЧЕНИЕ_randstr_ИЗ_SOLUTION',
appid: 'ЗНАЧЕНИЕ_appid_ИЗ_SOLUTION'
});
Имя callback-функции задаёт сайт (myCallbackFunction выше — просто пример, например new TencentCaptcha('190014885', myCallbackFunction, {})) — смотрите его в коде инициализации капчи на странице. Обычно эта функция используется для отправки запроса на верификацию на бэкенд сайта.