From 9d006b6a78c77df1e22774d0363dd5d865f99fff Mon Sep 17 00:00:00 2001 From: Guy Khmelnitsky Date: Mon, 12 Feb 2024 19:13:33 +0200 Subject: [PATCH] Try to work with token as a bearer --- pyproject.toml | 2 ++ src/const.py | 21 ++++++++++++++++ src/data.py | 22 +++++++++++++++++ src/login.py | 12 +++------ src/main.py | 13 ++++++++-- src/models/customer.py | 55 ++++++++++++++++-------------------------- 6 files changed, 80 insertions(+), 45 deletions(-) create mode 100644 src/const.py create mode 100644 src/data.py diff --git a/pyproject.toml b/pyproject.toml index 780331f..ad68b07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,8 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.11" dynaconf = "3.2.4" +librecaptcha = "0.7.3" +mashumaro = "^3.12" [tool.poetry.dev-dependencies] pytest = "8.0.0" diff --git a/src/const.py b/src/const.py new file mode 100644 index 0000000..224e368 --- /dev/null +++ b/src/const.py @@ -0,0 +1,21 @@ + +HEADERS_NO_AUTH = { + "Content-Type": "application/json; charset=utf-8", + "X-Iec-Idt": "1", + "X-Iec-Webview": "1", + "accept": "application/json, text/plain, */*", + "origin": "https://www.iec.co.il", + "authority": "iecapi.iec.co.il", + "referer": "https://www.iec.co.il/", + "Dnt": "1", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Recaptchtoken": "03AFcWeA5xe43I00jSCrH-aX7wMuQb6WRW2xevCwVO11LLqPWBuwsn0FeIv_LcQ" + "-2lCIJuKckwJaLfMQ_JXyQR4jRLpS9ebXASA8l16w319BDh9HNUOZ50UC6dp7n9iaqZhNgfCJNu4qDWHGNQaLT5xF" + "-dNQRQyNbycDswmXa9-LnfMU5bMnXABM99S7-3" + "-1VsJXlXJPass7lvybsAzggAMpODUm5FqHjWDZhQxiG7Q6PpbA1RZaj_s6wfwaN5_n5lujhLbPy12giJSMC8FglinwLFtPIYYhvOb5lwrnNk_hpdCzitwLW8aNfSMcwV74ZQZsW4hbtFu7aVtEeDoZJ3Q4Wr9kj_XhW0X5HRYGqj5P7QbZlu1_LNDBkv4Yxk43WcA-rB9Ms4M0cpCDyPvagHRvtNXyPytqtPo8UP3OI64ztFLCG-EJ1LWSiErwAnSNrpiYuOGDAl9XBImp5JhZPfOTvhg4iA4UFd3MSFDF9ddlOWeWPJfmOuGOyMUnEyn67KY84GCWbQOZBJrGO5dTqaBqxojyKC7iVkX-5EivLhXQVmFRsoe6GxgI5nnLKfl_deRTfmoGxSrlWTUBsUzfEmGbqIqQAw_9kFakyNbS9xugsZPfy8S8hZ7o8" +} + +HEADERS_WITH_AUTH = HEADERS_NO_AUTH.copy() # Make a copy of the original dictionary +HEADERS_WITH_AUTH["Authorization"] = "YourAuthorizationTokenHere" + +GET_CONSUMER_URL = "https://iecapi.iec.co.il/api/Consumer" \ No newline at end of file diff --git a/src/data.py b/src/data.py new file mode 100644 index 0000000..59631c3 --- /dev/null +++ b/src/data.py @@ -0,0 +1,22 @@ +import requests + +from src.login import IECLoginError +from src.models.customer import Customer +from src.const import GET_CONSUMER_URL, HEADERS_WITH_AUTH +from src.models.response_descriptor import ErrorResponseDescriptor + + +def get_consumer() -> Customer: + """Get consumer data response from IEC API.""" + # sending get request and saving the response as response object + response = requests.get(url=GET_CONSUMER_URL, headers=HEADERS_WITH_AUTH, timeout=10) + + if response.status_code != 200: + print(f"Failed Login: (Code {response.status_code}): {response.reason}") + if len(response.content) > 0: + login_error_response = ErrorResponseDescriptor.from_dict(response.json()) + raise IECLoginError(login_error_response.code, login_error_response.error) + else: + raise IECLoginError(response.status_code, response.reason) + + return Customer.from_dict(response.json()) diff --git a/src/login.py b/src/login.py index 8e4d21c..c7939f0 100644 --- a/src/login.py +++ b/src/login.py @@ -1,23 +1,17 @@ """ IEC Login Module. """ import requests +from librecaptcha import librecaptcha from src.models.login_flow import LoginResponse, OTPRequest, OTPResponse from src.models.response_descriptor import ErrorResponseDescriptor _SMS_URL = "https://iecapi.iec.co.il//api/Authentication/{}/1/-1" _LOGIN_URL = "https://iecapi.iec.co.il//api/Authentication/login/{}" -_HEADERS = { - "Content-Type": "application/json", - "accept": "application/json, text/plain, */*", - "origin": "https://www.iec.co.il", - "authority": "iecapi.iec.co.il", - "referer": "https://www.iec.co.il/", - "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/114.0.0.0 Safari/537.36", -} def get_login_response(id_number: str) -> LoginResponse: + + recaptcha_token = librecaptcha.get_token(api_key="", site_url="https://iecapi.iec.co.il//api/content/he-IL/login", ) """Get first login response from IEC API.""" # sending get request and saving the response as response object response = requests.get(url=_SMS_URL.format(id_number), headers=_HEADERS, timeout=10) diff --git a/src/main.py b/src/main.py index fa06a03..9ecdccc 100755 --- a/src/main.py +++ b/src/main.py @@ -2,15 +2,24 @@ from logging import getLogger from logging.config import fileConfig as logConfig +from src.const import HEADERS_WITH_AUTH +from src.data import get_consumer -from src.login import IECLoginError, get_authorization_token +from src.login import IECLoginError logConfig("./logging.conf", disable_existing_loggers=False) logger = getLogger(__name__) if __name__ == "__main__": # pragma: no cover try: - token = get_authorization_token() + # token = get_authorization_token() + token = input("Input bearer token:") print(f"Token: {token}") + HEADERS_WITH_AUTH["Authorization"] = "Bearer " + token + print(HEADERS_WITH_AUTH) + + consumer = get_consumer() + print(f"Consumer: {consumer}") + except IECLoginError as err: logger.error("Failed Login: (Code %d): %s", err.code, err.error) diff --git a/src/models/customer.py b/src/models/customer.py index 0d345c1..2b97f26 100644 --- a/src/models/customer.py +++ b/src/models/customer.py @@ -33,43 +33,30 @@ from dataclasses import dataclass, field from mashumaro import DataClassDictMixin, field_options -from response_descriptor import ResponseDescriptor @dataclass -class Contract(DataClassDictMixin): - address: str - contract_id: str = field(metadata=field_options(alias="contractId")) - due_date: str = field(metadata=field_options(alias="dueDate")) - total_debt: float = field(metadata=field_options(alias="totalDebt")) - frequency: int - status: int - from_pativte_producer: bool = field( - metadata=field_options(alias="fromPativteProducer") - ) - city_code: str = field(metadata=field_options(alias="cityCode")) - city_name: str = field(metadata=field_options(alias="cityName")) - street_code: str = field(metadata=field_options(alias="streetCode")) - street_name: str = field(metadata=field_options(alias="streetName")) - house_number: str = field(metadata=field_options(alias="houseNumber")) - debt_for_invoices_due_date_not_passed: float = field( - metadata=field_options(alias="debtForInvoicesDueDateNotPassed") - ) - is_touz: bool = field(metadata=field_options(alias="isTouz")) - smart_meter: bool = field(metadata=field_options(alias="smartMeter")) - producer_type: int = field(metadata=field_options(alias="producerType")) +class Account(DataClassDictMixin): + main_contract_id: str = field(metadata=field_options(alias="mainContractId")) + main_contract_id_type: int = field(metadata=field_options(alias="mainContractIdType")) + company_id: str = field(metadata=field_options(alias="companyId")) + name: str + last_name: str = field(metadata=field_options(alias="lastName")) + bp_number: str = field(metadata=field_options(alias="bpNumber")) + bp_type: int = field(metadata=field_options(alias="bpType")) + is_active_account: bool = field(metadata=field_options(alias="isActiveAccount")) + customer_role: int = field(metadata=field_options(alias="customerRole")) + account_type: int = field(metadata=field_options(alias="accountType")) @dataclass -class Contracts(DataClassDictMixin): - contracts: list[Contract] - contract_amount: int - total_to_pay: float - - -@dataclass -class GetContractResponse(DataClassDictMixin): - data: Contracts - response_descriptor: ResponseDescriptor = field( - metadata=field_options(alias="responseDescriptor") - ) +class Customer(DataClassDictMixin): + bp_number: str = field(metadata=field_options(alias="bpNumber")) + id_type: int = field(metadata=field_options(alias="idType")) + accounts: list[Account] + customer_status: int = field(metadata=field_options(alias="customerStatus")) + id_number: str = field(metadata=field_options(alias="idNumber")) + first_name: str = field(metadata=field_options(alias="firstname")) + last_name: str = field(metadata=field_options(alias="lastName")) + mobile_phone: str = field(metadata=field_options(alias="mobilePhone")) + email: str \ No newline at end of file