Add pyproject.toml for black
This commit is contained in:
parent
9e1375ae50
commit
b602e31174
|
@ -25,17 +25,13 @@ save_format = 'const' .
|
|||
|
||||
result = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY, save_format="const"
|
||||
).captcha_handler(
|
||||
captcha_link="http://85.255.8.26/static/image/common_image_example/800070.png"
|
||||
)
|
||||
).captcha_handler(captcha_link="http://85.255.8.26/static/image/common_image_example/800070.png")
|
||||
print(result)
|
||||
|
||||
# Пример который показывает работу антикапчи при решении капчи-изображением и сохранением её в качестве ВРЕМЕННОГО файла
|
||||
# Протестировано на Линуксах. Не используйте данный вариант на Windows! Возможно починим, но потом.
|
||||
# Example for working with captcha-image like a temporary file. Tested on UNIX-based systems. Don`t use it on Windows!
|
||||
result = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
).captcha_handler(
|
||||
result = ImageToTextTask.ImageToTextTask(anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(
|
||||
captcha_link="http://85.255.8.26/static/image/common_image_example/800070.png"
|
||||
)
|
||||
print(result)
|
||||
|
@ -47,9 +43,7 @@ Base64 files
|
|||
An example of working with decoding in base64 captcha-file after download. On-the-fly-encoding
|
||||
"""
|
||||
base_64_link = base64.b64encode(
|
||||
requests.get(
|
||||
"http://85.255.8.26/static/image/common_image_example/862963.png"
|
||||
).content
|
||||
requests.get("http://85.255.8.26/static/image/common_image_example/862963.png").content
|
||||
).decode("utf-8")
|
||||
|
||||
user_answer_base64 = ImageToTextTask.ImageToTextTask(
|
||||
|
@ -69,9 +63,9 @@ captcha_file = "088636.png"
|
|||
# captcha_file = 'D:\/Python\/933588.png'
|
||||
# captcha_file = r'D:\Python\933588.png'
|
||||
|
||||
result = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
).captcha_handler(captcha_file=captcha_file)
|
||||
result = ImageToTextTask.ImageToTextTask(anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(
|
||||
captcha_file=captcha_file
|
||||
)
|
||||
print(result)
|
||||
"""
|
||||
Пример для работы с локальными файлами
|
||||
|
@ -150,8 +144,7 @@ QUEUE_KEY = "wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ_anticaptcha_queue"
|
|||
"""
|
||||
|
||||
answer = requests.post(
|
||||
"http://85.255.8.26:8001/register_key",
|
||||
json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"},
|
||||
"http://85.255.8.26:8001/register_key", json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"}
|
||||
)
|
||||
# если очередь успешно создана:
|
||||
if answer == "OK":
|
||||
|
|
|
@ -19,15 +19,13 @@ result = AntiCaptchaControl.AntiCaptchaControl(
|
|||
).complaint_on_result(reported_id=-5, captcha_type="recaptcha")
|
||||
print(result)
|
||||
# Пример метода, принимающего ключ аккаунта и возвращающего актуальный баланс
|
||||
result = AntiCaptchaControl.AntiCaptchaControl(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
).get_balance()
|
||||
result = AntiCaptchaControl.AntiCaptchaControl(anticaptcha_key=ANTICAPTCHA_KEY).get_balance()
|
||||
print(result)
|
||||
# Пример метода, выдающий информацию о загрузке очереди, в зависимости от ID очереди
|
||||
# В данном случае queue_id = 1, то есть получаем информацию по загрузке очереди ImageToText (язык английский)
|
||||
result = AntiCaptchaControl.AntiCaptchaControl(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
).get_queue_status(queue_id=1)
|
||||
result = AntiCaptchaControl.AntiCaptchaControl(anticaptcha_key=ANTICAPTCHA_KEY).get_queue_status(
|
||||
queue_id=1
|
||||
)
|
||||
print(result)
|
||||
|
||||
# Асинхронный метод работы
|
||||
|
|
|
@ -53,9 +53,7 @@ custom_form = """[
|
|||
]"""
|
||||
|
||||
my_custom_task = CustomCaptchaTask.CustomCaptchaTask(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY,
|
||||
assignment="Enter license plate number",
|
||||
forms=custom_form,
|
||||
anticaptcha_key=ANTICAPTCHA_KEY, assignment="Enter license plate number", forms=custom_form
|
||||
).captcha_handler(imageUrl=imageUrl)
|
||||
|
||||
|
||||
|
|
|
@ -70,8 +70,7 @@ QUEUE_KEY = "wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ_anticaptcha_queue"
|
|||
"""
|
||||
|
||||
answer = requests.post(
|
||||
"http://85.255.8.26:8001/register_key",
|
||||
json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"},
|
||||
"http://85.255.8.26:8001/register_key", json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"}
|
||||
)
|
||||
# если очередь успешно создана:
|
||||
if answer == "OK":
|
||||
|
|
|
@ -16,9 +16,7 @@ result = NoCaptchaTaskProxyless.NoCaptchaTaskProxyless(
|
|||
print(result)
|
||||
|
||||
# contextmanager
|
||||
with NoCaptchaTaskProxyless.NoCaptchaTaskProxyless(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
) as nocaptcha:
|
||||
with NoCaptchaTaskProxyless.NoCaptchaTaskProxyless(anticaptcha_key=ANTICAPTCHA_KEY) as nocaptcha:
|
||||
response = nocaptcha.captcha_handler(
|
||||
websiteURL="https://www.google.com/recaptcha/api2/demo",
|
||||
websiteKey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
|
||||
|
@ -75,8 +73,7 @@ QUEUE_KEY = "wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ_anticaptcha_queue"
|
|||
"""
|
||||
|
||||
answer = requests.post(
|
||||
"http://85.255.8.26:8001/register_key",
|
||||
json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"},
|
||||
"http://85.255.8.26:8001/register_key", json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"}
|
||||
)
|
||||
# если очередь успешно создана:
|
||||
if answer == "OK":
|
||||
|
|
|
@ -15,9 +15,7 @@ SquareNetTextTask : select objects on image with an overlay grid
|
|||
ANTICAPTCHA_KEY = ""
|
||||
|
||||
# Простой пример работы / Base example
|
||||
result = SquareNetTextTask.SquareNetTextTask(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
).captcha_handler(
|
||||
result = SquareNetTextTask.SquareNetTextTask(anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(
|
||||
objectName="captcha numbers",
|
||||
rowsCount=2,
|
||||
columnsCount=3,
|
||||
|
@ -59,8 +57,7 @@ QUEUE_KEY = "wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ_anticaptcha_queue"
|
|||
"""
|
||||
|
||||
answer = requests.post(
|
||||
"http://85.255.8.26:8001/register_key",
|
||||
json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"},
|
||||
"http://85.255.8.26:8001/register_key", json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"}
|
||||
)
|
||||
# если очередь успешно создана:
|
||||
if answer == "OK":
|
||||
|
|
|
@ -27,8 +27,7 @@ QUEUE_KEY = "wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ_anticaptcha_queue"
|
|||
"""
|
||||
|
||||
answer = requests.post(
|
||||
"http://85.255.8.26:8001/register_key",
|
||||
json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"},
|
||||
"http://85.255.8.26:8001/register_key", json={"key": QUEUE_KEY, "vhost": "anticaptcha_vhost"}
|
||||
)
|
||||
# если очередь успешно создана:
|
||||
if answer == "OK":
|
||||
|
@ -77,11 +76,7 @@ if answer == "OK":
|
|||
print(result)
|
||||
|
||||
# получение результата из кеша
|
||||
print(
|
||||
CallbackClient.CallbackClient(
|
||||
task_id=result["taskId"]
|
||||
).captcha_handler()
|
||||
)
|
||||
print(CallbackClient.CallbackClient(task_id=result["taskId"]).captcha_handler())
|
||||
# получение результата из RabbitMQ очереди, со стандартными параметрами
|
||||
print(
|
||||
CallbackClient.CallbackClient(
|
||||
|
|
|
@ -20,9 +20,7 @@ print(response)
|
|||
async def run():
|
||||
try:
|
||||
# io.IOBase
|
||||
custom_result = CustomResultHandler.aioCustomResultHandler(
|
||||
anticaptcha_key=ANTICAPTCHA_KEY
|
||||
)
|
||||
custom_result = CustomResultHandler.aioCustomResultHandler(anticaptcha_key=ANTICAPTCHA_KEY)
|
||||
response = await custom_result.task_handler(task_id=TASK_ID)
|
||||
print(response)
|
||||
except Exception as err:
|
||||
|
|
|
@ -19,17 +19,13 @@ browser_options.add_argument("--no-sandbox")
|
|||
browser_options.add_argument("disable-infobars")
|
||||
browser_options.add_argument("--disable-extensions")
|
||||
# run browser
|
||||
browser = webdriver.Chrome(
|
||||
executable_path="./chromefile/chromedriver", options=browser_options
|
||||
)
|
||||
browser = webdriver.Chrome(executable_path="./chromefile/chromedriver", options=browser_options)
|
||||
# open page
|
||||
browser.get(WEB_URL)
|
||||
# prepare captcha solver
|
||||
captcha_obj = NoCaptchaTaskProxyless(anticaptcha_key=ANTICAPTCHA_KEY)
|
||||
# solve recaptcha
|
||||
browser.execute_script(
|
||||
"document.getElementById('g-recaptcha-response').style.display = 'block';"
|
||||
)
|
||||
browser.execute_script("document.getElementById('g-recaptcha-response').style.display = 'block';")
|
||||
# wait script finish
|
||||
time.sleep(1)
|
||||
recaptcha_element = browser.find_element_by_xpath(recaptcha_xpath)
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
[tool.black]
|
||||
line-length = 99
|
||||
target-version = ['py36']
|
||||
exclude = '''
|
||||
/(
|
||||
\.git
|
||||
| \.hg
|
||||
| \.mypy_cache
|
||||
| \.tox
|
||||
| \.venv
|
||||
| _build
|
||||
| buck-out
|
||||
| build
|
||||
| dist
|
||||
)/
|
||||
'''
|
|
@ -57,10 +57,6 @@ class aioAntiCaptchaAppStats:
|
|||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
get_app_stats_url,
|
||||
json={
|
||||
"clientKey": self.ANTICAPTCHA_KEY,
|
||||
"softId": softId,
|
||||
"mode": mode,
|
||||
},
|
||||
json={"clientKey": self.ANTICAPTCHA_KEY, "softId": softId, "mode": mode},
|
||||
) as resp:
|
||||
return await resp.json()
|
||||
|
|
|
@ -38,9 +38,7 @@ class AntiCaptchaControl:
|
|||
Получение баланса аккаунта
|
||||
:return: Возвращает актуальный баланс
|
||||
"""
|
||||
answer = requests.post(
|
||||
get_balance_url, json={"clientKey": self.ANTICAPTCHA_KEY}
|
||||
)
|
||||
answer = requests.post(get_balance_url, json={"clientKey": self.ANTICAPTCHA_KEY})
|
||||
|
||||
return answer.json()
|
||||
|
||||
|
@ -51,8 +49,7 @@ class AntiCaptchaControl:
|
|||
"""
|
||||
if mode not in mods:
|
||||
raise ValueError(
|
||||
f"\nWrong `mode` parameter. Valid params: {mods}."
|
||||
f"\n\tYour param - `{mode}`"
|
||||
f"\nWrong `mode` parameter. Valid params: {mods}." f"\n\tYour param - `{mode}`"
|
||||
)
|
||||
payload = {"clientKey": self.ANTICAPTCHA_KEY, "softId": softId, "mode": mode}
|
||||
answer = requests.post(get_app_stats_url, json=payload)
|
||||
|
@ -62,9 +59,7 @@ class AntiCaptchaControl:
|
|||
else:
|
||||
return {"errorId": 1}
|
||||
|
||||
def complaint_on_result(
|
||||
self, reported_id: int, captcha_type: str = "image"
|
||||
) -> dict:
|
||||
def complaint_on_result(self, reported_id: int, captcha_type: str = "image") -> dict:
|
||||
f"""
|
||||
Позволяет отправить жалобу на неправильно решённую капчу.
|
||||
:param reported_id: Отправляете ID капчи на которую нужно пожаловаться
|
||||
|
@ -160,8 +155,7 @@ class aioAntiCaptchaControl:
|
|||
"""
|
||||
if mode not in mods:
|
||||
raise ValueError(
|
||||
f"\nWrong `mode` parameter. Valid params: {mods}."
|
||||
f"\n\tYour param - `{mode}`"
|
||||
f"\nWrong `mode` parameter. Valid params: {mods}." f"\n\tYour param - `{mode}`"
|
||||
)
|
||||
payload = {"clientKey": self.ANTICAPTCHA_KEY, "softId": softId, "mode": mode}
|
||||
async with aiohttp.ClientSession() as session:
|
||||
|
@ -171,9 +165,7 @@ class aioAntiCaptchaControl:
|
|||
else:
|
||||
return {"errorId": 1}
|
||||
|
||||
async def complaint_on_result(
|
||||
self, reported_id: int, captcha_type: str = "image"
|
||||
) -> dict:
|
||||
async def complaint_on_result(self, reported_id: int, captcha_type: str = "image") -> dict:
|
||||
f"""
|
||||
Позволяет отправить жалобу на неправильно решённую капчу.
|
||||
:param reported_id: Отправляете ID капчи на которую нужно пожаловаться
|
||||
|
@ -190,9 +182,7 @@ class aioAntiCaptchaControl:
|
|||
# complaint on image captcha
|
||||
if captcha_type == "image":
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
incorrect_imagecaptcha_url, json=payload
|
||||
) as resp:
|
||||
async with session.post(incorrect_imagecaptcha_url, json=payload) as resp:
|
||||
return await resp.json()
|
||||
# complaint on re-captcha
|
||||
elif captcha_type == "recaptcha":
|
||||
|
|
|
@ -125,9 +125,7 @@ class CallbackClient:
|
|||
|
||||
return False
|
||||
|
||||
def captcha_handler(
|
||||
self, requests_timeout: int = 1, auth_params: dict = None
|
||||
) -> dict:
|
||||
def captcha_handler(self, requests_timeout: int = 1, auth_params: dict = None) -> dict:
|
||||
"""
|
||||
Метод отвечает за получение результата решения капчи с callback сервера
|
||||
:param requests_timeout: Время между запросами к серверу.
|
||||
|
@ -162,19 +160,13 @@ class CallbackClient:
|
|||
else self.rtmq_password
|
||||
)
|
||||
self.rtmq_host = (
|
||||
auth_params["rtmq_host"]
|
||||
if auth_params.get("rtmq_host")
|
||||
else self.rtmq_host
|
||||
auth_params["rtmq_host"] if auth_params.get("rtmq_host") else self.rtmq_host
|
||||
)
|
||||
self.rtmq_port = (
|
||||
auth_params["rtmq_port"]
|
||||
if auth_params.get("rtmq_port")
|
||||
else self.rtmq_port
|
||||
auth_params["rtmq_port"] if auth_params.get("rtmq_port") else self.rtmq_port
|
||||
)
|
||||
self.rtmq_vhost = (
|
||||
auth_params["rtmq_vhost"]
|
||||
if auth_params.get("rtmq_vhost")
|
||||
else self.rtmq_vhost
|
||||
auth_params["rtmq_vhost"] if auth_params.get("rtmq_vhost") else self.rtmq_vhost
|
||||
)
|
||||
|
||||
# получение данных из кеша
|
||||
|
|
|
@ -4,12 +4,7 @@ import asyncio
|
|||
import requests
|
||||
import aiohttp
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_async_result,
|
||||
get_sync_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_async_result, get_sync_result
|
||||
|
||||
|
||||
class CustomCaptchaTask:
|
||||
|
@ -30,9 +25,7 @@ class CustomCaptchaTask:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -89,9 +82,7 @@ class CustomCaptchaTask:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioCustomCaptchaTask:
|
||||
|
@ -112,9 +103,7 @@ class aioCustomCaptchaTask:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
|
|
@ -12,9 +12,7 @@ class CustomResultHandler:
|
|||
:param sleep_time: Solution timeout
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# payload for receiving service response
|
||||
self.result_payload = {"clientKey": anticaptcha_key}
|
||||
|
@ -37,9 +35,7 @@ class CustomResultHandler:
|
|||
|
||||
# wait captcha solution result
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioCustomResultHandler:
|
||||
|
@ -50,9 +46,7 @@ class aioCustomResultHandler:
|
|||
:param sleep_time: Solution timeout
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# payload for receiving service response
|
||||
self.result_payload = {"clientKey": anticaptcha_key}
|
||||
|
|
|
@ -4,21 +4,12 @@ import asyncio
|
|||
import aiohttp
|
||||
import requests
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class FunCaptchaTask:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: int = 5,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение FunCaptcha
|
||||
|
@ -28,9 +19,7 @@ class FunCaptchaTask:
|
|||
:param kwargs: Параметры для подключения к прокси. Подробнее в официальной документации или примерe - anticaptcha_examples/anticaptcha_fun_example.py
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -73,9 +62,7 @@ class FunCaptchaTask:
|
|||
)
|
||||
# Отправляем на антикапча параметры фанкапич,
|
||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
captcha_id = requests.post(
|
||||
create_task_url, json=self.task_payload, **kwargs
|
||||
).json()
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload, **kwargs).json()
|
||||
|
||||
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
|
||||
if captcha_id["errorId"] == 0:
|
||||
|
@ -91,18 +78,12 @@ class FunCaptchaTask:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioFunCaptchaTask:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: int = 5,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение FunCaptcha
|
||||
|
@ -112,9 +93,7 @@ class aioFunCaptchaTask:
|
|||
:param kwargs: Параметры для подключения к прокси. Подробнее в официальной документации или примерe - anticaptcha_examples/anticaptcha_fun_example.py
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
|
|
@ -4,18 +4,11 @@ import asyncio
|
|||
import aiohttp
|
||||
import requests
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class FunCaptchaTaskProxyless:
|
||||
def __init__(
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None
|
||||
):
|
||||
def __init__(self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None):
|
||||
"""
|
||||
Модуль отвечает за решение FunCaptcha Proxyless
|
||||
:param anticaptcha_key: Ключ от АнтиКапчи
|
||||
|
@ -23,9 +16,7 @@ class FunCaptchaTaskProxyless:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -63,9 +54,7 @@ class FunCaptchaTaskProxyless:
|
|||
)
|
||||
# Отправляем на антикапча параметры фанкапич,
|
||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
captcha_id = requests.post(
|
||||
create_task_url, json=self.task_payload, **kwargs
|
||||
).json()
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload, **kwargs).json()
|
||||
|
||||
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
|
||||
if captcha_id["errorId"] == 0:
|
||||
|
@ -81,15 +70,11 @@ class FunCaptchaTaskProxyless:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioFunCaptchaTaskProxyless:
|
||||
def __init__(
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None
|
||||
):
|
||||
def __init__(self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None):
|
||||
"""
|
||||
Модуль отвечает за решение FunCaptcha Proxyless
|
||||
:param anticaptcha_key: Ключ от АнтиКапчи
|
||||
|
@ -97,9 +82,7 @@ class aioFunCaptchaTaskProxyless:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
|
|
@ -4,12 +4,7 @@ import asyncio
|
|||
import aiohttp
|
||||
import requests
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class GeeTestTask:
|
||||
|
@ -32,9 +27,7 @@ class GeeTestTask:
|
|||
:param kwargs: Параметры для подключения к прокси. Подробнее в официальной документации или примерe - anticaptcha_examples/anticaptcha_gee_test_task.py
|
||||
"""
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -90,9 +83,7 @@ class GeeTestTask:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioGeeTestTask:
|
||||
|
@ -115,9 +106,7 @@ class aioGeeTestTask:
|
|||
:param kwargs: Параметры для подключения к прокси. Подробнее в официальной документации или примерe - anticaptcha_examples/anticaptcha_gee_test_task.py
|
||||
"""
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
|
|
@ -4,12 +4,7 @@ import asyncio
|
|||
import requests
|
||||
import aiohttp
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class GeeTestTaskProxyless:
|
||||
|
@ -30,19 +25,13 @@ class GeeTestTaskProxyless:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
self.task_payload = {
|
||||
"clientKey": anticaptcha_key,
|
||||
"task": {
|
||||
"type": "GeeTestTaskProxyless",
|
||||
"websiteURL": websiteURL,
|
||||
"gt": gt,
|
||||
},
|
||||
"task": {"type": "GeeTestTaskProxyless", "websiteURL": websiteURL, "gt": gt},
|
||||
"softId": app_key,
|
||||
}
|
||||
# задаём callbackUrl если передан
|
||||
|
@ -86,9 +75,7 @@ class GeeTestTaskProxyless:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioGeeTestTaskProxyless:
|
||||
|
@ -109,19 +96,13 @@ class aioGeeTestTaskProxyless:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
self.task_payload = {
|
||||
"clientKey": anticaptcha_key,
|
||||
"task": {
|
||||
"type": "GeeTestTaskProxyless",
|
||||
"websiteURL": websiteURL,
|
||||
"gt": gt,
|
||||
},
|
||||
"task": {"type": "GeeTestTaskProxyless", "websiteURL": websiteURL, "gt": gt},
|
||||
"softId": app_key,
|
||||
}
|
||||
# задаём callbackUrl если передан
|
||||
|
|
|
@ -46,9 +46,7 @@ class ImageToTextTask:
|
|||
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# проверяем переданный параметр способа сохранения капчи
|
||||
if save_format in SAVE_FORMATS:
|
||||
|
@ -93,9 +91,7 @@ class ImageToTextTask:
|
|||
:return: Возвращает ID капчи
|
||||
"""
|
||||
# Создаём пайлоад, вводим ключ от сайта, выбираем метод ПОСТ и ждём ответа в JSON-формате
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(content).decode("utf-8")}
|
||||
)
|
||||
self.task_payload["task"].update({"body": base64.b64encode(content).decode("utf-8")})
|
||||
# Отправляем на рукапча изображение капчи и другие парметры,
|
||||
# в результате получаем JSON ответ с номером решаемой капчи и получая ответ - извлекаем номер
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
||||
|
@ -114,14 +110,10 @@ class ImageToTextTask:
|
|||
# Высчитываем хэш изображения, для того что бы сохранить его под уникальным именем
|
||||
image_hash = hashlib.sha224(content).hexdigest()
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb"
|
||||
) as out_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb") as out_image:
|
||||
out_image.write(content)
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb"
|
||||
) as captcha_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb") as captcha_image:
|
||||
# Добавляем в пайлоад картинку и отправляем
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(captcha_image.read()).decode("utf-8")}
|
||||
|
@ -181,13 +173,9 @@ class ImageToTextTask:
|
|||
:return: Возвращает весь ответ сервера JSON-строкой.
|
||||
"""
|
||||
if captcha_file:
|
||||
captcha_id = self.__read_captcha_image_file(
|
||||
captcha_file, content_type="file"
|
||||
)
|
||||
captcha_id = self.__read_captcha_image_file(captcha_file, content_type="file")
|
||||
elif captcha_base64:
|
||||
captcha_id = self.__read_captcha_image_file(
|
||||
captcha_base64, content_type="base64"
|
||||
)
|
||||
captcha_id = self.__read_captcha_image_file(captcha_base64, content_type="base64")
|
||||
elif captcha_link:
|
||||
content = requests.get(captcha_link, **kwargs).content
|
||||
# согласно значения переданного параметра выбираем функцию для сохранения изображения
|
||||
|
@ -215,9 +203,7 @@ class ImageToTextTask:
|
|||
else:
|
||||
# Ожидаем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioImageToTextTask:
|
||||
|
@ -247,9 +233,7 @@ class aioImageToTextTask:
|
|||
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# проверяем переданный параметр способа сохранения капчи
|
||||
if save_format in SAVE_FORMATS:
|
||||
|
@ -326,14 +310,10 @@ class aioImageToTextTask:
|
|||
# Высчитываем хэш изображения, для того что бы сохранить его под уникальным именем
|
||||
image_hash = hashlib.sha224(content).hexdigest()
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb"
|
||||
) as out_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb") as out_image:
|
||||
out_image.write(content)
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb"
|
||||
) as captcha_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb") as captcha_image:
|
||||
# Добавляем в пайлоад картинку и отправляем
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(captcha_image.read()).decode("utf-8")}
|
||||
|
@ -342,18 +322,14 @@ class aioImageToTextTask:
|
|||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
create_task_url, json=self.task_payload
|
||||
) as resp:
|
||||
async with session.post(create_task_url, json=self.task_payload) as resp:
|
||||
captcha_id = await resp.json()
|
||||
|
||||
# удаляем файл капчи
|
||||
os.remove(os.path.join(img_path, "im-{0}.png".format(image_hash)))
|
||||
return captcha_id
|
||||
|
||||
async def __read_captcha_image_file(
|
||||
self, content: bytes, content_type: str = "file"
|
||||
):
|
||||
async def __read_captcha_image_file(self, content: bytes, content_type: str = "file"):
|
||||
"""
|
||||
Функция отвечает за чтение уже сохранённого файла или файла в уодировке base64
|
||||
:param content: Параметр строка-путь указывающий на изображение капчи для отправки её на сервер
|
||||
|
@ -384,10 +360,7 @@ class aioImageToTextTask:
|
|||
|
||||
# Работа с капчёй
|
||||
async def captcha_handler(
|
||||
self,
|
||||
captcha_link: str = None,
|
||||
captcha_file: str = None,
|
||||
captcha_base64: str = None,
|
||||
self, captcha_link: str = None, captcha_file: str = None, captcha_base64: str = None
|
||||
) -> dict:
|
||||
"""
|
||||
Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер
|
||||
|
@ -397,9 +370,7 @@ class aioImageToTextTask:
|
|||
"""
|
||||
# если был передан линк на локальный скачаный файл
|
||||
if captcha_file:
|
||||
captcha_id = await self.__read_captcha_image_file(
|
||||
captcha_file, content_type="file"
|
||||
)
|
||||
captcha_id = await self.__read_captcha_image_file(captcha_file, content_type="file")
|
||||
elif captcha_base64:
|
||||
captcha_id = await self.__read_captcha_image_file(
|
||||
captcha_base64, content_type="base64"
|
||||
|
|
|
@ -4,21 +4,12 @@ import asyncio
|
|||
import requests
|
||||
import aiohttp
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class NoCaptchaTask:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: int = 10,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: int = 10, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение NoCaptcha.
|
||||
|
@ -29,9 +20,7 @@ class NoCaptchaTask:
|
|||
"""
|
||||
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -68,9 +57,7 @@ class NoCaptchaTask:
|
|||
:param: websiteKey: Ключ капчи(как его получить - описано в документаии на сайте антикапчи)
|
||||
return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
||||
"""
|
||||
self.task_payload["task"].update(
|
||||
{"websiteURL": websiteURL, "websiteKey": websiteKey}
|
||||
)
|
||||
self.task_payload["task"].update({"websiteURL": websiteURL, "websiteKey": websiteKey})
|
||||
# отправляем реквест, в ответ получаем JSON содержащий номер решаемой капчи
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
||||
|
||||
|
@ -87,18 +74,12 @@ class NoCaptchaTask:
|
|||
else:
|
||||
# Ждем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioNoCaptchaTask:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: str = 10,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: str = 10, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение NoCaptcha.
|
||||
|
@ -109,9 +90,7 @@ class aioNoCaptchaTask:
|
|||
"""
|
||||
|
||||
if sleep_time < 10:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 10. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 10. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -148,9 +127,7 @@ class aioNoCaptchaTask:
|
|||
:param: websiteKey: Ключ капчи(как его получить - описано в документаии на сайте антикапчи)
|
||||
return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
||||
"""
|
||||
self.task_payload["task"].update(
|
||||
{"websiteURL": websiteURL, "websiteKey": websiteKey}
|
||||
)
|
||||
self.task_payload["task"].update({"websiteURL": websiteURL, "websiteKey": websiteKey})
|
||||
# отправляем реквест, в ответ получаем JSON содержащий номер решаемой капчи
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(create_task_url, json=self.task_payload) as resp:
|
||||
|
|
|
@ -4,21 +4,12 @@ import asyncio
|
|||
import requests
|
||||
import aiohttp
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
from python3_anticaptcha import create_task_url, app_key, get_sync_result, get_async_result
|
||||
|
||||
|
||||
class NoCaptchaTaskProxyless:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: int = 5,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение ReCaptcha без прокси
|
||||
|
@ -28,9 +19,7 @@ class NoCaptchaTaskProxyless:
|
|||
:param kwargs: Другие необязательные параметры из документации
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -69,14 +58,10 @@ class NoCaptchaTaskProxyless:
|
|||
"""
|
||||
|
||||
# вставляем в пайлоад адрес страницы и ключ-индентификатор рекапчи
|
||||
self.task_payload["task"].update(
|
||||
{"websiteURL": websiteURL, "websiteKey": websiteKey}
|
||||
)
|
||||
self.task_payload["task"].update({"websiteURL": websiteURL, "websiteKey": websiteKey})
|
||||
# Отправляем на антикапчу пайлоад
|
||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
captcha_id = requests.post(
|
||||
create_task_url, json=self.task_payload, **kwargs
|
||||
).json()
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload, **kwargs).json()
|
||||
|
||||
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
|
||||
if captcha_id["errorId"] == 0:
|
||||
|
@ -92,18 +77,12 @@ class NoCaptchaTaskProxyless:
|
|||
else:
|
||||
# Ожидаем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioNoCaptchaTaskProxyless:
|
||||
def __init__(
|
||||
self,
|
||||
anticaptcha_key: str,
|
||||
sleep_time: int = 5,
|
||||
callbackUrl: str = None,
|
||||
**kwargs,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение ReCaptcha без прокси
|
||||
|
@ -113,9 +92,7 @@ class aioNoCaptchaTaskProxyless:
|
|||
:param kwargs: Другие необязательные параметры из документации
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -155,9 +132,7 @@ class aioNoCaptchaTaskProxyless:
|
|||
"""
|
||||
|
||||
# вставляем в пайлоад адрес страницы и ключ-индентификатор рекапчи
|
||||
self.task_payload["task"].update(
|
||||
{"websiteURL": websiteURL, "websiteKey": websiteKey}
|
||||
)
|
||||
self.task_payload["task"].update({"websiteURL": websiteURL, "websiteKey": websiteKey})
|
||||
# Отправляем на антикапчу пайлоад
|
||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
async with aiohttp.ClientSession() as session:
|
||||
|
|
|
@ -4,23 +4,14 @@ import asyncio
|
|||
import requests
|
||||
import aiohttp
|
||||
|
||||
from python3_anticaptcha import (
|
||||
create_task_url,
|
||||
app_key,
|
||||
get_sync_result,
|
||||
get_async_result,
|
||||
)
|
||||
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,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение ReCaptcha v3 без прокси
|
||||
|
@ -30,9 +21,7 @@ class ReCaptchaV3TaskProxyless:
|
|||
:param kwargs: Другие необязательные параметры из документации
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be less than 5. U send - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be less than 5. U send - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
@ -63,12 +52,7 @@ class ReCaptchaV3TaskProxyless:
|
|||
|
||||
# Работа с капчёй
|
||||
def captcha_handler(
|
||||
self,
|
||||
websiteURL: str,
|
||||
websiteKey: str,
|
||||
minScore: float,
|
||||
pageAction: str,
|
||||
**kwargs,
|
||||
self, websiteURL: str, websiteKey: str, minScore: float, pageAction: str, **kwargs
|
||||
) -> dict:
|
||||
"""
|
||||
Метод решения ReCaptcha V3
|
||||
|
@ -95,9 +79,7 @@ class ReCaptchaV3TaskProxyless:
|
|||
)
|
||||
# Отправляем на антикапчу пайлоад
|
||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
captcha_id = requests.post(
|
||||
create_task_url, json=self.task_payload, **kwargs
|
||||
).json()
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload, **kwargs).json()
|
||||
|
||||
# Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
|
||||
if captcha_id["errorId"] == 0:
|
||||
|
@ -113,18 +95,12 @@ class ReCaptchaV3TaskProxyless:
|
|||
else:
|
||||
# Ожидаем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=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,
|
||||
self, anticaptcha_key: str, sleep_time: int = 5, callbackUrl: str = None, **kwargs
|
||||
):
|
||||
"""
|
||||
Модуль отвечает за решение ReCaptcha V3 без прокси
|
||||
|
@ -134,9 +110,7 @@ class aioReCaptchaV3TaskProxyless:
|
|||
:param kwargs: Другие необязательные параметры из документации
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be less than 5. U send - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be less than 5. U send - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
|
||||
# Пайлоад для создания задачи
|
||||
|
|
|
@ -40,9 +40,7 @@ class SquareNetTextTask:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# проверяем переданный параметр способа сохранения капчи
|
||||
if save_format in ["const", "temp"]:
|
||||
|
@ -83,9 +81,7 @@ class SquareNetTextTask:
|
|||
:return: Возвращает ID капчи
|
||||
"""
|
||||
# Создаём пайлоад, вводим ключ от сайта, выбираем метод ПОСТ и ждём ответа в JSON-формате
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(content).decode("utf-8")}
|
||||
)
|
||||
self.task_payload["task"].update({"body": base64.b64encode(content).decode("utf-8")})
|
||||
# Отправляем на рукапча изображение капчи и другие парметры,
|
||||
# в результате получаем JSON ответ с номером решаемой капчи и получая ответ - извлекаем номер
|
||||
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
||||
|
@ -104,14 +100,10 @@ class SquareNetTextTask:
|
|||
# Высчитываем хэш изображения, для того что бы сохранить его под уникальным именем
|
||||
image_hash = hashlib.sha224(content).hexdigest()
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb"
|
||||
) as out_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb") as out_image:
|
||||
out_image.write(content)
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb"
|
||||
) as captcha_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb") as captcha_image:
|
||||
# Добавляем в пайлоад картинку и отправляем
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(captcha_image.read()).decode("utf-8")}
|
||||
|
@ -196,9 +188,7 @@ class SquareNetTextTask:
|
|||
|
||||
# проводим действия над файлом уже закодированном в base64(передаём на сервер)
|
||||
elif image_base64:
|
||||
captcha_id = self.__read_captcha_image_file(
|
||||
image_base64, content_type="base64"
|
||||
)
|
||||
captcha_id = self.__read_captcha_image_file(image_base64, content_type="base64")
|
||||
|
||||
# проводим действия над ссылкой на файл(скачиваем, сохраняем и передаём на сервер)
|
||||
elif image_link:
|
||||
|
@ -228,9 +218,7 @@ class SquareNetTextTask:
|
|||
else:
|
||||
# Ожидаем решения капчи
|
||||
time.sleep(self.sleep_time)
|
||||
return get_sync_result(
|
||||
result_payload=self.result_payload, sleep_time=self.sleep_time
|
||||
)
|
||||
return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)
|
||||
|
||||
|
||||
class aioSquareNetTextTask:
|
||||
|
@ -256,9 +244,7 @@ class aioSquareNetTextTask:
|
|||
:param callbackUrl: URL для решения капчи с ответом через callback
|
||||
"""
|
||||
if sleep_time < 5:
|
||||
raise ValueError(
|
||||
f"Param `sleep_time` must be greater than 5. U set - {sleep_time}"
|
||||
)
|
||||
raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
|
||||
self.sleep_time = sleep_time
|
||||
# проверяем переданный параметр способа сохранения капчи
|
||||
if save_format in ["const", "temp"]:
|
||||
|
@ -328,14 +314,10 @@ class aioSquareNetTextTask:
|
|||
# Высчитываем хэш изображения, для того что бы сохранить его под уникальным именем
|
||||
image_hash = hashlib.sha224(content).hexdigest()
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb"
|
||||
) as out_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "wb") as out_image:
|
||||
out_image.write(content)
|
||||
|
||||
with open(
|
||||
os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb"
|
||||
) as captcha_image:
|
||||
with open(os.path.join(img_path, "im-{0}.png".format(image_hash)), "rb") as captcha_image:
|
||||
# Добавляем в пайлоад картинку и отправляем
|
||||
self.task_payload["task"].update(
|
||||
{"body": base64.b64encode(captcha_image.read()).decode("utf-8")}
|
||||
|
@ -344,18 +326,14 @@ class aioSquareNetTextTask:
|
|||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
create_task_url, json=self.task_payload
|
||||
) as resp:
|
||||
async with session.post(create_task_url, json=self.task_payload) as resp:
|
||||
captcha_id = await resp.json()
|
||||
|
||||
# удаляем файл капчи
|
||||
os.remove(os.path.join(img_path, "im-{0}.png".format(image_hash)))
|
||||
return captcha_id
|
||||
|
||||
async def __read_captcha_image_file(
|
||||
self, content: bytes, content_type: str = "file"
|
||||
):
|
||||
async def __read_captcha_image_file(self, content: bytes, content_type: str = "file"):
|
||||
"""
|
||||
Функция отвечает за чтение уже сохранённого файла или файла в уодировке base64
|
||||
:param content: Параметр строка-путь указывающий на изображение капчи для отправки её на сервер
|
||||
|
@ -418,13 +396,9 @@ class aioSquareNetTextTask:
|
|||
self.task_payload["task"].update({"columnsCount": columnsCount})
|
||||
# если был передан линк на локальный скачаный файл
|
||||
if image_file:
|
||||
captcha_id = await self.__read_captcha_image_file(
|
||||
image_file, content_type="file"
|
||||
)
|
||||
captcha_id = await self.__read_captcha_image_file(image_file, content_type="file")
|
||||
elif image_base64:
|
||||
captcha_id = await self.__read_captcha_image_file(
|
||||
image_base64, content_type="base64"
|
||||
)
|
||||
captcha_id = await self.__read_captcha_image_file(image_base64, content_type="base64")
|
||||
elif image_link:
|
||||
# согласно значения переданного параметра выбираем функцию для сохранения изображения
|
||||
if self.save_format == "const":
|
||||
|
|
16
test.py
16
test.py
|
@ -120,13 +120,7 @@ class TestAntiCaptcha(object):
|
|||
|
||||
def test_recaptcha_v3_params(self):
|
||||
default_init_params = ["self", "anticaptcha_key", "sleep_time", "callbackUrl"]
|
||||
default_handler_params = [
|
||||
"self",
|
||||
"websiteURL",
|
||||
"websiteKey",
|
||||
"minScore",
|
||||
"pageAction",
|
||||
]
|
||||
default_handler_params = ["self", "websiteURL", "websiteKey", "minScore", "pageAction"]
|
||||
# get customcaptcha init and captcha_handler params
|
||||
aioinit_params = inspect.getfullargspec(
|
||||
ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless.__init__
|
||||
|
@ -165,9 +159,7 @@ class TestAntiCaptcha(object):
|
|||
# check response type
|
||||
assert type(response) is dict
|
||||
# check all dict keys
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(
|
||||
response.keys()
|
||||
)
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(response.keys())
|
||||
# check error code
|
||||
# TODO change to `0`
|
||||
assert response["errorId"] == 31
|
||||
|
@ -239,9 +231,7 @@ class TestAntiCaptcha(object):
|
|||
anticaptcha_key=self.anticaptcha_key_fail
|
||||
) as recaptcha:
|
||||
# check response type
|
||||
assert (
|
||||
type(recaptcha) is ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless
|
||||
)
|
||||
assert type(recaptcha) is ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless
|
||||
|
||||
response = yield recaptcha.captcha_handler(
|
||||
websiteURL="https://www.google.com/recaptcha/api2/demo",
|
||||
|
|
|
@ -23,9 +23,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
default_complaint_params = ["self", "reported_id", "captcha_type"]
|
||||
default_queue_status_params = ["queue_id"]
|
||||
# get aiocaptchacontrol init and other params
|
||||
aio_init_params = inspect.getfullargspec(
|
||||
AntiCaptchaControl.aioAntiCaptchaControl.__init__
|
||||
)
|
||||
aio_init_params = inspect.getfullargspec(AntiCaptchaControl.aioAntiCaptchaControl.__init__)
|
||||
aio_balance_params = inspect.getfullargspec(
|
||||
AntiCaptchaControl.aioAntiCaptchaControl.get_balance
|
||||
)
|
||||
|
@ -40,12 +38,8 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
# get captchacontrol init and other params
|
||||
init_params = inspect.getfullargspec(
|
||||
AntiCaptchaControl.AntiCaptchaControl.__init__
|
||||
)
|
||||
balance_params = inspect.getfullargspec(
|
||||
AntiCaptchaControl.AntiCaptchaControl.get_balance
|
||||
)
|
||||
init_params = inspect.getfullargspec(AntiCaptchaControl.AntiCaptchaControl.__init__)
|
||||
balance_params = inspect.getfullargspec(AntiCaptchaControl.AntiCaptchaControl.get_balance)
|
||||
app_stats_params = inspect.getfullargspec(
|
||||
AntiCaptchaControl.AntiCaptchaControl.get_app_stats
|
||||
)
|
||||
|
@ -151,9 +145,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
anticaptcha_key=self.anticaptcha_key_true
|
||||
)
|
||||
with pytest.raises(ValueError):
|
||||
assert captcha_control.get_app_stats(
|
||||
softId=config.app_key, mode=self.WRONG_MODE
|
||||
)
|
||||
assert captcha_control.get_app_stats(softId=config.app_key, mode=self.WRONG_MODE)
|
||||
|
||||
def test_fail_key_complaint(self):
|
||||
captcha_control = AntiCaptchaControl.AntiCaptchaControl(
|
||||
|
@ -161,8 +153,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
response = captcha_control.complaint_on_result(
|
||||
reported_id=self.REPORT_ID,
|
||||
captcha_type=AntiCaptchaControl.complaint_types[0],
|
||||
reported_id=self.REPORT_ID, captcha_type=AntiCaptchaControl.complaint_types[0]
|
||||
)
|
||||
|
||||
assert isinstance(response, dict)
|
||||
|
@ -175,8 +166,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
response = captcha_control.complaint_on_result(
|
||||
reported_id=self.REPORT_ID,
|
||||
captcha_type=AntiCaptchaControl.complaint_types[0],
|
||||
reported_id=self.REPORT_ID, captcha_type=AntiCaptchaControl.complaint_types[0]
|
||||
)
|
||||
|
||||
assert isinstance(response, dict)
|
||||
|
@ -278,8 +268,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
response = await captcha_control.complaint_on_result(
|
||||
reported_id=self.REPORT_ID,
|
||||
captcha_type=AntiCaptchaControl.complaint_types[0],
|
||||
reported_id=self.REPORT_ID, captcha_type=AntiCaptchaControl.complaint_types[0]
|
||||
)
|
||||
|
||||
assert isinstance(response, dict)
|
||||
|
@ -293,8 +282,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
response = await captcha_control.complaint_on_result(
|
||||
reported_id=self.REPORT_ID,
|
||||
captcha_type=AntiCaptchaControl.complaint_types[0],
|
||||
reported_id=self.REPORT_ID, captcha_type=AntiCaptchaControl.complaint_types[0]
|
||||
)
|
||||
|
||||
assert isinstance(response, dict)
|
||||
|
@ -341,9 +329,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
) as captcha_control:
|
||||
|
||||
for mode in AntiCaptchaControl.mods:
|
||||
response = captcha_control.get_app_stats(
|
||||
softId=config.app_key, mode=mode
|
||||
)
|
||||
response = captcha_control.get_app_stats(softId=config.app_key, mode=mode)
|
||||
|
||||
assert isinstance(response, dict)
|
||||
|
||||
|
|
|
@ -26,17 +26,13 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
]
|
||||
default_handler_params = ["self", "imageUrl"]
|
||||
# get customcaptcha init and captcha_handler params
|
||||
aioinit_params = inspect.getfullargspec(
|
||||
CustomCaptchaTask.aioCustomCaptchaTask.__init__
|
||||
)
|
||||
aioinit_params = inspect.getfullargspec(CustomCaptchaTask.aioCustomCaptchaTask.__init__)
|
||||
aiohandler_params = inspect.getfullargspec(
|
||||
CustomCaptchaTask.aioCustomCaptchaTask.captcha_handler
|
||||
)
|
||||
|
||||
# get customcaptcha init and captcha_handler params
|
||||
init_params = inspect.getfullargspec(
|
||||
CustomCaptchaTask.CustomCaptchaTask.__init__
|
||||
)
|
||||
init_params = inspect.getfullargspec(CustomCaptchaTask.CustomCaptchaTask.__init__)
|
||||
handler_params = inspect.getfullargspec(
|
||||
CustomCaptchaTask.CustomCaptchaTask.captcha_handler
|
||||
)
|
||||
|
@ -67,9 +63,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
# check all dict keys
|
||||
assert ["clientKey", "task", "softId"] == list(request_payload.keys())
|
||||
assert request_payload["softId"] == config.app_key
|
||||
assert ["type", "assignment", "imageUrl"] == list(
|
||||
request_payload["task"].keys()
|
||||
)
|
||||
assert ["type", "assignment", "imageUrl"] == list(request_payload["task"].keys())
|
||||
assert request_payload["task"]["type"] == "CustomCaptchaTask"
|
||||
|
||||
def test_get_result_payload(self):
|
||||
|
@ -80,9 +74,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
assert isinstance(customcaptcha, CustomCaptchaTask.CustomCaptchaTask)
|
||||
|
||||
with requests_mock.Mocker() as req_mock:
|
||||
req_mock.register_uri(
|
||||
"POST", config.create_task_url, json=self.VALID_RESPONSE_JSON
|
||||
)
|
||||
req_mock.register_uri("POST", config.create_task_url, json=self.VALID_RESPONSE_JSON)
|
||||
req_mock.register_uri(
|
||||
"POST", config.get_result_url, json=self.VALID_RESPONSE_RESULT_JSON
|
||||
)
|
||||
|
|
|
@ -24,9 +24,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
)
|
||||
|
||||
# get customcaptcha init and task_handler params
|
||||
init_params = inspect.getfullargspec(
|
||||
CustomResultHandler.CustomResultHandler.__init__
|
||||
)
|
||||
init_params = inspect.getfullargspec(CustomResultHandler.CustomResultHandler.__init__)
|
||||
handler_params = inspect.getfullargspec(
|
||||
CustomResultHandler.CustomResultHandler.task_handler
|
||||
)
|
||||
|
@ -53,9 +51,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
# check response type
|
||||
assert isinstance(response, dict)
|
||||
# check all dict keys
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(
|
||||
response.keys()
|
||||
)
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(response.keys())
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_response_aioresult_handler(self):
|
||||
|
@ -70,9 +66,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
# check response type
|
||||
assert isinstance(response, dict)
|
||||
# check all dict keys
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(
|
||||
response.keys()
|
||||
)
|
||||
assert ["errorId", "errorCode", "errorDescription", "taskId"] == list(response.keys())
|
||||
|
||||
"""
|
||||
Fail tests
|
||||
|
|
|
@ -24,25 +24,16 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
"language",
|
||||
"callbackUrl",
|
||||
]
|
||||
default_handler_params = [
|
||||
"self",
|
||||
"captcha_link",
|
||||
"captcha_file",
|
||||
"captcha_base64",
|
||||
]
|
||||
default_handler_params = ["self", "captcha_link", "captcha_file", "captcha_base64"]
|
||||
# get customcaptcha init and captcha_handler params
|
||||
aioinit_params = inspect.getfullargspec(
|
||||
ImageToTextTask.aioImageToTextTask.__init__
|
||||
)
|
||||
aioinit_params = inspect.getfullargspec(ImageToTextTask.aioImageToTextTask.__init__)
|
||||
aiohandler_params = inspect.getfullargspec(
|
||||
ImageToTextTask.aioImageToTextTask.captcha_handler
|
||||
)
|
||||
|
||||
# get customcaptcha init and captcha_handler params
|
||||
init_params = inspect.getfullargspec(ImageToTextTask.ImageToTextTask.__init__)
|
||||
handler_params = inspect.getfullargspec(
|
||||
ImageToTextTask.ImageToTextTask.captcha_handler
|
||||
)
|
||||
handler_params = inspect.getfullargspec(ImageToTextTask.ImageToTextTask.captcha_handler)
|
||||
# check aio module params
|
||||
assert default_init_params == aioinit_params[0]
|
||||
assert default_handler_params == aiohandler_params[0]
|
||||
|
@ -51,17 +42,13 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
assert default_handler_params == handler_params[0]
|
||||
|
||||
def test_create_task_payload(self):
|
||||
customcaptcha = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail
|
||||
)
|
||||
customcaptcha = ImageToTextTask.ImageToTextTask(anticaptcha_key=self.anticaptcha_key_fail)
|
||||
# check response type
|
||||
assert isinstance(customcaptcha, ImageToTextTask.ImageToTextTask)
|
||||
|
||||
with requests_mock.Mocker() as req_mock:
|
||||
req_mock.register_uri("GET", self.image_url, json=self.VALID_RESPONSE_JSON)
|
||||
req_mock.register_uri(
|
||||
"POST", config.create_task_url, json=self.ERROR_RESPONSE_JSON
|
||||
)
|
||||
req_mock.register_uri("POST", config.create_task_url, json=self.ERROR_RESPONSE_JSON)
|
||||
customcaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
|
||||
history = req_mock.request_history
|
||||
|
@ -71,25 +58,19 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
request_payload = history[1].json()
|
||||
|
||||
# check all dict keys
|
||||
assert ["clientKey", "task", "languagePool", "softId"] == list(
|
||||
request_payload.keys()
|
||||
)
|
||||
assert ["clientKey", "task", "languagePool", "softId"] == list(request_payload.keys())
|
||||
assert request_payload["softId"] == config.app_key
|
||||
assert ["type", "body"] == list(request_payload["task"].keys())
|
||||
assert request_payload["task"]["type"] == "ImageToTextTask"
|
||||
|
||||
def test_get_result_payload(self):
|
||||
customcaptcha = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail
|
||||
)
|
||||
customcaptcha = ImageToTextTask.ImageToTextTask(anticaptcha_key=self.anticaptcha_key_fail)
|
||||
# check response type
|
||||
assert isinstance(customcaptcha, ImageToTextTask.ImageToTextTask)
|
||||
|
||||
with requests_mock.Mocker() as req_mock:
|
||||
req_mock.register_uri("GET", self.image_url, json=self.VALID_RESPONSE_JSON)
|
||||
req_mock.register_uri(
|
||||
"POST", config.create_task_url, json=self.VALID_RESPONSE_JSON
|
||||
)
|
||||
req_mock.register_uri("POST", config.create_task_url, json=self.VALID_RESPONSE_JSON)
|
||||
req_mock.register_uri(
|
||||
"POST", config.get_result_url, json=self.VALID_RESPONSE_RESULT_JSON
|
||||
)
|
||||
|
@ -110,9 +91,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
"""
|
||||
|
||||
def test_response_imagecaptcha(self):
|
||||
imagecaptcha = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail
|
||||
)
|
||||
imagecaptcha = ImageToTextTask.ImageToTextTask(anticaptcha_key=self.anticaptcha_key_fail)
|
||||
# check response type
|
||||
assert isinstance(imagecaptcha, ImageToTextTask.ImageToTextTask)
|
||||
|
||||
|
@ -144,14 +123,12 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
def test_fail_imagecaptcha_value(self):
|
||||
with pytest.raises(ValueError):
|
||||
assert ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=self.WRONG_SAVE_FORMAT,
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=self.WRONG_SAVE_FORMAT
|
||||
)
|
||||
|
||||
def test_fail_imagecaptcha_const(self):
|
||||
imagecaptcha = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[0],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[0]
|
||||
)
|
||||
|
||||
response = imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
|
@ -160,8 +137,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
|
||||
def test_fail_imagecaptcha_const_context(self):
|
||||
with ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[0],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[0]
|
||||
) as imagecaptcha:
|
||||
|
||||
response = imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
|
@ -170,8 +146,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
|
||||
def test_fail_imagecaptcha_temp(self):
|
||||
imagecaptcha = ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[1],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[1]
|
||||
)
|
||||
|
||||
response = imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
|
@ -180,8 +155,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
|
||||
def test_fail_imagecaptcha_temp_context(self):
|
||||
with ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[1],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[1]
|
||||
) as imagecaptcha:
|
||||
|
||||
response = imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
|
@ -192,15 +166,13 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
async def test_fail_aioimagecaptcha_value(self):
|
||||
with pytest.raises(ValueError):
|
||||
assert await ImageToTextTask.ImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=self.WRONG_SAVE_FORMAT,
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=self.WRONG_SAVE_FORMAT
|
||||
)
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_fail_aioimagecaptcha_temp(self):
|
||||
imagecaptcha = ImageToTextTask.aioImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[1],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[1]
|
||||
)
|
||||
response = await imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
assert 1 == response["errorId"]
|
||||
|
@ -208,8 +180,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
@pytest.mark.asyncio
|
||||
async def test_fail_aioimagecaptcha_temp_context(self):
|
||||
with ImageToTextTask.aioImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[1],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[1]
|
||||
) as imagecaptcha:
|
||||
response = await imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
assert 1 == response["errorId"]
|
||||
|
@ -217,8 +188,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
@pytest.mark.asyncio
|
||||
async def test_fail_aioimagecaptcha_const(self):
|
||||
imagecaptcha = ImageToTextTask.aioImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[0],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[0]
|
||||
)
|
||||
response = await imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
assert 1 == response["errorId"]
|
||||
|
@ -226,8 +196,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
@pytest.mark.asyncio
|
||||
async def test_fail_aioimagecaptcha_const_context(self):
|
||||
with ImageToTextTask.aioImageToTextTask(
|
||||
anticaptcha_key=self.anticaptcha_key_fail,
|
||||
save_format=ImageToTextTask.SAVE_FORMATS[0],
|
||||
anticaptcha_key=self.anticaptcha_key_fail, save_format=ImageToTextTask.SAVE_FORMATS[0]
|
||||
) as imagecaptcha:
|
||||
response = await imagecaptcha.captcha_handler(captcha_link=self.image_url)
|
||||
assert 1 == response["errorId"]
|
||||
|
|
|
@ -15,13 +15,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
|
||||
def test_recaptcha3_params(self):
|
||||
default_init_params = ["self", "anticaptcha_key", "sleep_time", "callbackUrl"]
|
||||
default_handler_params = [
|
||||
"self",
|
||||
"websiteURL",
|
||||
"websiteKey",
|
||||
"minScore",
|
||||
"pageAction",
|
||||
]
|
||||
default_handler_params = ["self", "websiteURL", "websiteKey", "minScore", "pageAction"]
|
||||
# get customcaptcha init and captcha_handler params
|
||||
aioinit_params = inspect.getfullargspec(
|
||||
ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless.__init__
|
||||
|
@ -72,9 +66,7 @@ class TestAntiCaptcha(MainAntiCaptcha):
|
|||
anticaptcha_key=self.anticaptcha_key_fail
|
||||
)
|
||||
# check response type
|
||||
assert isinstance(
|
||||
recaptcha, ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless
|
||||
)
|
||||
assert isinstance(recaptcha, ReCaptchaV3TaskProxyless.aioReCaptchaV3TaskProxyless)
|
||||
|
||||
response = await recaptcha.captcha_handler(
|
||||
websiteURL="https://www.google.com/recaptcha/api2/demo",
|
||||
|
|
Loading…
Reference in New Issue