Эта статья была полезной?
Как обойти reCAPTCHA на сайте reportcontent.google.com
Технический специалист
reportcontent.google.com — это формы жалоб Google: через них просят удалить из поиска личные данные, контент по праву на забвение, материалы с нарушением авторских прав и прочее. В конце такой формы стоит reCAPTCHA.
Важная деталь: это не обычная reCAPTCHA v2, а reCAPTCHA v2 Enterprise. С виду это та же галочка «Я не робот», но капча грузится через отдельный enterprise-скрипт Google. Для сервиса это значит одно: тип задачи должен быть RecaptchaV2EnterpriseTask, а не обычный reCAPTCHA v2. Токен возвращается в поле g-recaptcha-response и в функцию обратного вызова.
На главной reportcontent.google.com капчи нет: адрес переадресует на справку Google. А сама форма закрыта проверкой личности: пока вы не войдёте в аккаунт Google или не подтвердите адрес электронной почты, страница формы показывает экран входа и сообщение «Форма не найдена», и капчи в коде страницы нет вообще. После подтверждения почты форма открывается сразу по своему адресу, и капча появится там.
Параметры задачи
Для решения используется тип задачи RecaptchaV2EnterpriseTaskProxyless. Если нужно решать со своего адреса, берётся RecaptchaV2EnterpriseTask с данными прокси.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| type | String | Да | RecaptchaV2EnterpriseTaskProxyless или RecaptchaV2EnterpriseTask |
| websiteURL | String | Да | Адрес страницы с капчей, например https://reportcontent.google.com/forms/rtbf |
| websiteKey | String | Да | Sitekey reCAPTCHA. Лежит в атрибуте data-sitekey виджета и в параметре k запросов к reCAPTCHA |
| enterprisePayload | Object | Нет | Дополнительные параметры вызова grecaptcha.enterprise.render, например значение s. На форме жалобы у виджета задан атрибут data-action="form-submit", но передавать его в задаче не нужно: токен возвращается одинаково и с payload, и без него |
| isInvisible | Boolean | Нет | true для невидимой версии. На форме жалобы капча с галочкой, поэтому false |
| userAgent | String | Нет | User-Agent браузера, которым открыта страница |
| cookies | String | Нет | Cookie в формате key1=val1; key2=val2. Пригодятся для сервисов Google |
| apiDomain | String | Нет | Домен загрузки капчи: google.com или recaptcha.net. По умолчанию google.com |
Для типа RecaptchaV2EnterpriseTask добавляются proxyType, proxyAddress, proxyPort, proxyLogin и proxyPassword.
Как найти параметры
Сначала нужно открыть саму форму. Зайдите на страницу нужной формы жалобы и пройдите проверку личности: войдите в аккаунт Google или укажите адрес электронной почты и подтвердите его. До этого момента форма не показывается, и капчи на странице нет. После подтверждения открывается сама форма — её адрес и передаётся в websiteURL.
Дальше нажмите F12 и на вкладке Elements найдите элемент виджета. Важно: смотреть надо именно через F12, а не через «Просмотр кода страницы» — виджет создаётся скриптом уже после загрузки, в исходнике его нет. В DOM это выглядит так: сначала служебный элемент captcha-widget с настройками, внутри него — обычный контейнер капчи.
html
<captcha-widget data-sitekey="6LeVK0AhAAAAAAM8ccCAZcaNBQbJQ-iZiZQxyG4h"
data-callback="onRecaptcha"
data-action="form-submit"
data-version="v2">
<div class="g-recaptcha" data-sitekey="6LeVK0AhAAAAAAM8ccCAZcaNBQbJQ-iZiZQxyG4h"
data-callback="onRecaptcha"></div>
</captcha-widget>
Sitekey лежит в атрибуте data-sitekey — он одинаковый на обоих элементах. Тот же ключ виден на вкладке «Сеть» (Network): отфильтруйте запросы по recaptcha и посмотрите параметр k у запросов к анкеру капчи.
Здесь же проверяется, что версия именно Enterprise. Посмотрите путь запросов капчи: у Enterprise они идут через /recaptcha/enterprise/anchor и /recaptcha/enterprise/bframe, а скрипт загружается как /recaptcha/enterprise.js. Если бы вместо этого грузился /recaptcha/api.js и /recaptcha/api2/anchor, это была бы обычная reCAPTCHA v2.
Одна тонкость. Если открыть исходник страницы и поискать ключи по всему коду, их найдётся три, и легко взять не тот. Кроме ключа галочки там лежат recaptcha_enterprise_elevated_key (усиленная проверка) и recaptcha_enterprise_qr_mobile_key (проверка через QR на телефоне) — это другие сценарии, в задачу их слать не нужно. В разметку страница подставляет всегда только один ключ — тот, который соответствует включённому режиму проверки, и именно он уходит в оба iframe капчи (enterprise/anchor и enterprise/bframe). Поэтому надёжный способ не ошибиться простой: брать значение из атрибута data-sitekey у виджета, а не искать ключи поиском по исходнику.
И ещё: reportcontent.google.com объединяет несколько форм жалоб, и на разных формах ключ галочки может отличаться. Поэтому читайте его со страницы, с которой создаёте задачу, а не переносите из другой формы.
Примеры кода
Python + requests (API v2)
Отправка задачи и опрос результата без дополнительных библиотек. Sitekey и адрес подставьте те, что сняли со своей формы.
python
import time
import requests
API_KEY = "ВАШ_API_КЛЮЧ"
WEBSITE_URL = "https://reportcontent.google.com/forms/rtbf"
WEBSITE_KEY = "6LeVK0AhAAAAAAM8ccCAZcaNBQbJQ-iZiZQxyG4h"
task = {
"type": "RecaptchaV2EnterpriseTaskProxyless",
"websiteURL": WEBSITE_URL,
"websiteKey": WEBSITE_KEY,
"isInvisible": False,
}
created = requests.post(
"https://api.rucaptcha.com/createTask",
json={"clientKey": API_KEY, "task": task},
timeout=30,
).json()
if created.get("errorId") != 0:
raise RuntimeError(f"Задача не создана: {created}")
task_id = created["taskId"]
print("Задача создана, id", task_id)
for _ in range(24):
time.sleep(5)
result = requests.post(
"https://api.rucaptcha.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id},
timeout=30,
).json()
if result.get("errorId") != 0:
raise RuntimeError(f"Ошибка: {result}")
if result.get("status") == "ready":
token = result["solution"]["token"]
print("Токен получен:", token[:30], "…")
break
else:
raise RuntimeError("Решение не пришло за отведённое время")
Токен reCAPTCHA — длинная строка, обычно начинается с 03 или 0c. Его нужно передать странице, как показано ниже.
Python + Playwright
Пример открывает форму, читает sitekey со страницы, отправляет задачу и передаёт токен обратно: записывает его в поле g-recaptcha-response и вызывает функцию обратного вызова, которую ждёт форма.
Учтите: браузер должен быть с уже пройденной проверкой личности. На чистом профиле Playwright форма не откроется, виджета на странице не будет, и ожидание селектора data-sitekey завершится по таймауту. Используйте профиль с сохранённой сессией Google (launch_persistent_context) либо сначала пройдите подтверждение почты в этом же браузере.
python
import os
import time
import requests
from playwright.sync_api import sync_playwright
API_KEY = os.getenv("APIKEY_RUCAPTCHA", "ВАШ_API_КЛЮЧ")
TARGET_URL = "https://reportcontent.google.com/forms/rtbf"
def solve(task):
created = requests.post(
"https://api.rucaptcha.com/createTask",
json={"clientKey": API_KEY, "task": task},
timeout=30,
).json()
if created.get("errorId") != 0:
raise RuntimeError(f"Задача не создана: {created}")
task_id = created["taskId"]
print("Задача создана, id", task_id)
for _ in range(24):
time.sleep(5)
result = requests.post(
"https://api.rucaptcha.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id},
timeout=30,
).json()
if result.get("errorId") != 0:
raise RuntimeError(f"Ошибка: {result}")
if result.get("status") == "ready":
return result["solution"]["token"]
raise RuntimeError("Решение не пришло за отведённое время")
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
page.goto(TARGET_URL)
page.wait_for_selector("[data-sitekey]", timeout=30000)
website_key = page.get_attribute("[data-sitekey]", "data-sitekey")
user_agent = page.evaluate("navigator.userAgent")
print("Sitekey со страницы:", website_key)
token = solve({
"type": "RecaptchaV2EnterpriseTaskProxyless",
"websiteURL": TARGET_URL,
"websiteKey": website_key,
"userAgent": user_agent,
"isInvisible": False,
})
print("Токен получен:", token[:30], "…")
page.evaluate("""(token) => {
const field = document.querySelector('textarea[name="g-recaptcha-response"]');
if (field) {
field.value = token;
}
if (typeof window.onRecaptcha === 'function') {
window.onRecaptcha(token);
}
}""", token)
print("Токен передан форме, дальше идёт отправка жалобы")
except Exception as e:
print(f"Ошибка: {e}")
finally:
browser.close()
Функция обратного вызова на форме reportcontent.google.com называется onRecaptcha. Её имя видно в атрибуте data-callback виджета. Если на вашей форме имя другое, поменяйте его в примере.
Как использовать полученный токен (Передача через callback)
Сервис возвращает решение в поле solution.token. Это и есть значение, которое обычно попадает в g-recaptcha-response, когда человек ставит галочку.
На форме жалобы одной записи в поле мало. Форма не отправляется сразу после капчи: она ждёт, когда сработает функция обратного вызова, и только тогда разблокирует отправку. Имя функции указано в атрибуте data-callback виджета. Поэтому токен нужно и записать в поле, и передать в эту функцию:
javascript
document.querySelector('textarea[name="g-recaptcha-response"]').value = "ПОЛУЧЕННЫЙ_ТОКЕН";
onRecaptcha("ПОЛУЧЕННЫЙ_ТОКЕН");
После этого заполняйте форму жалобы и отправляйте её обычным способом.
Частые ошибки и решения
| Ошибка или проблема | Причина | Решение |
|---|---|---|
| Сервис возвращает токен, но форма его не принимает | Использован обычный тип reCAPTCHA v2 вместо Enterprise | На этом сайте капча Enterprise. Берите тип RecaptchaV2EnterpriseTaskProxyless |
| Токен получен, но форма не отправляется | Токен только записан в поле, а функция обратного вызова не вызвана | Вызовите функцию из data-callback виджета, здесь это onRecaptcha |
| Форма с капчей не открывается, на странице написано «Форма не найдена» | Не пройдена проверка личности, форма и капча ещё не загружены | Войдите в аккаунт Google или подтвердите адрес электронной почты — после этого откроется форма с капчей |
| В коде страницы нет ни виджета, ни поля g-recaptcha-response | Смотрите исходник страницы, а виджет создаётся скриптом | Откройте DevTools (F12), вкладка Elements — там виджет виден |
| Токен долго не приходит или отклоняется | Задача решается на адресе сервиса, а форма проверяет совпадение IP | Используйте RecaptchaV2EnterpriseTask со своим прокси |
| Капча ведёт себя как невидимая, галочки нет | На конкретной форме включена невидимая версия | Передайте в задачу isInvisible со значением true |
Полный список кодов ошибок находится на странице «Коды ошибок», ссылка на неё ниже.
Полезные ссылки
- Документация API по reCAPTCHA v2 Enterprise: https://rucaptcha.com/api-docs/recaptcha-v2-enterprise
- Документация API по обычной reCAPTCHA v2: https://rucaptcha.com/api-docs/recaptcha-v2
- Как обойти reCAPTCHA Enterprise: https://rucaptcha.com/p/recaptcha_enterprise
- Песочница для тестирования API: https://rucaptcha.com/api-docs/debugging
- Работа с прокси: https://rucaptcha.com/api-docs/proxy
- Коды ошибок: https://rucaptcha.com/api-docs/error-codes
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://rucaptcha.com/h?category=sites