Source code for woob.tools.application.captcha
from threading import Lock, Event
from woob.capabilities.captcha import CapCaptchaSolver
from woob.core import Woob
__all__ = ['CaptchaMixin']
[docs]class CaptchaMixin:
def __init__(self, *args, **kwargs):
super(CaptchaMixin, self).__init__(*args, **kwargs)
self.captcha_woob = Woob()
self.captcha_woob.load_backends(caps=[CapCaptchaSolver])
[docs] def solve_captcha(self, job, backend):
def call_solver(solver_backend, job):
with lock:
if solved.is_set():
solver_backend.logger.info('already solved, ignoring')
return
ret = solver_backend.solve_captcha_blocking(job)
if ret:
solver_backend.logger.info('backend solved job')
backend.config['captcha_response'].set(ret.solution)
solved.set()
def all_solvers_finished():
if not solved.is_set():
print('Error(%s): CAPTCHA could not be solved.' % backend.name, file=self.stderr)
else:
print('Info(%s): CAPTCHA was successfully solved. Please retry operation.' % backend.name, file=self.stderr)
lock = Lock()
solved = Event()
bres = self.captcha_woob.do(call_solver, job)
bres.callback_thread(None, None, all_solvers_finished)