Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как обойти 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 браузера. Должен точно совпадать с тем, который используется для загрузки страницы

Как найти параметры

Поскольку параметры динамические, их необходимо перехватывать в реальном времени.

  1. Откройте страницу входа Weibo: https://passport.weibo.com/sso/signin
  2. Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Сеть (Network).
  3. Включите сохранение логов (Preserve log).
  4. Введите любые тестовые данные (логин/пароль) и нажмите кнопку входа, чтобы спровоцировать появление капчи.
  5. В фильтре вкладки Сеть введите dun.163.com.
  6. Найдите 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&...
  7. Найдите в этом запросе параметр referer. Его значение закодировано (URL-encoded). Декодируйте его (например, https%3A%2F%2Fpassport.weibo.com%2Fsso%2Fsignin превратится в https://passport.weibo.com/sso/signin). Это и есть ваш websiteURL.
  8. Найдите в том же запросе параметр id. Его значение (например, 7cda0ba2785647ada4d6e946ddb2d465) является вашим websiteKey.

Примеры кода

Python + requests

Пример отправки задачи с заранее известными параметрами.

python Copy
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 Copy
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 может обновляться, но существуют два основных проверенных способа:

  1. Внедрение в скрытое поле формы: Как показано в примере выше, сайт часто ожидает токен в скрытом input с именами captchaValidate, NECaptchaValidate или token.
  2. Перехват и модификация XHR-запроса (Наиболее надежный метод): Если форма отправляется через JavaScript, токен может не читаться из DOM. В этом случае лучше всего перехватить запрос на авторизацию с помощью page.route в Playwright и добавить токен в тело запроса (payload) перед его отправкой на сервер.

Отчеты о правильности решения

Если сайт отклонил полученный токен, обязательно сообщите об этом через метод reportIncorrect. Это помогает сервису улучшать алгоритмы распознавания и возвращает вам средства за нерешенную задачу. Если решение успешно прошло проверку, отправьте отчет reportCorrect.

python Copy
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-адрес, чтобы спровоцировать появление капчи.

Полезные ссылки