diff --git a/README.md b/README.md index 50ed1f0..1a0551c 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Examples of API requests for different captcha types are available on the [Pytho - [Datadome](#datadome) - [CyberSiARA](#cybersiara) - [Other methods](#other-methods) - - [send / get_result](#send--get_result) + - [send / get\_result](#send--get_result) - [balance](#balance) - [report](#report) - [Error handling](#error-handling) @@ -53,10 +53,10 @@ Examples of API requests for different captcha types are available on the [Pytho - [Examples](#examples) - [Examples using Selenium](#examples-using-selenium) - [Useful articles](#useful-articles) -- [Get in touch](#get-in-touch) -- [Join the team 👪](#join-the-team-) -- [License](#license) - - [Graphics and Trademarks](#graphics-and-trademarks) + - [Get in touch](#get-in-touch) + - [Join the team 👪](#join-the-team-) + - [License](#license) + - [Graphics and Trademarks](#graphics-and-trademarks) ## Installation @@ -101,6 +101,8 @@ solver = TwoCaptcha(**config) | defaultTimeout | 120 | Polling timeout in seconds for all captcha types except reCAPTCHA. Defines how long the module tries to get the answer from the `res.php` API endpoint | | recaptchaTimeout | 600 | Polling timeout for reCAPTCHA in seconds. Defines how long the module tries to get the answer from the `res.php` API endpoint | | pollingInterval | 10 | Interval in seconds between requests to the `res.php` API endpoint. Setting values less than 5 seconds is not recommended | +| extendedResponse | None | Set to `True` to get the response with additional fields or in more practical format (enables `JSON` response from `res.php` API endpoint). Suitable for [hCaptcha](#hcaptcha), [ClickCaptcha](#clickcaptcha), [Canvas](#canvas) | + > [!IMPORTANT] > Once `callback` is defined for the `TwoCaptcha` instance, all methods return only the captcha ID and DO NOT poll the API to get the result. The result will be sent to the callback URL. diff --git a/examples/coordinates_options.py b/examples/coordinates_options.py index 5ee9fba..91f6000 100644 --- a/examples/coordinates_options.py +++ b/examples/coordinates_options.py @@ -13,7 +13,7 @@ api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY') -solver = TwoCaptcha(api_key, defaultTimeout=120, pollingInterval=5) +solver = TwoCaptcha(api_key, defaultTimeout=120, pollingInterval=5, extendedResponse=True) try: result = solver.coordinates('./images/grid_2.jpg', diff --git a/examples/geetest_options.py b/examples/geetest_options.py index 39c491c..35e74a8 100644 --- a/examples/geetest_options.py +++ b/examples/geetest_options.py @@ -13,7 +13,7 @@ api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY') -solver = TwoCaptcha(api_key, defaultTimeout=300, pollingInterval=10) +solver = TwoCaptcha(api_key, defaultTimeout=300, pollingInterval=10, extendedResponse=True) """ Important: the value of the 'challenge' parameter is dynamic, for each request to our API you need to get a new value. diff --git a/examples/hcaptcha_options.py b/examples/hcaptcha_options.py index 7a56dc9..80d5b3f 100644 --- a/examples/hcaptcha_options.py +++ b/examples/hcaptcha_options.py @@ -22,13 +22,14 @@ 'defaultTimeout': 120, 'recaptchaTimeout': 600, 'pollingInterval': 10, + 'extendedResponse': True, } solver = TwoCaptcha(**config) try: - result = solver.hcaptcha(sitekey='f7de0da3-3303-44e8-ab48-fa32ff8ccc7b', - url='https://2captcha.com/ru/demo/hcaptcha-invisible', + result = solver.hcaptcha(sitekey='c0421d06-b92e-47fc-ab9a-5caa43c04538', + url='https://2captcha.com/ru/demo/hcaptcha', # invisible=1, # data="rqdata", # useragent="", @@ -43,3 +44,4 @@ else: sys.exit('result: ' + str(result)) + diff --git a/twocaptcha/solver.py b/twocaptcha/solver.py index e1a2ad5..dbf4378 100755 --- a/twocaptcha/solver.py +++ b/twocaptcha/solver.py @@ -41,7 +41,8 @@ def __init__(self, defaultTimeout=120, recaptchaTimeout=600, pollingInterval=10, - server = '2captcha.com'): + server = '2captcha.com', + extendedResponse=None): self.API_KEY = apiKey self.soft_id = softId @@ -52,6 +53,7 @@ def __init__(self, self.api_client = ApiClient(post_url = str(server)) self.max_files = 9 self.exceptions = SolverExceptions + self.extendedResponse = extendedResponse def normal(self, file, **kwargs): '''Wrapper for solving a normal captcha (image). @@ -875,14 +877,23 @@ def solve(self, timeout=0, polling_interval=0, **kwargs): result = {'captchaId': id_} if self.callback is None: - timeout = float(timeout or self.default_timeout) sleep = int(polling_interval or self.polling_interval) code = self.wait_result(id_, timeout, sleep) - result.update({'code': code}) - return result + if self.extendedResponse == True: + + new_code = { + key if key != 'request' else 'code': value + for key, value in code.items() + if key != 'status' + } + result.update(new_code) + else: + result.update({'code': code}) + + return result def wait_result(self, id_, timeout, polling_interval): @@ -944,6 +955,7 @@ def send(self, **kwargs): return response[3:] def get_result(self, id_): + import json """This method can be used for manual captcha answer polling. Parameters @@ -955,15 +967,31 @@ def get_result(self, id_): answer : text """ - response = self.api_client.res(key=self.API_KEY, action='get', id=id_) + if self.extendedResponse == True: - if response == 'CAPCHA_NOT_READY': - raise NetworkException + response = self.api_client.res(key=self.API_KEY, action='get', id=id_, json=1) - if not response.startswith('OK|'): - raise ApiException(f'cannot recognize response {response}') + response_data = json.loads(response) - return response[3:] + if response_data.get("status") == 0: + raise NetworkException + + if not response_data.get("status") == 1: + raise ApiException(f'Unexpected status in response: {response_data}') + + return response_data + + else: + + response = self.api_client.res(key=self.API_KEY, action='get', id=id_) + + if response == 'CAPCHA_NOT_READY': + raise NetworkException + + if not response.startswith('OK|'): + raise ApiException(f'cannot recognize response {response}') + + return response[3:] def balance(self): '''Get my balance