76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
from __future__ import absolute_import
|
|
from ..exceptions import (
|
|
reCaptchaParameter,
|
|
reCaptchaTimeout,
|
|
reCaptchaAPIError
|
|
)
|
|
|
|
try:
|
|
from python_anticaptcha import (
|
|
AnticaptchaClient,
|
|
NoCaptchaTaskProxylessTask,
|
|
HCaptchaTaskProxyless,
|
|
AnticaptchaException
|
|
)
|
|
except ImportError:
|
|
raise ImportError(
|
|
"Please install/upgrade the python module 'python_anticaptcha' via "
|
|
"pip install python-anticaptcha or https://github.com/ad-m/python-anticaptcha/"
|
|
)
|
|
|
|
import sys
|
|
|
|
from . import reCaptcha
|
|
|
|
|
|
class captchaSolver(reCaptcha):
|
|
|
|
def __init__(self):
|
|
if sys.modules['python_anticaptcha'].__version__ < 0.6:
|
|
raise ImportError(
|
|
"Please upgrade the python module 'python_anticaptcha' via "
|
|
"pip install -U python-anticaptcha or https://github.com/ad-m/python-anticaptcha/"
|
|
)
|
|
super(captchaSolver, self).__init__('anticaptcha')
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
def getCaptchaAnswer(self, captchaType, url, siteKey, reCaptchaParams):
|
|
if not reCaptchaParams.get('api_key'):
|
|
raise reCaptchaParameter("anticaptcha: Missing api_key parameter.")
|
|
|
|
client = AnticaptchaClient(reCaptchaParams.get('api_key'))
|
|
|
|
if reCaptchaParams.get('proxy'):
|
|
client.session.proxies = reCaptchaParams.get('proxies')
|
|
|
|
captchaMap = {
|
|
'reCaptcha': NoCaptchaTaskProxylessTask,
|
|
'hCaptcha': HCaptchaTaskProxyless
|
|
}
|
|
|
|
task = captchaMap[captchaType](url, siteKey)
|
|
|
|
if not hasattr(client, 'createTaskSmee'):
|
|
raise NotImplementedError(
|
|
"Please upgrade 'python_anticaptcha' via pip or download it from "
|
|
"https://github.com/ad-m/python-anticaptcha/tree/hcaptcha"
|
|
)
|
|
|
|
job = client.createTaskSmee(task, timeout=180)
|
|
|
|
try:
|
|
job.join(maximum_time=180)
|
|
except (AnticaptchaException) as e:
|
|
raise reCaptchaTimeout('{}'.format(getattr(e, 'message', e)))
|
|
|
|
if 'solution' in job._last_result:
|
|
return job.get_solution_response()
|
|
else:
|
|
raise reCaptchaAPIError('Job did not return `solution` key in payload.')
|
|
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
captchaSolver()
|