Добавление возможности загрузки изображения в кодировке base64

Переезд на синтаксиси форматирования строк f'' - Python 3.6
Добавление проверки на минимально введённое время для ожидания решения капчи
Изменение минимально требуемой версии aiohttp на 3+
This commit is contained in:
Andrei 2018-05-15 14:12:20 +03:00
parent 37e956a65d
commit 485a1d3858
7 changed files with 101 additions and 50 deletions

View File

@ -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).

View File

@ -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:

View File

@ -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':

View File

@ -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
# Пайлоад для создания задачи # Пайлоад для создания задачи

View File

@ -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:

View File

@ -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):

View File

@ -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',
) )