python3-anticaptcha/python3_anticaptcha/ReCaptchaV3TaskProxyless.py

193 lines
9.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
import asyncio
import requests
import aiohttp
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
MIN_SCORES = (0.3, 0.7, 0.9)
class ReCaptchaV3TaskProxyless:
def __init__(
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
):
"""
Модуль отвечает за решение ReCaptcha v3 без прокси
:param anticaptcha_key: Ключ антикапчи
:param sleep_time: Время ожидания решения капчи
:param callbackUrl: URL для решения капчи с ответом через callback
:param kwargs: Другие необязательные параметры из документации
"""
if sleep_time < 5:
raise ValueError(f"Param `sleep_time` must be less than 5. U send - {sleep_time}")
self.sleep_time = sleep_time
# Пайлоад для создания задачи
self.task_payload = {
"clientKey": anticaptcha_key,
"task": {"type": "RecaptchaV3TaskProxyless"},
"softId": app_key,
}
# задаём callbackUrl если передан
if callbackUrl:
self.task_payload.update({"callbackUrl": callbackUrl})
# Пайлоад для получения результата
self.result_payload = {"clientKey": anticaptcha_key}
# Если переданы ещё параметры - вносим их в payload
if kwargs:
for key in kwargs:
self.task_payload["task"].update({key: kwargs[key]})
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
return False
return True
# Работа с капчёй
def captcha_handler(
self, websiteURL: str, websiteKey: str, minScore: float, pageAction: str, **kwargs
) -> dict:
"""
Метод решения ReCaptcha V3
:param websiteURL: Ссылка на страницу с капчёй
:param websiteKey: Ключ-индентификатор рекапчи на целевой странице. Берется из HTML этой страницы.
:param minScore: Определяет фильтр, по которому отбирается работник с нужным минимальным score.
:param pageAction: Значение параметра action, которое передается виджетом рекапчи в гугл,
и которое потом видит владелец сайта при проверке токена.
:param kwargs: Дополнительные параметры для `requests.post`, который отправляет даныйе на решение.
:return: Возвращает ответ сервера в виде JSON-строки
"""
if minScore not in MIN_SCORES:
raise ValueError(
f"Wrong `minScore` param - {minScore}, available params - {MIN_SCORES};"
)
# вставляем в пайлоад адрес страницы и ключ-индентификатор рекапчи
self.task_payload["task"].update(
{
"websiteURL": websiteURL,
"websiteKey": websiteKey,
"minScore": minScore,
"pageAction": pageAction,
}
)
# Отправляем на антикапчу пайлоад
# в результате получаем JSON ответ содержащий номер решаемой капчи
captcha_id = requests.post(create_task_url, json=self.task_payload, **kwargs).json()
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
if captcha_id["errorId"] == 0:
captcha_id = captcha_id["taskId"]
self.result_payload.update({"taskId": captcha_id})
else:
return captcha_id
# если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
if self.task_payload.get("callbackUrl"):
return self.result_payload
else:
# Ожидаем решения капчи
time.sleep(self.sleep_time)
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
class aioReCaptchaV3TaskProxyless:
def __init__(
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
):
"""
Модуль отвечает за решение ReCaptcha V3 без прокси
:param anticaptcha_key: Ключ антикапчи
:param sleep_time: Время ожидания решения капчи
:param callbackUrl: URL для решения капчи с ответом через callback
:param kwargs: Другие необязательные параметры из документации
"""
if sleep_time < 5:
raise ValueError(f"Param `sleep_time` must be less than 5. U send - {sleep_time}")
self.sleep_time = sleep_time
# Пайлоад для создания задачи
self.task_payload = {
"clientKey": anticaptcha_key,
"task": {"type": "RecaptchaV3TaskProxyless"},
"softId": app_key,
}
# задаём callbackUrl если передан
if callbackUrl:
self.task_payload.update({"callbackUrl": callbackUrl})
# Пайлоад для получения результата
self.result_payload = {"clientKey": anticaptcha_key}
# Если переданы ещё параметры - вносим их в payload
if kwargs:
for key in kwargs:
self.task_payload["task"].update({key: kwargs[key]})
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
return False
return True
# Работа с капчёй
async def captcha_handler(
self, websiteURL: str, websiteKey: str, minScore: float, pageAction: str
) -> dict:
"""
Метод решения ReCaptcha V3
:param websiteURL: Ссылка на страницу с капчёй
:param websiteKey: Ключ-индентификатор рекапчи на целевой странице. Берется из HTML этой страницы.
:param minScore: Определяет фильтр, по которому отбирается работник с нужным минимальным score.
:param pageAction: Значение параметра action, которое передается виджетом рекапчи в гугл,
и которое потом видит владелец сайта при проверке токена.
:param kwargs: Дополнительные параметры для `requests.post`, который отправляет даныйе на решение.
:return: Возвращает ответ сервера в виде JSON-строки
"""
if minScore not in MIN_SCORES:
raise ValueError(
f"Wrong `minScore` param - {minScore}, available params - {MIN_SCORES};"
)
# вставляем в пайлоад адрес страницы и ключ-индентификатор рекапчи
self.task_payload["task"].update(
{
"websiteURL": websiteURL,
"websiteKey": websiteKey,
"minScore": minScore,
"pageAction": pageAction,
}
)
# Отправляем на антикапчу пайлоад
# в результате получаем JSON ответ содержащий номер решаемой капчи
async with aiohttp.ClientSession() as session:
async with session.post(create_task_url, json=self.task_payload) as resp:
captcha_id = await resp.json()
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
if captcha_id["errorId"] == 0:
captcha_id = captcha_id["taskId"]
self.result_payload.update({"taskId": captcha_id})
else:
return captcha_id
# если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
if self.task_payload.get("callbackUrl"):
return self.result_payload
else:
# Ждем решения капчи
await asyncio.sleep(self.sleep_time)
return await get_async_result(
result_payload=self.result_payload, sleep_time=self.sleep_time
)