From 5060556c941ca7dd6634914737bce37429be0b2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 21:29:18 +0000 Subject: [PATCH 01/13] Update autodoc-pydantic requirement from ==1.9.* to ==2.0.* Updates the requirements on [autodoc-pydantic](https://github.com/mansenfranzen/autodoc_pydantic) to permit the latest version. - [Changelog](https://github.com/mansenfranzen/autodoc_pydantic/blob/main/changelog.rst) - [Commits](https://github.com/mansenfranzen/autodoc_pydantic/compare/v1.9.0...v2.0.1) --- updated-dependencies: - dependency-name: autodoc-pydantic dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 49dad5b..2926897 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,3 @@ pallets_sphinx_themes==2.* myst-parser==2.0.* -autodoc_pydantic==1.9.* +autodoc_pydantic==2.0.* From d3f17e2ce0b9276c8e061af6cc8be8992d28eece Mon Sep 17 00:00:00 2001 From: Andrei Date: Mon, 4 Sep 2023 07:16:25 +0300 Subject: [PATCH 02/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e0e641..88e6f93 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ At the lowest price on the market, you may receive a variety of solutions, inclu [![PyPI version](https://badge.fury.io/py/python3-capsolver.svg)](https://badge.fury.io/py/python3-capsolver) [![Python versions](https://img.shields.io/pypi/pyversions/python3-capsolver.svg?logo=python&logoColor=FBE072)](https://badge.fury.io/py/python3-capsolver) -[![Downloads](https://pepy.tech/badge/python3-capsolver/month)](https://pepy.tech/project/python3-capsolver) +[![Downloads](https://static.pepy.tech/badge/python3-capsolver/month)](https://pepy.tech/project/python3-capsolver) [![Maintainability](https://api.codeclimate.com/v1/badges/3c30167b5fb37a0775ea/maintainability)](https://codeclimate.com/github/AndreiDrang/python3-capsolver/maintainability) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/323d4eda0fe1477bbea8fe8902b9e97e)](https://www.codacy.com/gh/AndreiDrang/python3-capsolver/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AndreiDrang/python3-capsolver&utm_campaign=Badge_Grade) From 488f58170bb07120e4736e4d16631e69a0165b68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:04:15 +0000 Subject: [PATCH 03/13] Bump black from 23.7.0 to 23.9.1 Bumps [black](https://github.com/psf/black) from 23.7.0 to 23.9.1. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.7.0...23.9.1) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.style.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.style.txt b/requirements.style.txt index 0264da2..a2f0707 100644 --- a/requirements.style.txt +++ b/requirements.style.txt @@ -1,4 +1,4 @@ # codestyle isort==5.* -black==23.7.0 +black==23.9.1 autoflake==2.* From eeb4204c6923f2685f7d58aab948600f96676e2f Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 17:44:17 +0300 Subject: [PATCH 04/13] Update conftest.py --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3b6aa51..33da908 100755 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,12 +8,12 @@ @pytest.fixture(scope="function") def delay_func(): - time.sleep(0.5) + time.sleep(2) @pytest.fixture(scope="class") def delay_class(): - time.sleep(2) + time.sleep(5) @pytest.mark.usefixtures("delay_func") From a8b854fd551332bb33a7e9f587ac561691f7ad2a Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:04:59 +0300 Subject: [PATCH 05/13] added AntiAkamaiBMPTask --- docs/conf.py | 1 + docs/index.rst | 1 + docs/modules/akamai/example.rst | 12 ++ docs/modules/serializer/info.rst | 10 ++ src/python3_capsolver/akamai.py | 143 +++++++++++++++++++++++ src/python3_capsolver/core/enum.py | 7 ++ src/python3_capsolver/core/serializer.py | 6 + 7 files changed, 180 insertions(+) create mode 100644 docs/modules/akamai/example.rst create mode 100644 src/python3_capsolver/akamai.py diff --git a/docs/conf.py b/docs/conf.py index ba14013..2e10f84 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,6 +5,7 @@ from python3_capsolver import ( core, + akamai, gee_test, hcaptcha, recaptcha, diff --git a/docs/index.rst b/docs/index.rst index 170c03e..80eab72 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -32,6 +32,7 @@ The library is intended for software developers and is used to work with the `Ca modules/cloudflare/example.rst modules/aws-waf/example.rst modules/cyber-si-ara/example.rst + modules/akamai/example.rst .. toctree:: :maxdepth: 2 diff --git a/docs/modules/akamai/example.rst b/docs/modules/akamai/example.rst new file mode 100644 index 0000000..62c4769 --- /dev/null +++ b/docs/modules/akamai/example.rst @@ -0,0 +1,12 @@ +Akamai +====== + +To import this module: + +.. code-block:: python + + from python3_capsolver.akamai import Akamai + + +.. autoclass:: python3_capsolver.akamai.Akamai + :members: \ No newline at end of file diff --git a/docs/modules/serializer/info.rst b/docs/modules/serializer/info.rst index ea044b2..acefab7 100644 --- a/docs/modules/serializer/info.rst +++ b/docs/modules/serializer/info.rst @@ -16,3 +16,13 @@ To import this module: .. autopydantic_model:: python3_capsolver.core.serializer.WebsiteDataOptionsSer :members: :undoc-members: + + +.. autopydantic_model:: python3_capsolver.core.serializer.CyberSiAraSer + :members: + :undoc-members: + + +.. autopydantic_model:: python3_capsolver.core.serializer.AntiAkamaiBMPTaskSer + :members: + :undoc-members: diff --git a/src/python3_capsolver/akamai.py b/src/python3_capsolver/akamai.py new file mode 100644 index 0000000..fdb6df9 --- /dev/null +++ b/src/python3_capsolver/akamai.py @@ -0,0 +1,143 @@ +from typing import Union + +from python3_capsolver.core.base import BaseCaptcha +from python3_capsolver.core.enum import AntiAkamaiTaskEnm, EndpointPostfixEnm +from python3_capsolver.core.serializer import PostRequestSer, CaptchaResponseSer, AntiAkamaiBMPTaskSer + + +class Akamai(BaseCaptcha): + """ + The class is used to work with Capsolver AntiAkamai methods. + + Args: + api_key: Capsolver API key + captcha_type: Captcha type name, like ``AntiAkamaiBMPTask`` and etc. + packageName: Package name of AkamaiBMP mobile APP + version: AKAMAI BMP Version number, default is: 3.2.6 , max support 3.3.1 + + Examples: + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type="AntiAkamaiBMPTask", + ... packageName="de.zalando.iphone", + ... country="US", + ... deviceId="90F9EAF5-D6E5-4E30-BC8B-B7780AD02600", + ... deviceName="iPhone14,2/16.0.2", + ... count=10, + ... ).captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'deviceId': '90F9EAF...'} + ) + + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiBMPTask, + ... ).captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'deviceId': '6DKFOD0...'} + ) + + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiBMPTask, + ... **{ + ... "version": "3.2.6", + ... "deviceId": "90F9EAF5-D6E5-4E30-BC8B-B7780AD02600", + ... "deviceName": "iPhone14,2/16.0.2", + ... "count": 10, + ... }, + ... ).captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId="87f149f4-1c....", + status=, + solution={'deviceId': '90F9EAF...'} + ) + + >>> await Akamai(api_key="CAI-BA9650D2B9C2786B21120D512702E010", + ... captcha_type="AntiAkamaiBMPTask", + ... packageName="de.zalando.iphone", + ... country="US", + ... deviceId="90F9EAF5-D6E5-4E30-BC8B-B7780AD02600", + ... deviceName="iPhone14,2/16.0.2", + ... count=10, + ... ).aio_captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'deviceId': '90F9EAF...'} + ) + + Returns: + CaptchaResponseSer model with full server response + + Notes: + https://docs.capsolver.com/guide/antibots/akamaibmp.html + https://docs.capsolver.com/guide/antibots/akamaiweb.html + """ + + serializer = PostRequestSer + + def __init__( + self, + captcha_type: Union[AntiAkamaiTaskEnm, str], + packageName: str = "de.zalando.iphone", + version: str = "3.2.6", + country: str = "US", + *args, + **kwargs, + ): + super().__init__(*args, **kwargs) + + if captcha_type == AntiAkamaiTaskEnm.AntiAkamaiBMPTask: + self.task_params = AntiAkamaiBMPTaskSer(**locals()).dict() + else: + raise ValueError( + f"""Invalid `captcha_type` parameter set for `{self.__class__.__name__}`, + available - {AntiAkamaiTaskEnm.list_values()}""" + ) + + for key in kwargs: + self.task_params.update({key: kwargs[key]}) + + def captcha_handler(self) -> CaptchaResponseSer: + """ + Sync solving method + + Returns: + CaptchaResponseSer model with full service response + + Notes: + Check class docstring for more info + """ + self._prepare_create_task_payload(serializer=self.serializer, create_params=self.task_params) + return CaptchaResponseSer( + **self._create_task( + url_postfix=EndpointPostfixEnm.AKAMAI_BMP_INVOKE.value, + ) + ) + + async def aio_captcha_handler(self) -> CaptchaResponseSer: + """ + Async method for captcha solving + + Returns: + CaptchaResponseSer model with full service response + + Notes: + Check class docstring for more info + """ + self._prepare_create_task_payload(serializer=self.serializer, create_params=self.task_params) + return CaptchaResponseSer( + **await self._aio_create_task( + url_postfix=EndpointPostfixEnm.AKAMAI_BMP_INVOKE.value, + ) + ) diff --git a/src/python3_capsolver/core/enum.py b/src/python3_capsolver/core/enum.py index 86fbd12..6288204 100644 --- a/src/python3_capsolver/core/enum.py +++ b/src/python3_capsolver/core/enum.py @@ -39,6 +39,8 @@ class EndpointPostfixEnm(str, MyEnum): GET_BALANCE = "getBalance" CREATE_TASK = "createTask" GET_TASK_RESULT = "getTaskResult" + AKAMAI_BMP_INVOKE = "/akamaibmp/invoke" + AKAMAI_WEB_INVOKE = "/akamaiweb/invoke" class ImageToTextTaskTypeEnm(str, MyEnum): @@ -110,6 +112,11 @@ class AntiCyberSiAraTaskTypeEnm(str, MyEnum): AntiCyberSiAraTaskProxyLess = "AntiCyberSiAraTaskProxyLess" +class AntiAkamaiTaskEnm(str, MyEnum): + AntiAkamaiBMPTask = "AntiAkamaiBMPTask" + AntiAkamaiWebTask = "AntiAkamaiWebTask" + + class ResponseStatusEnm(str, MyEnum): """ Enum store results `status` field variants diff --git a/src/python3_capsolver/core/serializer.py b/src/python3_capsolver/core/serializer.py index 5c6d96a..b7cfc44 100644 --- a/src/python3_capsolver/core/serializer.py +++ b/src/python3_capsolver/core/serializer.py @@ -132,3 +132,9 @@ class CyberSiAraSer(WebsiteDataOptionsSer): ..., description="You can get MasterUrlId param form `api/CyberSiara/GetCyberSiara` endpoint request" ) UserAgent: str = Field(..., description="Browser userAgent, you need submit your userAgent") + + +class AntiAkamaiBMPTaskSer(BaseModel): + packageName: str = Field("de.zalando.iphone", description="Package name of AkamaiBMP mobile APP") + version: str = Field("3.2.6", description="AKAMAI BMP Version number") + country: str = Field("US", description="AKAMAI BMP country") From 7a772ca09cb32dcff91f9fd426af5a1fd9bb61e2 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:11:46 +0300 Subject: [PATCH 06/13] Update requirements.txt --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 2926897..1da77a4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,3 @@ pallets_sphinx_themes==2.* myst-parser==2.0.* -autodoc_pydantic==2.0.* +autodoc_pydantic==1.9.0 From 6c434b021892db74e931f3781a0093e984be1e12 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:11:53 +0300 Subject: [PATCH 07/13] Update requirements.txt --- src/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/requirements.txt b/src/requirements.txt index 25dc494..8f33df9 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,4 +1,4 @@ requests>=2.21.0 aiohttp>=3.7.4 -pydantic==1.* +pydantic==1.10.* tenacity==8.* From d18886da66f5afd6d4ee0fa7c1ba0b001bbaabe6 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:27:57 +0300 Subject: [PATCH 08/13] added AntiAkamaiWebTask --- src/python3_capsolver/akamai.py | 63 +++++++++++++++++++++--- src/python3_capsolver/core/serializer.py | 4 ++ 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/python3_capsolver/akamai.py b/src/python3_capsolver/akamai.py index fdb6df9..8f70fb8 100644 --- a/src/python3_capsolver/akamai.py +++ b/src/python3_capsolver/akamai.py @@ -2,7 +2,12 @@ from python3_capsolver.core.base import BaseCaptcha from python3_capsolver.core.enum import AntiAkamaiTaskEnm, EndpointPostfixEnm -from python3_capsolver.core.serializer import PostRequestSer, CaptchaResponseSer, AntiAkamaiBMPTaskSer +from python3_capsolver.core.serializer import ( + PostRequestSer, + CaptchaResponseSer, + AntiAkamaiBMPTaskSer, + AntiAkamaiWebTaskSer, +) class Akamai(BaseCaptcha): @@ -32,6 +37,21 @@ class Akamai(BaseCaptcha): solution={'deviceId': '90F9EAF...'} ) + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type="AntiAkamaiWebTask", + ... url="https://www.xxxx.com/nMRH2/aYJ/PQ4b/32/0peDlm/b9f5NJcXf7tiYE/OE9CMGI1/Nzsn/bCVKCnA", + ... abck="14164862507BD4......", + ... bmsz="4E3C....33", + ... userAgent="Mozilla/5.0 (Wi....", + ... ).captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'sensorData': '2;3159346;4338233...'} + ) + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiBMPTask, ... ).captcha_handler() @@ -43,6 +63,18 @@ class Akamai(BaseCaptcha): solution={'deviceId': '6DKFOD0...'} ) + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiWebTask, + ... url="https://www.xxxx.com/nMRH2/aYJ/PQ4b/32/0peDlm/b9f5NJcXf7tiYE/OE9CMGI1/Nzsn/bCVKCnA", + ... ).captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'sensorData': '2;3159346;4338233...'} + ) + >>> Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiBMPTask, ... **{ @@ -76,6 +108,18 @@ class Akamai(BaseCaptcha): solution={'deviceId': '90F9EAF...'} ) + >>> await Akamai(api_key="CAI-BA9XXXXXXXXXXXXX2702E010", + ... captcha_type=AntiAkamaiTaskEnm.AntiAkamaiWebTask, + ... url="https://www.xxxx.com/nMRH2/aYJ/PQ4b/32/0peDlm/b9f5NJcXf7tiYE/OE9CMGI1/Nzsn/bCVKCnA", + ... ).aio_captcha_handler() + CaptchaResponseSer(errorId=0, + errorCode=None, + errorDescription=None, + taskId='73bdcd28-6c77-4414-8....', + status=, + solution={'sensorData': '2;3159346;4338233...'} + ) + Returns: CaptchaResponseSer model with full server response @@ -84,21 +128,26 @@ class Akamai(BaseCaptcha): https://docs.capsolver.com/guide/antibots/akamaiweb.html """ - serializer = PostRequestSer - def __init__( self, captcha_type: Union[AntiAkamaiTaskEnm, str], packageName: str = "de.zalando.iphone", version: str = "3.2.6", country: str = "US", + url: str = None, *args, **kwargs, ): super().__init__(*args, **kwargs) + self.__serializer = PostRequestSer + self.__url_postfix = None if captcha_type == AntiAkamaiTaskEnm.AntiAkamaiBMPTask: self.task_params = AntiAkamaiBMPTaskSer(**locals()).dict() + self.__url_postfix = EndpointPostfixEnm.AKAMAI_BMP_INVOKE.value + elif captcha_type == AntiAkamaiTaskEnm.AntiAkamaiWebTask: + self.task_params = AntiAkamaiWebTaskSer(**locals()).dict() + self.__url_postfix = EndpointPostfixEnm.AKAMAI_WEB_INVOKE.value else: raise ValueError( f"""Invalid `captcha_type` parameter set for `{self.__class__.__name__}`, @@ -118,10 +167,10 @@ def captcha_handler(self) -> CaptchaResponseSer: Notes: Check class docstring for more info """ - self._prepare_create_task_payload(serializer=self.serializer, create_params=self.task_params) + self._prepare_create_task_payload(serializer=self.__serializer, create_params=self.task_params) return CaptchaResponseSer( **self._create_task( - url_postfix=EndpointPostfixEnm.AKAMAI_BMP_INVOKE.value, + url_postfix=self.__url_postfix, ) ) @@ -135,9 +184,9 @@ async def aio_captcha_handler(self) -> CaptchaResponseSer: Notes: Check class docstring for more info """ - self._prepare_create_task_payload(serializer=self.serializer, create_params=self.task_params) + self._prepare_create_task_payload(serializer=self.__serializer, create_params=self.task_params) return CaptchaResponseSer( **await self._aio_create_task( - url_postfix=EndpointPostfixEnm.AKAMAI_BMP_INVOKE.value, + url_postfix=self.__url_postfix, ) ) diff --git a/src/python3_capsolver/core/serializer.py b/src/python3_capsolver/core/serializer.py index b7cfc44..162f592 100644 --- a/src/python3_capsolver/core/serializer.py +++ b/src/python3_capsolver/core/serializer.py @@ -138,3 +138,7 @@ class AntiAkamaiBMPTaskSer(BaseModel): packageName: str = Field("de.zalando.iphone", description="Package name of AkamaiBMP mobile APP") version: str = Field("3.2.6", description="AKAMAI BMP Version number") country: str = Field("US", description="AKAMAI BMP country") + + +class AntiAkamaiWebTaskSer(BaseModel): + url: str = Field(..., description="Browser url address") From 4c533b344bb3503ab3ad2fac0e85328c79fd2ecd Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:29:42 +0300 Subject: [PATCH 09/13] Update info.rst --- docs/modules/serializer/info.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/modules/serializer/info.rst b/docs/modules/serializer/info.rst index acefab7..733f3a7 100644 --- a/docs/modules/serializer/info.rst +++ b/docs/modules/serializer/info.rst @@ -26,3 +26,7 @@ To import this module: .. autopydantic_model:: python3_capsolver.core.serializer.AntiAkamaiBMPTaskSer :members: :undoc-members: + +.. autopydantic_model:: python3_capsolver.core.serializer.AntiAkamaiWebTaskSer + :members: + :undoc-members: \ No newline at end of file From 31d2908fe3d5a1c9319cfd8be72069d03c05ade7 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:29:49 +0300 Subject: [PATCH 10/13] 0.8 --- src/python3_capsolver/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python3_capsolver/__version__.py b/src/python3_capsolver/__version__.py index a5f830a..26421e1 100644 --- a/src/python3_capsolver/__version__.py +++ b/src/python3_capsolver/__version__.py @@ -1 +1 @@ -__version__ = "0.7.1" +__version__ = "0.8" From 65c56807601a6277b4462596b26ebce2eb5a1c2f Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:37:44 +0300 Subject: [PATCH 11/13] Create test_akamai.py --- tests/test_akamai.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/test_akamai.py diff --git a/tests/test_akamai.py b/tests/test_akamai.py new file mode 100644 index 0000000..063daff --- /dev/null +++ b/tests/test_akamai.py @@ -0,0 +1,25 @@ +import pytest + +from tests.conftest import BaseTest +from python3_capsolver.akamai import Akamai + + +class TestAkamaiBase(BaseTest): + AKAMAI_WEB_URL = "https://www.xxxx.com/nMRH2/aYJ/PQ4b/32/0peDlm/b9f5NJcXf7tiYE/OE9CMGI1/Nzsn/bCVKCnA" + + def test_captcha_handler_exist(self): + assert "captcha_handler" in Akamai.__dict__.keys() + + def test_aio_captcha_handler_exist(self): + assert "aio_captcha_handler" in Akamai.__dict__.keys() + + def test_wrong_captcha_type(self): + with pytest.raises(ValueError): + Akamai( + api_key=self.get_random_string(36), + captcha_type="test", + ) + + def test_no_captcha_type(self): + with pytest.raises(TypeError): + Akamai(api_key=self.get_random_string(36)) From 78fabe46d367a1d205d9ef0f78d5b2b837e63bed Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:38:32 +0300 Subject: [PATCH 12/13] Update test.yml --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 99ce231..1413cb5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.11"] steps: - uses: actions/checkout@v3 From 21a787ec07fa5b0a70b7a678ce11d34aa87c362b Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 12 Sep 2023 19:53:16 +0300 Subject: [PATCH 13/13] Update test_fun_captcha.py --- tests/test_fun_captcha.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_fun_captcha.py b/tests/test_fun_captcha.py index 016e609..62cfceb 100644 --- a/tests/test_fun_captcha.py +++ b/tests/test_fun_captcha.py @@ -175,7 +175,7 @@ async def test_aio_api_key_err(self): funcaptchaApiJSSubdomain=funcaptchaApiJSSubdomain, ).aio_captcha_handler() assert result.errorId == 1 - assert result.errorCode == "ERROR_KEY_DENIED_ACCESS" + assert result.errorCode in ["ERROR_KEY_DENIED_ACCESS", "ERROR_INVALID_TASK_DATA"] assert not result.solution def test_api_key_err(self): @@ -187,7 +187,7 @@ def test_api_key_err(self): funcaptchaApiJSSubdomain=funcaptchaApiJSSubdomain, ).captcha_handler() assert result.errorId == 1 - assert result.errorCode == "ERROR_KEY_DENIED_ACCESS" + assert result.errorCode in ["ERROR_KEY_DENIED_ACCESS", "ERROR_INVALID_TASK_DATA"] assert not result.solution