Эта статья была полезной?
Как обойти Yidun (NetEase) капчу на сайте Weibo
Технический специалист
Страница авторизации Weibo (passport.weibo.com) защищена капчей Yidun (также известной как NetEase Captcha). Главная особенность этой капчи заключается в том, что она появляется только при попытке входа в систему, а параметры для её решения (особенно URL) являются динамическими и меняются при каждой новой сессии.
Для успешного решения критически важно извлечь актуальные параметры из сетевого запроса в момент появления капчи и убедиться, что параметр userAgent в запросе к API точно совпадает с userAgent вашего браузера.
Параметры задачи
Для решения используется тип задачи YidunTaskProxyless.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| type | String | Да | Должен быть установлен в YidunTaskProxyless |
| websiteURL | String | Да | Полный URL страницы, где находится капча (декодированное значение параметра referer) |
| websiteKey | String | Да | Идентификатор капчи (значение параметра id из запроса) |
| userAgent | String | Да | User-Agent браузера. Должен точно совпадать с тем, который используется для загрузки страницы |
Как найти параметры
Поскольку параметры динамические, их необходимо перехватывать в реальном времени.
- Откройте страницу входа Weibo: https://passport.weibo.com/sso/signin
- Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Сеть (Network).
- Включите сохранение логов (Preserve log).
- Введите любые тестовые данные (логин/пароль) и нажмите кнопку входа, чтобы спровоцировать появление капчи.
- В фильтре вкладки Сеть введите dun.163.com.
- Найдите GET-запрос, начинающийся с get?referer= или check?referer=. Он будет выглядеть примерно так:
https://c.dun.163.com/api/v3/get?referer=https%3A%2F%2Fpassport.weibo.com%2Fsso%2Fsignin&zoneId=CN31&...&id=7cda0ba2785647ada4d6e946ddb2d465&... - Найдите в этом запросе параметр referer. Его значение закодировано (URL-encoded). Декодируйте его (например, https%3A%2F%2Fpassport.weibo.com%2Fsso%2Fsignin превратится в https://passport.weibo.com/sso/signin). Это и есть ваш websiteURL.
- Найдите в том же запросе параметр id. Его значение (например, 7cda0ba2785647ada4d6e946ddb2d465) является вашим websiteKey.
Примеры кода
Python + requests
Пример отправки задачи с заранее известными параметрами.
python
import requests
import time
import urllib.parse
API_KEY = 'ВАШ_API_КЛЮЧ'
# Декодированный URL из параметра referer
WEBSITE_URL = 'https://passport.weibo.com/sso/signin?entry=miniblog&source=miniblog'
WEBSITE_KEY = '7cda0ba2785647ada4d6e946ddb2d465'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
url = 'https://api.2captcha.com/createTask'
headers = {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
}
payload = {
"clientKey": API_KEY,
"task": {
"type": "YidunTaskProxyless",
"websiteURL": WEBSITE_URL,
"websiteKey": WEBSITE_KEY,
"userAgent": USER_AGENT
}
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
if result.get('errorId') == 0:
task_id = result.get('taskId')
print(f"Задача создана, ID: {task_id}")
res_url = 'https://api.2captcha.com/getTaskResult'
while True:
time.sleep(5)
res_payload = {
"clientKey": API_KEY,
"taskId": task_id
}
res_response = requests.post(res_url, headers=headers, json=res_payload).json()
if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
print("Капча успешно решена!")
token = res_response['solution']['validate']
print(f"Токен: {token}")
break
elif res_response.get('errorId') != 0:
print(f"Ошибка: {res_response.get('errorDescription')}")
break
else:
print(f"Ошибка создания задачи: {result.get('errorDescription')}")
Python + Playwright
Пример автоматизации, который динамически перехватывает запрос, извлекает параметры, решает капчу и внедряет токен.
python
from playwright.sync_api import sync_playwright
import requests
import time
import urllib.parse
API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://passport.weibo.com/sso/signin'
def solve_weibo_yidun():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
# Важно: устанавливаем конкретный User-Agent, чтобы передать его в API
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
context = browser.new_context(user_agent=user_agent)
page = context.new_page()
captured_params = {}
# Перехватываем запрос к Yidun для извлечения параметров
def handle_request(request):
if 'c.dun.163.com/api/v3/get' in request.url or 'c.dun.163.com/api/v3/check' in request.url:
parsed = urllib.parse.urlparse(request.url)
params = urllib.parse.parse_qs(parsed.query)
if 'referer' in params:
captured_params['websiteURL'] = urllib.parse.unquote(params['referer'][0])
if 'id' in params:
captured_params['websiteKey'] = params['id'][0]
page.on('request', handle_request)
try:
page.goto(TARGET_URL)
# Выполняем действие, вызывающее капчу (например, ввод данных и клик)
# page.fill('input[name="username"]', 'testuser')
# page.fill('input[name="password"]', 'testpass')
# page.click('a[node-type="submitBtn"]')
# Ожидаем появления запроса к Yidun
page.wait_for_timeout(5000)
if 'websiteURL' not in captured_params or 'websiteKey' not in captured_params:
raise Exception("Не удалось перехватить параметры Yidun. Проверьте действия на странице.")
print(f"URL: {captured_params['websiteURL']}")
print(f"Key: {captured_params['websiteKey']}")
# Отправка в API
api_url = 'https://api.2captcha.com/createTask'
headers = {'Content-Type': 'application/json', 'X-API-Key': API_KEY}
payload = {
"clientKey": API_KEY,
"task": {
"type": "YidunTaskProxyless",
"websiteURL": captured_params['websiteURL'],
"websiteKey": captured_params['websiteKey'],
"userAgent": user_agent
}
}
task_response = requests.post(api_url, headers=headers, json=payload).json()
task_id = task_response.get('taskId')
# Ожидание решения
res_url = 'https://api.2captcha.com/getTaskResult'
token = None
for _ in range(20):
time.sleep(5)
res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
if res.get('status') == 'ready':
token = res['solution']['validate']
break
if res.get('errorId') != 0:
print(f"Ошибка API: {res.get('errorDescription')}")
break
if token:
print(f"Токен получен: {token}")
# Внедрение токена
page.evaluate(f"""
// Попытка найти скрытое поле
let input = document.querySelector('input[name="captchaValidate"], input[name="NECaptchaValidate"], input[name="token"]');
if (!input) {{
input = document.createElement('input');
input.type = 'hidden';
input.name = 'captchaValidate';
document.querySelector('form')?.appendChild(input);
}}
input.value = "{token}";
""")
print("Токен внедрен в DOM.")
else:
print("Не удалось получить токен.")
except Exception as e:
print(f"Ошибка: {e}")
finally:
# browser.close()
if __name__ == '__main__':
solve_weibo_yidun()
Как использовать полученный токен
Точный механизм внедрения токена Yidun на Weibo может обновляться, но существуют два основных проверенных способа:
- Внедрение в скрытое поле формы: Как показано в примере выше, сайт часто ожидает токен в скрытом input с именами captchaValidate, NECaptchaValidate или token.
- Перехват и модификация XHR-запроса (Наиболее надежный метод): Если форма отправляется через JavaScript, токен может не читаться из DOM. В этом случае лучше всего перехватить запрос на авторизацию с помощью page.route в Playwright и добавить токен в тело запроса (payload) перед его отправкой на сервер.
Отчеты о правильности решения
Если сайт отклонил полученный токен, обязательно сообщите об этом через метод reportIncorrect. Это помогает сервису улучшать алгоритмы распознавания и возвращает вам средства за нерешенную задачу. Если решение успешно прошло проверку, отправьте отчет reportCorrect.
python
import requests
API_KEY = "ВАШ_API_КЛЮЧ"
TASK_ID = "123456789" # ID задачи, полученный при создании
# Отчет о неверном решении
requests.post(
"https://api.2captcha.com/reportIncorrect",
json={"clientKey": API_KEY, "taskId": TASK_ID}
)
# Отчет о правильном решении
requests.post(
"https://api.2captcha.com/reportCorrect",
json={"clientKey": API_KEY, "taskId": TASK_ID}
)
Частые ошибки и решения
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| Ошибка валидации или бесконечная загрузка | Несовпадение userAgent в запросе API и в браузере. | Убедитесь, что строка userAgent в задаче API байт-в-байт совпадает с тем, что отправляет ваш браузер. |
| ERROR_INVALID_CAPTCHA_ID | Неверный websiteKey. | Убедитесь, что вы копируете значение параметра id, а не другого параметра из запроса. |
| Токен не принимается сайтом | Неверный способ внедрения или устаревший websiteURL. | Используйте перехват XHR-запроса (page.route) для добавления токена в payload, так как это самый надежный способ для современных форм входа. |
| Капча не появляется | Сайт не триггерит проверку. | Попробуйте использовать режим инкогнито, очистить куки или изменить IP-адрес, чтобы спровоцировать появление капчи. |
Полезные ссылки
- Документация API по Yidun (NetEase): https://2captcha.com/api-docs/yidun-necaptcha
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://2captcha.com/h?category=sites