Skip to content

Commit

Permalink
Merge pull request #107 from 2captcha/RC-2910-use-json-format
Browse files Browse the repository at this point in the history
RС-2910-use-json-format
  • Loading branch information
kratzky authored Aug 30, 2024
2 parents 2bd5b2d + 9dc0da4 commit df9f4af
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 19 deletions.
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion examples/coordinates_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
2 changes: 1 addition & 1 deletion examples/geetest_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 4 additions & 2 deletions examples/hcaptcha_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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="",
Expand All @@ -43,3 +44,4 @@

else:
sys.exit('result: ' + str(result))

48 changes: 38 additions & 10 deletions twocaptcha/solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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).
Expand Down Expand Up @@ -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):

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit df9f4af

Please sign in to comment.