From 460e71100d8aa86229c9022ebd4bef6c4a26be35 Mon Sep 17 00:00:00 2001 From: Zhan Date: Wed, 12 Feb 2025 15:42:58 +0300 Subject: [PATCH 1/2] SW-3741 --- whatsapp_api_client_python/API.py | 51 +++++++++++-- whatsapp_api_client_python/tools/partner.py | 80 +++++++++++++++++++++ 2 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 whatsapp_api_client_python/tools/partner.py diff --git a/whatsapp_api_client_python/API.py b/whatsapp_api_client_python/API.py index 62a2612..77cc82d 100644 --- a/whatsapp_api_client_python/API.py +++ b/whatsapp_api_client_python/API.py @@ -16,7 +16,8 @@ receiving, sending, serviceMethods, - webhooks + webhooks, + partner ) @@ -78,18 +79,14 @@ def request( url = url.replace("{{idInstance}}", self.idInstance) url = url.replace("{{apiTokenInstance}}", self.apiTokenInstance) - headers = { - 'User-Agent': 'GREEN-API_SDK_PY/1.0' - } - try: if not files: response = self.session.request( - method=method, url=url, json=payload, timeout=self.host_timeout, headers=headers + method=method, url=url, json=payload, timeout=self.host_timeout ) else: response = self.session.request( - method=method, url=url, data=payload, files=files, timeout=self.media_timeout, headers=headers + method=method, url=url, data=payload, files=files, timeout=self.media_timeout ) except Exception as error: error_message = f"Request was failed with error: {error}." @@ -182,3 +179,43 @@ class GreenAPI(GreenApi): class GreenAPIError(Exception): pass + +class GreenApiPartner(GreenApi): + def __init__( + self, + partnerToken: str, + email: str = None, + debug_mode: bool = False, + raise_errors: bool = False, + host: str = "https://api.green-api.com", + media: str = "https://media.green-api.com", + host_timeout: float = 180, + media_timeout: float = 10800 + ): + + super().__init__( + idInstance="", + apiTokenInstance="", + debug_mode=debug_mode, + raise_errors=raise_errors, + host=host, + media=media, + host_timeout=host_timeout, + media_timeout=media_timeout + ) + + self.partnerToken = partnerToken + self.email = email + self.partner = partner.Partner(self) + + def request( + self, + method: str, + url: str, + payload: Optional[dict] = None, + files: Optional[dict] = None + ) -> GreenAPIResponse: + + url = url.replace("{{partnerToken}}", self.partnerToken) + + return super().request(method, url, payload, files) \ No newline at end of file diff --git a/whatsapp_api_client_python/tools/partner.py b/whatsapp_api_client_python/tools/partner.py new file mode 100644 index 0000000..78b9d6a --- /dev/null +++ b/whatsapp_api_client_python/tools/partner.py @@ -0,0 +1,80 @@ +from typing import Dict, List, Optional, TYPE_CHECKING, Union + +from ..response import Response + +if TYPE_CHECKING: + from ..API import GreenApiPartner + +class Partner: + def __init__(self, api: "GreenApiPartner"): + self.api = api + + def getInstances( + self + ) -> Response: + + request_body = self.__handle_parameters(locals()) + + return self.api.request( + "GET", ( + "{{host}}/partner/" + "getInstances/{{partnerToken}}" + ), request_body + ) ### GOOD + + def createInstance( + self, + name: Optional[str] = None, + webhookUrl: Optional[str] = None, + webhookUrlToken: Optional[str] = None, + delaySendMessagesMilliseconds: Optional[int] = None, + markIncomingMessagesReaded: Optional[str] = None, + markIncomingMessagesReadedOnReply: Optional[str] = None, + outgoingWebhook: Optional[str] = None, + outgoingMessageWebhook: Optional[str] = None, + outgoingAPIMessageWebhook: Optional[str] = None, + stateWebhook: Optional[str] = None, + incomingWebhook: Optional[str] = None, + deviceWebhook: Optional[str] = None, + keepOnlineStatus: Optional[str] = None, + pollMessageWebhook: Optional[str] = None, + incomingBlockWebhook: Optional[str] = None, + incomingCallWebhook: Optional[str] = None, + editedMessageWebhook: Optional[str] = None, + deletedMessageWebhook: Optional[str] = None + ) -> Response: + + request_body = self.__handle_parameters(locals()) + + return self.api.request( + "POST", ( + "{{host}}/partner/" + "createInstance/{{partnerToken}}" + ), request_body + ) ### NOT FINISHED!!!! + + def deleteInstanceAccount( + self, + idInstance: int + ) -> Response: + + request_body = self.__handle_parameters(locals()) + + return self.api.request( + "POST", ( + "{{host}}/partner/" + "deleteInstanceAccount/{{partnerToken}}" + ), request_body + ) ###GOOD + + @classmethod + def __handle_parameters(cls, parameters: dict) -> dict: + handled_parameters = parameters.copy() + + handled_parameters.pop("self") + + for key, value in parameters.items(): + if value is None: + handled_parameters.pop(key) + + return handled_parameters \ No newline at end of file From 1aae5a154369adb9e99109f964c0f006ec643aa8 Mon Sep 17 00:00:00 2001 From: Zhan Date: Wed, 12 Feb 2025 15:50:47 +0300 Subject: [PATCH 2/2] SW-3741 --- whatsapp_api_client_python/tools/partner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/whatsapp_api_client_python/tools/partner.py b/whatsapp_api_client_python/tools/partner.py index 78b9d6a..8e69186 100644 --- a/whatsapp_api_client_python/tools/partner.py +++ b/whatsapp_api_client_python/tools/partner.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, TYPE_CHECKING, Union +from typing import Optional, TYPE_CHECKING from ..response import Response @@ -20,7 +20,7 @@ def getInstances( "{{host}}/partner/" "getInstances/{{partnerToken}}" ), request_body - ) ### GOOD + ) def createInstance( self, @@ -51,7 +51,7 @@ def createInstance( "{{host}}/partner/" "createInstance/{{partnerToken}}" ), request_body - ) ### NOT FINISHED!!!! + ) def deleteInstanceAccount( self, @@ -65,7 +65,7 @@ def deleteInstanceAccount( "{{host}}/partner/" "deleteInstanceAccount/{{partnerToken}}" ), request_body - ) ###GOOD + ) @classmethod def __handle_parameters(cls, parameters: dict) -> dict: