Добавление возможности загрузки изображения в кодировке base64
Переезд на синтаксиси форматирования строк f'' - Python 3.6 Добавление проверки на минимально введённое время для ожидания решения капчи Изменение минимально требуемой версии aiohttp на 3+
This commit is contained in:
parent
37e956a65d
commit
485a1d3858
|
@ -1,5 +1,8 @@
|
||||||
# python3-anticaptcha
|
# python3-anticaptcha
|
||||||
|
|
||||||
|
[![PyPI version](https://badge.fury.io/py/python3-anticaptcha.svg)](https://badge.fury.io/py/python3-anticaptcha)
|
||||||
|
[![Code Climate](https://codeclimate.com/github/AndreiDrang/python3-anticaptcha/badges/gpa.svg)](https://codeclimate.com/github/AndreiDrang/python3-anticaptcha)
|
||||||
|
|
||||||
Python 3 library for AntiCaptcha.
|
Python 3 library for AntiCaptcha.
|
||||||
|
|
||||||
[Application in AppCenter](https://anti-captcha.com/clients/tools/appcenter/app/867).
|
[Application in AppCenter](https://anti-captcha.com/clients/tools/appcenter/app/867).
|
||||||
|
|
|
@ -18,20 +18,22 @@ class FunCaptchaTask:
|
||||||
:param kwargs: Можно передать необязательные параметры и переопределить userAgent, все необязательные параметры
|
:param kwargs: Можно передать необязательные параметры и переопределить userAgent, все необязательные параметры
|
||||||
описаны в документации к API на сайте антикапчи
|
описаны в документации к API на сайте антикапчи
|
||||||
"""
|
"""
|
||||||
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
self.task_payload = {"clientKey": anticaptcha_key,
|
self.task_payload = {"clientKey": anticaptcha_key,
|
||||||
"task":
|
"task":
|
||||||
{
|
{
|
||||||
"type": "FunCaptchaTask",
|
"type": "FunCaptchaTask",
|
||||||
"userAgent": user_agent_data,
|
"userAgent": user_agent_data,
|
||||||
"proxyType": proxyType,
|
"proxyType": proxyType,
|
||||||
"proxyAddress": proxyAddress,
|
"proxyAddress": proxyAddress,
|
||||||
"proxyPort": proxyPort,
|
"proxyPort": proxyPort,
|
||||||
},
|
},
|
||||||
"softId": app_key
|
"softId": app_key
|
||||||
}
|
}
|
||||||
|
|
||||||
# пайлоад для получения ответа сервиса
|
# пайлоад для получения ответа сервиса
|
||||||
self.result_payload = {"clientKey": anticaptcha_key}
|
self.result_payload = {"clientKey": anticaptcha_key}
|
||||||
|
@ -50,7 +52,7 @@ class FunCaptchaTask:
|
||||||
:return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
:return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
||||||
"""
|
"""
|
||||||
self.task_payload['task'].update({"websiteURL": websiteURL,
|
self.task_payload['task'].update({"websiteURL": websiteURL,
|
||||||
"websiteKey": websitePublicKey})
|
"websiteKey": websitePublicKey})
|
||||||
# Отправляем на антикапча параметры фанкапич,
|
# Отправляем на антикапча параметры фанкапич,
|
||||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
# в результате получаем 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()
|
||||||
|
@ -95,20 +97,22 @@ class aioFunCaptchaTask:
|
||||||
:param kwargs: Можно передать необязательные параметры и переопределить userAgent, все необязательные параметры
|
:param kwargs: Можно передать необязательные параметры и переопределить userAgent, все необязательные параметры
|
||||||
описаны в документации к API на сайте антикапчи
|
описаны в документации к API на сайте антикапчи
|
||||||
"""
|
"""
|
||||||
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
self.task_payload = {"clientKey": anticaptcha_key,
|
self.task_payload = {"clientKey": anticaptcha_key,
|
||||||
"task":
|
"task":
|
||||||
{
|
{
|
||||||
"type": "FunCaptchaTask",
|
"type": "FunCaptchaTask",
|
||||||
"userAgent": user_agent_data,
|
"userAgent": user_agent_data,
|
||||||
"proxyType": proxyType,
|
"proxyType": proxyType,
|
||||||
"proxyAddress": proxyAddress,
|
"proxyAddress": proxyAddress,
|
||||||
"proxyPort": proxyPort,
|
"proxyPort": proxyPort,
|
||||||
},
|
},
|
||||||
"softId": app_key
|
"softId": app_key
|
||||||
}
|
}
|
||||||
|
|
||||||
# пайлоад для получения ответа сервиса
|
# пайлоад для получения ответа сервиса
|
||||||
self.result_payload = {"clientKey": anticaptcha_key}
|
self.result_payload = {"clientKey": anticaptcha_key}
|
||||||
|
@ -127,7 +131,7 @@ class aioFunCaptchaTask:
|
||||||
:return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
:return: Возвращает ответ сервера в виде JSON(ответ так же можно глянуть в документации антикапчи)
|
||||||
"""
|
"""
|
||||||
self.task_payload['task'].update({"websiteURL": websiteURL,
|
self.task_payload['task'].update({"websiteURL": websiteURL,
|
||||||
"websiteKey": websitePublicKey})
|
"websiteKey": websitePublicKey})
|
||||||
# Отправляем на антикапча параметры фанкапич,
|
# Отправляем на антикапча параметры фанкапич,
|
||||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
|
|
|
@ -28,9 +28,17 @@ class ImageToTextTask:
|
||||||
:param language: Язык капчи
|
:param language: Язык капчи
|
||||||
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
||||||
'''
|
'''
|
||||||
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
self.save_format = save_format
|
# проверяем переданный параметр способа сохранения капчи
|
||||||
|
if save_format in ['const', 'temp']:
|
||||||
|
self.save_format = save_format
|
||||||
|
else:
|
||||||
|
raise ValueError('\nПередан неверный формат сохранения файла изображения. '
|
||||||
|
f'\n\tВозможные варинты: `temp` и `const`. Вы передали - `{save_format}`'
|
||||||
|
'\nWrong `save_format` parameter. Valid params: `const` or `temp`.'
|
||||||
|
f'\n\tYour param - `{save_format}`')
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
self.task_payload = {"clientKey": anticaptcha_key,
|
self.task_payload = {"clientKey": anticaptcha_key,
|
||||||
"task":
|
"task":
|
||||||
|
@ -94,8 +102,9 @@ class ImageToTextTask:
|
||||||
|
|
||||||
def read_captcha_image_file(self, content, content_type="file"):
|
def read_captcha_image_file(self, content, content_type="file"):
|
||||||
"""
|
"""
|
||||||
Функция отвечает за чтение уже сохранённого файла
|
Функция отвечает за чтение уже сохранённого файла или файла в уодировке base64
|
||||||
:param content: Параметр строка-путь указывающий на изображение капчи для отправки её на сервер
|
:param content: Параметр строка-путь указывающий на изображение капчи для отправки её на сервер
|
||||||
|
:param content_type: Тип переданной переменной. Возможны варианты: `file` и `base64`
|
||||||
:return: Возвращает ID капчи
|
:return: Возвращает ID капчи
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
|
@ -106,12 +115,15 @@ class ImageToTextTask:
|
||||||
elif content_type == "base64":
|
elif content_type == "base64":
|
||||||
self.task_payload["task"].update({"body": content})
|
self.task_payload["task"].update({"body": content})
|
||||||
else:
|
else:
|
||||||
raise Exception
|
raise ValueError('\nПередан неверный формат файла.'
|
||||||
|
f'\n\tВозможные варинты: `file` и `base64`. Вы передали - `{content_type}`'
|
||||||
|
f'\nWrong `content_type` parameter. Valid params: `file` or `base64`.'
|
||||||
|
f'\n\tYour param - `{content_type}`')
|
||||||
# Отправляем на антикапча изображение капчи и другие парметры,
|
# Отправляем на антикапча изображение капчи и другие парметры,
|
||||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||||
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
||||||
except IOError:
|
except (IOError, FileNotFoundError) as err:
|
||||||
raise ReadError()
|
raise ReadError(err)
|
||||||
|
|
||||||
return captcha_id
|
return captcha_id
|
||||||
|
|
||||||
|
@ -122,6 +134,7 @@ class ImageToTextTask:
|
||||||
RuCaptcha, дожидается решения капчи и вовзращает вам результат
|
RuCaptcha, дожидается решения капчи и вовзращает вам результат
|
||||||
:param captcha_link: Ссылка на изображение
|
:param captcha_link: Ссылка на изображение
|
||||||
:param captcha_file: Необязательный параметр, служит для открытия уже скачанных файлов изображений.
|
:param captcha_file: Необязательный параметр, служит для открытия уже скачанных файлов изображений.
|
||||||
|
:param captcha_base64: Загрузка изображения в кодировке base64
|
||||||
:return: Возвращает весь ответ сервера JSON-строкой.
|
:return: Возвращает весь ответ сервера JSON-строкой.
|
||||||
'''
|
'''
|
||||||
if captcha_file:
|
if captcha_file:
|
||||||
|
@ -183,8 +196,17 @@ class aioImageToTextTask:
|
||||||
:param language: Язык капчи
|
:param language: Язык капчи
|
||||||
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
:param **kwargs: За подробной информацией обратитесь к документации на сайте anticaptcha.
|
||||||
'''
|
'''
|
||||||
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 10. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
self.save_format = save_format
|
# проверяем переданный параметр способа сохранения капчи
|
||||||
|
if save_format in ['const', 'temp']:
|
||||||
|
self.save_format = save_format
|
||||||
|
else:
|
||||||
|
raise ValueError('\nПередан неверный формат сохранения файла изображения. '
|
||||||
|
f'\n\tВозможные варинты: `temp` и `const`. Вы передали - `{save_format}`'
|
||||||
|
'\nWrong `save_format` parameter. Valid params: `const` or `temp`.'
|
||||||
|
f'\n\tYour param - `{save_format}`')
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
self.task_payload = {"clientKey": anticaptcha_key,
|
self.task_payload = {"clientKey": anticaptcha_key,
|
||||||
|
@ -260,21 +282,35 @@ class aioImageToTextTask:
|
||||||
os.remove(os.path.join(img_path, "im-{0}.png".format(image_hash)))
|
os.remove(os.path.join(img_path, "im-{0}.png".format(image_hash)))
|
||||||
return captcha_id
|
return captcha_id
|
||||||
|
|
||||||
async def read_captcha_image_file(self, content):
|
async def read_captcha_image_file(self, content, content_type='file'):
|
||||||
|
"""
|
||||||
|
Функция отвечает за чтение уже сохранённого файла или файла в уодировке base64
|
||||||
|
:param content: Параметр строка-путь указывающий на изображение капчи для отправки её на сервер
|
||||||
|
:param content_type: Тип переданной переменной. Возможны варианты: `file` и `base64`
|
||||||
|
:return: Возвращает ID капчи
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
with open(content, 'rb') as captcha_image:
|
if content_type == "file":
|
||||||
# Добавляем в пайлоад картинку и отправляем
|
with open(content, 'rb') as captcha_image:
|
||||||
self.task_payload['task'].update({"body": base64.b64encode(captcha_image.read()).decode('utf-8')})
|
# Добавляем в пайлоад картинку и отправляем
|
||||||
# Отправляем на антикапча изображение капчи и другие парметры,
|
self.task_payload['task'].update({"body": base64.b64encode(captcha_image.read()).decode('utf-8')})
|
||||||
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
elif content_type == "base64":
|
||||||
captcha_id = requests.post(create_task_url, json=self.task_payload).json()
|
self.task_payload["task"].update({"body": content})
|
||||||
except IOError:
|
else:
|
||||||
raise ReadError()
|
raise ValueError('\nПередан неверный формат файла.'
|
||||||
|
f'\n\tВозможные варинты: `file` и `base64`. Вы передали - `{content_type}`'
|
||||||
|
f'\nWrong `content_type` parameter. Valid params: `file` or `base64`.'
|
||||||
|
f'\n\tYour param - `{content_type}`')
|
||||||
|
# Отправляем на антикапча изображение капчи и другие парметры,
|
||||||
|
# в результате получаем JSON ответ содержащий номер решаемой капчи
|
||||||
|
captcha_id = requests.post(create_task_url, json = self.task_payload).json()
|
||||||
|
except (IOError, FileNotFoundError) as err:
|
||||||
|
raise ReadError(err)
|
||||||
|
|
||||||
return captcha_id
|
return captcha_id
|
||||||
|
|
||||||
# Работа с капчёй
|
# Работа с капчёй
|
||||||
async def captcha_handler(self, captcha_link = None, captcha_file = None):
|
async def captcha_handler(self, captcha_link = None, captcha_file = None, captcha_base64=None):
|
||||||
'''
|
'''
|
||||||
Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер
|
Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер
|
||||||
RuCaptcha, дожидается решения капчи и вовзращает вам результат
|
RuCaptcha, дожидается решения капчи и вовзращает вам результат
|
||||||
|
@ -283,7 +319,9 @@ class aioImageToTextTask:
|
||||||
'''
|
'''
|
||||||
# если был передан линк на локальный скачаный файл
|
# если был передан линк на локальный скачаный файл
|
||||||
if captcha_file:
|
if captcha_file:
|
||||||
captcha_id = await self.read_captcha_image_file(captcha_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")
|
||||||
elif captcha_link:
|
elif captcha_link:
|
||||||
# согласно значения переданного параметра выбираем функцию для сохранения изображения
|
# согласно значения переданного параметра выбираем функцию для сохранения изображения
|
||||||
if self.save_format == 'const':
|
if self.save_format == 'const':
|
||||||
|
|
|
@ -19,6 +19,9 @@ class NoCaptchaTask:
|
||||||
:param sleeptime: Время ожидания решения
|
:param sleeptime: Время ожидания решения
|
||||||
:param kwargs: Необязательные параметры, можно переопределить userAgent
|
:param kwargs: Необязательные параметры, можно переопределить userAgent
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
|
|
|
@ -14,7 +14,8 @@ class NoCaptchaTaskProxyless:
|
||||||
:param sleep_time: Время ожидания решения капчи
|
:param sleep_time: Время ожидания решения капчи
|
||||||
:param kwargs: Другие необязательные параметры из документации
|
:param kwargs: Другие необязательные параметры из документации
|
||||||
"""
|
"""
|
||||||
self.ANTICAPTCHA_KEY = anticaptcha_key
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
|
@ -27,7 +28,7 @@ class NoCaptchaTaskProxyless:
|
||||||
}
|
}
|
||||||
|
|
||||||
# Пайлоад для получения результата
|
# Пайлоад для получения результата
|
||||||
self.result_payload = {"clientKey": self.ANTICAPTCHA_KEY}
|
self.result_payload = {"clientKey": anticaptcha_key}
|
||||||
|
|
||||||
# Если переданы ещё параметры - вносим их в payload
|
# Если переданы ещё параметры - вносим их в payload
|
||||||
if kwargs:
|
if kwargs:
|
||||||
|
@ -84,7 +85,8 @@ class aioNoCaptchaTaskProxyless:
|
||||||
:param sleep_time: Время ожидания решения капчи
|
:param sleep_time: Время ожидания решения капчи
|
||||||
:param kwargs: Другие необязательные параметры из документации
|
:param kwargs: Другие необязательные параметры из документации
|
||||||
"""
|
"""
|
||||||
self.ANTICAPTCHA_KEY = anticaptcha_key
|
if sleep_time < 5:
|
||||||
|
raise ValueError(f'Параметр `sleep_time` должен быть не менее 5. Вы передали - {sleep_time}')
|
||||||
self.sleep_time = sleep_time
|
self.sleep_time = sleep_time
|
||||||
|
|
||||||
# Пайлоад для создания задачи
|
# Пайлоад для создания задачи
|
||||||
|
@ -97,7 +99,7 @@ class aioNoCaptchaTaskProxyless:
|
||||||
}
|
}
|
||||||
|
|
||||||
# Пайлоад для получения результата
|
# Пайлоад для получения результата
|
||||||
self.result_payload = {"clientKey": self.ANTICAPTCHA_KEY}
|
self.result_payload = {"clientKey": anticaptcha_key}
|
||||||
|
|
||||||
# Если переданы ещё параметры - вносим их в payload
|
# Если переданы ещё параметры - вносим их в payload
|
||||||
if kwargs:
|
if kwargs:
|
||||||
|
|
|
@ -8,8 +8,9 @@ class DownloadError(AntiCaptchaApiException):
|
||||||
|
|
||||||
|
|
||||||
class ReadError(AntiCaptchaApiException):
|
class ReadError(AntiCaptchaApiException):
|
||||||
def __init__(self):
|
def __init__(self, error):
|
||||||
AntiCaptchaApiException.__init__(self, """\nПораждается, при проблеме во время чтения сохранённого файла.""")
|
AntiCaptchaApiException.__init__(self, """\nПораждается, при проблеме во время чтения сохранённого файла.
|
||||||
|
\n\t{0}""".format(error))
|
||||||
|
|
||||||
|
|
||||||
class ParamError(AntiCaptchaApiException):
|
class ParamError(AntiCaptchaApiException):
|
||||||
|
|
6
setup.py
6
setup.py
|
@ -2,14 +2,14 @@ from setuptools import setup
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='python3-anticaptcha',
|
name='python3-anticaptcha',
|
||||||
version='0.9.2',
|
version='0.9.3',
|
||||||
author='AndreiDrang, redV0ID',
|
author='AndreiDrang, redV0ID',
|
||||||
|
|
||||||
packages=['python3_anticaptcha'],
|
packages=['python3_anticaptcha'],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
'fake-useragent==0.1.10',
|
'fake-useragent==0.1.10',
|
||||||
'requests>=2.18',
|
'requests>=2.18',
|
||||||
'aiohttp>=2.3'
|
'aiohttp>=3'
|
||||||
],
|
],
|
||||||
description='Python 3 AntiCaptcha library.',
|
description='Python 3 AntiCaptcha library.',
|
||||||
url='https://github.com/AndreiDrang/python3-anticaptcha',
|
url='https://github.com/AndreiDrang/python3-anticaptcha',
|
||||||
|
@ -25,5 +25,5 @@ setup(
|
||||||
python-library
|
python-library
|
||||||
python-anticaptcha
|
python-anticaptcha
|
||||||
anticaptcha-client''',
|
anticaptcha-client''',
|
||||||
python_requires='>=3.5.0',
|
python_requires='>=3.6',
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue