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..8e69186 --- /dev/null +++ b/whatsapp_api_client_python/tools/partner.py @@ -0,0 +1,80 @@ +from typing import Optional, TYPE_CHECKING + +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 + ) + + 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 + ) + + def deleteInstanceAccount( + self, + idInstance: int + ) -> Response: + + request_body = self.__handle_parameters(locals()) + + return self.api.request( + "POST", ( + "{{host}}/partner/" + "deleteInstanceAccount/{{partnerToken}}" + ), request_body + ) + + @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